Iterative Solution

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Iterative Solution

Thomas D. Dean-2
I was watching a machinist make a part.  The portion of the part I was
interested in consisted of a circle and a line.  The machinist wanted to
locate a tool such that it was tangent to the line and the circle.

I used an iterative method to calculate the location of the center of
the tool circle.  This took 71 iterations.  Must be a better method.

Tom Dean

## given a circle, C1,
##     center (3+1/2)/2, (3+1/2)/2+1+1/4, radius (3+1/2)/2
## and a line, L1,
##     x=(3+1/2)/2 - (3/4+20/1000)/2 - 1/2,
## find a circle, CT1, of radius 1/8 such that it is tangent to both
## L1 and C1.  CT1 is outside C1 and between L1 and the origin.

## The x value of center(CT1) is
##      (3+1/2)/2 - (3/4+20/1000)/2 - 1/2 - 1/8.

## The y value of center(CT1) is that value that results in the
## distance from center(C1) to center(CT1) is equal to
##      radius(C1) + radius(CT1)
## Start with y = 0 and increase y until
##    d = distance( center(C1) - center(CT1) )
##      = sqrt( ((3+1/2)/2 - 1/8)^2 + ((3+1/2)/2+1+1/4 - x_value)^2)
##    d - ( (3+1/2)/2 + 1/8 ) = 0

function [x1, y1] = find_loc()
   x0 = (3+1/2)/2; y0 = (3+1/2)/2+1+1/4; r0 = (3+1/2)/2;
   x1 = (3+1/2)/2 - (3/4+20/1000)/2 - 1/2 - 1/8; y1 = 0; r1 = 1/8;
   ## maple answer y1 == 1.420276923
   dy = 1;
   d = sqrt( (x0 - x1)^2 + (y0 - y1)^2);
   err = d - (r0 + r1);
   s = sign(err);

   iters = 1;

   while (abs(err) > 1e-15)
     if (sign(err) == s);
       y1 += s*dy;
     else
       s = sign(err);
       dy /= 10;
       y1 += s*dy;
     endif
     d = sqrt( (x0 - x1)^2 + (y0 - y1)^2);
     err = d - (r0 + r1);
     iters++;
   endwhile

   printf("iterations %d\n", iters);

endfunction;


Reply | Threaded
Open this post in threaded view
|

Fwd: Iterative Solution

Ian McCallion
should have copied help-octave
---------- Forwarded message ---------
From: Ian McCallion <[hidden email]>
Date: Tue, 28 Aug 2018 at 09:05
Subject: Re: Iterative Solution
To: <[hidden email]>


This is simple geometry. Take the line between the centres at the
desired point of the tool. Starting with this line as the hypotenuse
complete a right-angled triangle using horizontal and vertical lines.
Apply Pythagoras theorem.

## given a circle, C1,
##     center (3+1/2)/2, (3+1/2)/2+1+1/4, radius (3+1/2)/2
## and a line, L1,
##     x=(3+1/2)/2 - (3/4+20/1000)/2 - 1/2,
## find a circle, CT1, of radius 1/8 such that it is tangent to both
## L1 and C1.  CT1 is outside C1 and between L1 and the origin.

## The x value of center(CT1) is
##      (3+1/2)/2 - (3/4+20/1000)/2 - 1/2 - 1/8.

## The y value of center(CT1) is that value that results in the
## distance from center(C1) to center(CT1) is equal to
##      radius(C1) + radius(CT1)
## Start with y = 0 and increase y until
##    d = distance( center(C1) - center(CT1) )
##      = sqrt( ((3+1/2)/2 - 1/8)^2 + ((3+1/2)/2+1+1/4 - x_value)^2)
##    d - ( (3+1/2)/2 + 1/8 ) = 0

function [y1] = dean()
   x0 = (3+1/2)/2
   y0 = (3+1/2)/2+1+1/4
   r0 = (3+1/2)/2
   x1 = (3+1/2)/2 - (3/4+20/1000)/2 - 1/2 - 1/8
   y1 = 0
   r1 = 1/8

   hyplen=1.75+.125
   sidexlen=1.75-.74
   sideylen=sqrt(hyplen^2-sidexlen^2)
   y1=y0-sideylen
   ## maple answer y1 == 1.420276923
endfunction;

Cheers... Ian
On Tue, 28 Aug 2018 at 07:18, Thomas D. Dean <[hidden email]> wrote:

>
> I was watching a machinist make a part.  The portion of the part I was
> interested in consisted of a circle and a line.  The machinist wanted to
> locate a tool such that it was tangent to the line and the circle.
>
> I used an iterative method to calculate the location of the center of
> the tool circle.  This took 71 iterations.  Must be a better method.
>
> Tom Dean
>
> ## given a circle, C1,
> ##     center (3+1/2)/2, (3+1/2)/2+1+1/4, radius (3+1/2)/2
> ## and a line, L1,
> ##     x=(3+1/2)/2 - (3/4+20/1000)/2 - 1/2,
> ## find a circle, CT1, of radius 1/8 such that it is tangent to both
> ## L1 and C1.  CT1 is outside C1 and between L1 and the origin.
>
> ## The x value of center(CT1) is
> ##      (3+1/2)/2 - (3/4+20/1000)/2 - 1/2 - 1/8.
>
> ## The y value of center(CT1) is that value that results in the
> ## distance from center(C1) to center(CT1) is equal to
> ##      radius(C1) + radius(CT1)
> ## Start with y = 0 and increase y until
> ##    d = distance( center(C1) - center(CT1) )
> ##      = sqrt( ((3+1/2)/2 - 1/8)^2 + ((3+1/2)/2+1+1/4 - x_value)^2)
> ##    d - ( (3+1/2)/2 + 1/8 ) = 0
>
> function [x1, y1] = find_loc()
>    x0 = (3+1/2)/2; y0 = (3+1/2)/2+1+1/4; r0 = (3+1/2)/2;
>    x1 = (3+1/2)/2 - (3/4+20/1000)/2 - 1/2 - 1/8; y1 = 0; r1 = 1/8;
>    ## maple answer y1 == 1.420276923
>    dy = 1;
>    d = sqrt( (x0 - x1)^2 + (y0 - y1)^2);
>    err = d - (r0 + r1);
>    s = sign(err);
>
>    iters = 1;
>
>    while (abs(err) > 1e-15)
>      if (sign(err) == s);
>        y1 += s*dy;
>      else
>        s = sign(err);
>        dy /= 10;
>        y1 += s*dy;
>      endif
>      d = sqrt( (x0 - x1)^2 + (y0 - y1)^2);
>      err = d - (r0 + r1);
>      iters++;
>    endwhile
>
>    printf("iterations %d\n", iters);
>
> endfunction;
>
>


Reply | Threaded
Open this post in threaded view
|

Re: Fwd: Iterative Solution

Thomas D. Dean-2
On 08/28/18 01:07, Ian McCallion wrote:

> This is simple geometry. Take the line between the centres at the
> desired point of the tool. Starting with this line as the hypotenuse
> complete a right-angled triangle using horizontal and vertical lines.
> Apply Pythagoras theorem.
>

A simple problem elegantly explained.

I looked at this for a long time.  Following the machinists path, I
never saw the obvious.

Thank you
Tom Dean