algorithm équation La meilleure façon de trouver un point sur un cercle le plus proche d'un point donné




position d'un point sur un cercle (7)

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).

É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.


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.


je ferais une ligne du centre au point, et calc où ce graphique traverse le cercle oO je ne pense pas si difficile


Trig fonctions, multiplier par r, et ajouter pX ou pY selon le cas.


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).


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).


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.







geometry