algorithm - équation - position d'un point sur un cercle




La meilleure façon de trouver un point sur un cercle le plus proche d'un point donné (6)

Résolvez-le d'abord mathématiquement, puis traduisez en code. Rappelez-vous que la ligne la plus courte entre un point et le bord d'un cercle passera également par son centre (comme indiqué par @litb).

Étant donné un point (pX, pY) et un cercle avec un centre connu (cX, cY) et un rayon (r), quelle est la plus petite quantité de code que vous pouvez trouver pour trouver le point le plus proche de (pX, pY)?

J'ai un peu de code de travail mais cela implique de convertir le cercle en une équation de la forme (x - cX) ^ 2 + (y - cY) ^ 2 = r ^ 2 (où r est rayon) et en utilisant l'équation de la ligne du point (pX, pY) à (cX, cY) pour créer une équation quadratique à résoudre.

Une fois que j'aurai aplatir les insectes, ça ira, mais cela semble une solution tellement inélégante.


Traitez le centre de la circulaire comme votre origine, convertissez les coordonnées de (pX, pY) en coordonnées polaires, (theta, r ') remplacez r' par le r du cercle d'origine et convertissez-le en coordonnées cartésiennes ( et ajustez pour l'origine).


Un moyen facile d'y penser en termes d'image, et facile à transformer en code: Prenez le vecteur (pX - cX, pY - cY) du centre au point. Diviser par sa longueur sqrt (bla bla bla), multiplier par rayon. Ajoutez ceci à (cX, cY).


Vous avez demandé le code le plus court, alors c'est ici. En quatre lignes, cela peut être fait, bien qu'il y ait encore un quadratique. J'ai considéré que le point était en dehors du cercle. Je n'ai pas considéré ce qui se passe si le point est directement au-dessus ou au-dessous du centre du cercle, c'est-à-dire cX = pX.

m=(cY-pY)/(cX-pX);  //slope
b=cY-m*cX;  //or Py-m*Px.  Now you have a line in the form y=m*x+b
X=(  (2mcY)*((-2*m*cY)^2-4*(cY^2+cX^2-b^2-2*b*cY-r^2)*(-1-m^2))^(1/2)  )/(2*(cY^2+cX^2-b^2-2*bc*Y-r^2));
Y=mX+b;

1] Obtenir une équation pour une ligne reliant le point et le centre du cercle.

2] Déplacez le long de la ligne à une distance d'un rayon du centre pour trouver le point sur le cercle. C'est-à-dire: rayon = a ^ 2 + b ^ 2 qui est: r = ((cY-Y) + (cX-X)) ^ (1/2)

3] Résoudre quadratiquement. X = résolution quadratique (r = ((cY-Y) + (cX-X)) ^ (1/2), X) qui si vous remplacez par Y = m * X + b vous obtenez cet enfer ci-dessus.

4] X et Y sont vos résultats sur le cercle.

Je suis plutôt certain d'avoir fait une erreur quelque part, s'il vous plaît laissez un commentaire si quelqu'un trouve quelque chose. Bien sûr, il est dégénéré, une réponse est la plus éloignée de votre point de vue et l'autre est la plus proche.


où P est le point, C est le centre, et R est le rayon, dans un langage "mathy" approprié:

V = (P - C); Answer = C + V / |V| * R;

où | V | est la longueur de V.

OK OK

double vX = pX - cX;
double vY = pY - cY;
double magV = sqrt(vX*vX + vY*vY);
double aX = cX + vX / magV * R;
double aY = cY + vY / magV * R;

facile à étendre à> 2 dimensions.


  1. Le point de distance le plus court se trouve à l'intersection de la circonférence et de la ligne passant par le centre et le point d'entrée. Au centre également, les points d'entrée et de sortie se trouvent sur une ligne droite

  2. que le centre soit (xc, yc) et le point le plus court de l'entrée (xi, yi) soit (x, y) alors sqrt ((xc-x) ^ 2 + (yc-y) ^ 2) = r

  3. Puisque le centre, les points d'entrée et de sortie se trouvent sur une ligne droite, la pente calculée entre l'un de ces deux points devrait être la même.

(yc-yi) / (xc-xi) = (y-yc) / (x-xc)

4. résoudre les équations 2 et 3 devrait nous donner le point le plus court.





geometry