Login  Register

Re: Perpendicular line selection

Posted by Justin McGrath-2 on Feb 02, 2009; 12:32am
URL: http://imagej.273.s1.nabble.com/Perpendicular-line-selection-tp3693873p3693875.html

This will make the line a right angle, but the second segment will be
variable in length.

   xa[xa.length-1]=xa[xa.length-1]+15*(1/(dx/d)); // Here you had the
sign reversed and dy instead of dx
   ya[xa.length-1]=ya[xa.length-1]+15*(-1/(dy/d));

Justin

On Sun, Feb 1, 2009 at 2:22 PM, Jerome Mutterer
<[hidden email]> wrote:

> Hi Gabriel,
> The following Tool macro lets you draw L shapes. I adapted it from the
> TiltedRectangleTool macro.
> Sincerely,
>
> Jerome
>
> // L-shape Tool
> //
> // This macro tool draws a L-shape.
> // Click and drag the mouse to set the first segment.
> // After the mouse button is released, drag to set the second segment.
> // Click to finish.
>  macro "Tilted Rectangle Tool -C000L1991L91e6" {
>    run("Line Width...", "line=1");
>    getPixelSize(unit, pixelWidth, pixelHeight);
>    getCursorLoc(x, y, z, flags);
>    xstart = x; ystart = y;
>    x2=x; y2=y;
>    while (flags!=0) {
>       getCursorLoc(x, y, z, flags);
>       if (x!=x2 || y!=y2)
>          makeLine(xstart, ystart, x, y);
>          x2=x; y2=y;
>          wait(10);
>       }
>       if (x!=xstart || y!=ystart) {
>          drawLshape(xstart, ystart, x, y);
>    }
>  }
>
>  function drawLshape(x1, y1, x2, y2) {
>    a = atan ((x2-x1)/(y2-y1));
>  x3=0;y3=0;
>    while (flags==0) {
>       getCursorLoc(x, y, z, flags);
>       if (x!=x3 || y!=y3) {
>       sign=1;
>       if (x2>x) sign=-1;
>          w=sqrt ((x2-x)*(x2-x)+(y2-y)*(y2-y));
>          wsa = sign*w*sin((PI/2)+a);
>          wca = sign*w*cos((PI/2)+a);
>          makeLine( x1,y1,x2,y2,x2 + wsa,y2 + wca);
>          x3=x;y3=y;
>          wait(10);
>       }
>    }
>  }
>
> // end
>
>
> On Sun, Feb 1, 2009 at 8:10 PM, Gabriel Landini <[hidden email]>wrote:
>
>> Hi,
>> I have been trying to create an "L" shaped line selection, so one clicks
>> and
>> while dragging the selection is a line (from the originally clicked point
>> to
>> the current cursor position, just like a normal line selection), but with a
>> perpendicular short line at the end of it.
>> The macro below makes the line OK, but I cannot get the small perpendicular
>> segment working.
>> 2 lines are perpendicular if the product of their slopes is -1, but I am
>> obviously missing something very badly as the snippet below does not work.
>> Two lines near the end of the function phi (with comments) are the culprit.
>>
>> Note: if you run the macro, it should be stoppable with the escape key, but
>> for some reason sometimes it does not under linux, so please do not run
>> this
>> while you have some important stuff in other IJ windows just in case.
>>
>> Can anybody give any clues?
>>
>> Many thanks in advance
>>
>> Gabriel
>> ------
>> id=getImageID;
>> run("Select None");
>> w = getWidth;
>> h = getHeight;
>> while (true){
>>    getCursorLoc(x, y, z, flags);
>>    xstart = x;
>>    ystart = y;
>>    x2=x;
>>    y2=y;
>>    while (flags&16 !=0) {
>>        getCursorLoc(x, y, z, flags);
>>        if (x!=x2 || y!=y2) phi(xstart, ystart, x, y);
>>        x2=x;
>>        y2=y;
>>        wait(10);
>>    }
>> }
>> print ("Done!");
>>
>> function phi(x0,y0,x1,y1) {
>>    d = sqrt((y1-y0)*(y1-y0)+(x1-x0)*(x1-x0));
>>    xa = newArray(floor(d) +1);
>>    ya = newArray(xa.length);
>>    dx=x1-x0;
>>    dy=y1-y0;
>>
>>    for (i=0;i<xa.length;i++) {
>>        xa[i]=x0+i*dx/d;
>>        ya[i]=y0+i*dy/d;
>>    }
>>    xa[xa.length-1]=xa[xa.length-1]+15*(-1/(dy/d)); // here is one error
>>    ya[xa.length-1]=ya[xa.length-1]+15*(-1/(dy/d)); // here is the other
>>    makeSelection("freeline",xa,ya);
>> }
>> -----
>>
>