10
$\begingroup$

Alright, I am programming a plugin for a game that requires me to get the closest point on a circle when all you have is a point B, which is outside of the circle, the radius of the circle, and the location of the center of the circle.

Say I have this situation: diagram

So, how would I be able to get the coordinates of point C? I need a formula that allows me to calculate those coordinates when I only know the radius of the circle and the coordinates of B. I sketched the line for ease of understanding, but all I start with is just the circle and point B. OH, one other thing, B isn't a static point, each time this calculation will be executed B will be at another position.

And, as a bonus (not really needed) would you care to show an example on how to do the same thing, but then when point B is inside the circle.

Thanks in advance!

  • 0
    That is useful to me too. But what if instead of a circle, it is an ellipse?2012-05-18
  • 0
    You should post this as a separate question, so that people can post answers to it using the answer box. I think you are going to have to solve a system of 2 quadratic equations: one is your equation of the ellipse $ax^2+by^2=1$, the other is $by(x-p)-ax(y-q)=0$ where $(p,q)$ is the point outside of ellipse. The second equation expresses the orthogonality of the vector $\langle x-p,y-q \rangle$ to the ellipse. The case of the circle is much easier because when $a=b$, the second equation is linear.2012-05-18
  • 0
    This can be "reduced" to solving a quartic equation. Note that there can be two local minima and two local maxima.2012-05-18
  • 0
    **Note** The two prior comments (of LK and RI) apply to Brad's comment (which was migrated from an answer).2012-05-18

1 Answers 1

12

$$ \vec C = \vec A + r\frac{(\vec B - \vec A)}{||\vec B - \vec A||} $$ Where $r$ is the radius of the circle. Works for points both inside and outside the circle. Imagine $(\vec B - \vec A)$ to be a vector in the direction of $\vec B$ and $\frac{(\vec B - \vec A)}{||\vec B - \vec A||}$ thus is the same vector but with a length of $1$. By multiplying it with $r$, you "walk in that direction" a total distance of $r$, thus reaching the circle.

With coordinats $\vec A = (A_x, A_y)$ etc. this reads $$ C_x = A_x + r\frac{B_x-A_x}{\sqrt{(B_x-A_x)^2+(B_y-A_y)^2}} $$ $$ C_y = A_y + r\frac{B_y-A_y}{\sqrt{(B_x-A_x)^2+(B_y-A_y)^2}} $$

  • 0
    Thank you very much for your answer. Just how do I make it so that I can get the coordinates of C with this? I know I need to adjust the formula but I really fail at doing that. Thanks!2012-04-03
  • 0
    @Quincy: This will get you the point on the circle. I assumed that is what you wanted? (using the letters $A$, $B$ and $C$ as they appear in your plot)2012-04-03
  • 0
    Ehm, I'm confused, the formula you posted says B=, I could be wrong but doesn't that mean that it simply outputs B? I need C, the intersection of the line AB with the edge of the circle. So point C is completely unknown. If I am asking something really stupid I'm sorry but we're just starting on this subject on school, and currently we are only doing the unity circle so yeah :). Thanks again!2012-04-03
  • 0
    @Quincy: Don't worry, no question is every stupid ;) The fault is on my part. The formula is correct, but I used $\vec A$ as the center of the circle, $\vec C$ as the point outside and $\vec B$ as the point on the circle. Will change it to use your names for the points.2012-04-03
  • 0
    Ah thank you very much! I'll try the formula now and report back if it works!2012-04-03
  • 0
    You are the best, it works better than ever! Finally after a week of searching the web I have my answer. Thanks again!2012-04-03