Defining the quadrant of an angle within the equation

Jan 2014
6
0
Somerset
So I have to scale down a triangle in space to have a preset hypotinuse (i.e. shrinking a line and keeping the angle).
initially I came up with (see case1.bmp).
but this only allows for triangles in northwest. so I came up with (see case2b.bmp) to output the point on bothe sides.
I have now hit the problem of if the moving point (Mx,My) has the same x value as the start point (Sx,Sy) then my method for picking the side becomes 0/0 which throws up errors everywhere.
Anyone have an alternative method of doing this or have an equation that if a<b=-1 and if a>b=1? (I don't care what happens when a=b (0/0) because cos(Theta) will be 0 anyway.)
 

Attachments

Dec 2012
1,145
502
Athens, OH, USA
Hi,
The attachment answers your problem. It shows the 4 possible locations of your angle theta, but the method indicated works regardless of the location of point M with respect to point S (the two points must be different).

MHFgeometry59.png
 
Jan 2014
6
0
Somerset
Hi,
The attachment answers your problem. It shows the 4 possible locations of your angle theta, but the method indicated works regardless of the location of point M with respect to point S (the two points must be different).

View attachment 30020
that still has an if statement though.
maybe I am looking at this wrong.
What about determining the line Y=M*X+C that crosses (Mx,My) and (Sx,Sy) and calculating point P on that line?
 
Dec 2012
1,145
502
Athens, OH, USA
Hi again,
I assumed that your question was a programming problem in my previous response. Here is Java code implementing what I said earlier:

Code:
  /* standardAngle computes and returns the angle from 0 to 2*pi of the 
     vector from (cx,cy) to (x1,y1).  However if the two points are the 
     same, a return of 0.
  */
  private double standardAngle(double x1, double y1, double cx, double cy) {
    double x, y, v, d;
    x = x1 - cx;
    y = y1 - cy;
    d = Math.sqrt(x * x + y * y);
    if (d == 0) {
      return (-1);
    }
    v = Math.acos(x / d);
    if (y < 0) {
      v = 2 * Math.PI - v;
    }
    return (v);
  }

  // assuming the variables are defined:
  double theta = standardAngle(mx, my, sx, sy);
  it (theta != -1) {
    px = sx + r * Math.cos(theta);
    py = sy + r * Math.sin(theta);
  }
  else {
    // some default action for the two points the same
  }
Now as far as using the line from (sx,sy) to (mx,my) to intersect with the circle to find the desired point, yes, you can do it this way:

First handle the case where sx=mx (vertical line).

Otherwise, \(\displaystyle m={my-sy\over mx-sx},\,\, d=-m(sx)+sy\)

Next substitute into the equation of the circle \(\displaystyle (x-sx)^2+(y-sy)^2=r^2\)

to get the quadratic equation: \(\displaystyle (m^2+1)x^2+(-2sx+2m(d-sy))x+(sx)^2+(d-sy)^2-r^2=0\)

Use the quadratic formula to solve this last equation. By the nature of the problem, there will be two solutions, say x1 and x2. You can decide which is the desired value by:
if ((x1-sx)*(mx-sx) is positive)
px = x1 is the correct x value
else
px = x2 is the correct x value.
Once the correct x value is found, use the line equation to find the y value.

If you encode all of the above, you'll probably get at least as much code as what I gave at the beginning. One possible advantage of this approach is that no transcendental function calls are made. However, I have found the standardAngle function useful in other contexts.
 
Dec 2012
1,145
502
Athens, OH, USA
Hi again,
It occurred to me that you might know about the parametric equation of a line. If you do, then the attachment shows yet a further solution to your problem:

MHFgeometry61.png
 
Jan 2014
6
0
Somerset
Hi again,
It occurred to me that you might know about the parametric equation of a line. If you do, then the attachment shows yet a further solution to your problem:

View attachment 30035
Thanks I will try that.
this is not a programing problem but it is a problem I have to solve repeatedly so I am trying to set up a single equation in MathCAD where I can just change the inputs of Mx and My and take the outputs of Px and Py without having to check if Mx is greater than Sx etc