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!

  • $\begingroup$ That is useful to me too. But what if instead of a circle, it is an ellipse? $\endgroup$
    – user31689
    May 18 '12 at 16:55
  • $\begingroup$ 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. $\endgroup$
    – user31373
    May 18 '12 at 17:09
  • $\begingroup$ This can be "reduced" to solving a quartic equation. Note that there can be two local minima and two local maxima. $\endgroup$ May 18 '12 at 17:16
  • $\begingroup$ Note The two prior comments (of LK and RI) apply to Brad's comment (which was migrated from an answer). $\endgroup$ May 18 '12 at 17:30

$$ \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}} $$

  • $\begingroup$ 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! $\endgroup$ Apr 3 '12 at 13:56
  • $\begingroup$ @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) $\endgroup$
    – example
    Apr 3 '12 at 14:03
  • $\begingroup$ 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! $\endgroup$ Apr 3 '12 at 14:07
  • 1
    $\begingroup$ @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. $\endgroup$
    – example
    Apr 3 '12 at 14:12
  • 1
    $\begingroup$ You are the best, it works better than ever! Finally after a week of searching the web I have my answer. Thanks again! $\endgroup$ Apr 3 '12 at 14:40

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.