|
|
- //Smooth Wand version 1d
- //N.Vischer
- //01.07.17 20:20
-
- var count, polyX, polyY
-
- getSelectionBounds(x, y, w, h);
- if (w<2 || h<2)
- exit("Width and height must be > 1 px");
- if (selectionType != 4)
- exit("No traced selection found");
- getThreshold(lowThr, hiThr);
- getSelectionCoordinates(xx, yy);
- len = xx.length;
- polyX = newArray(len);
- polyY = newArray(len);
- count = 0;
- for(jj = 0; jj < len; jj++) {
- x1 = xx[jj];
- y1 = yy[jj];
- x2 = xx[(jj+1)%len];
- y2 = yy[(jj+1)%len];
- dd = 1;
- if (y1 == y2) {//horizontal separator
- if (x1 > x2) dd = -1;
- for(x = x1; x != x2; x+= dd){
- processPixelPair(x, y1, x+dd, y1);
- }
- }
- else {//vertical separator
- if (y1 > y2) dd = -1;
- for(y = y1; y != y2; y+= dd){
- processPixelPair(x1, y, x1, y+dd);
- }
- }
- }
- polyX = Array.trim(polyX, count);
- polyY = Array.trim(polyY, count);
- makeSelection("polygon", polyX, polyY);
- run("Interpolate", "interval=1 adjust"); //after button released
-
- //processes neighbors of this separator line and adds vertex
- function processPixelPair(x1, y1, x2, y2) {
- if (x1 == x2) {
- val1 = getPixel(x1, minOf(y1, y2));
- val2 = getPixel(x1 - 1, minOf(y1, y2));
- }
- if (y1 == y2){
- val1 = getPixel(minOf(x1, x2), y1);
- val2 = getPixel(minOf(x1, x2), y1 -1);
- }
- bright = maxOf(val1, val2);
- dark = minOf(val1, val2);
-
- if (bright>=lowThr && dark<=lowThr)
- thr = lowThr;
- if (bright>=hiThr && dark<=hiThr)
- thr = hiThr;
- if (dark==bright)
- fraction = 0.5;
- else
- fraction = (thr - dark)/(bright - dark);
- if (val1 < val2)
- fraction = 1 - fraction;
- if (y1 == y2) {
- newY = minOf(y1, y2) + fraction - 0.5;
- newX = (x1 + x2)/2;
- }
- if (x1 == x2) {
- newX = minOf(x1, x2) + fraction - 0.5;
- newY = (y1 + y2)/2;
- }
- polyX[count] = newX;
- polyY[count] = newY;
- count++;
- if (count == polyX.length){
- polyX = Array.concat(polyX, polyX);
- polyY = Array.concat(polyY, polyY);
- }
- }
|