2010-11-05 42 views
9

J'ai passé tellement d'heures là-dessus que je peux sentir ma santé mentale glisser lentement. Donc, toute aide serait vraiment appréciée. Je vais essayer d'être aussi succincte que possible.Comment calculer (x, y) pour une longueur d'arc fixe à partir d'un point sur une circonférence

J'ai un cercle sur un plan 2D. Je connais les coordonnées cartésiennes pour son point central (C) et son rayon (R).

Ma confusion provient de ce problème. Lorsqu'il est muni d'un point sur le plan extérieur au cercle; Je peux calculer le point (P) sur la circonférence du cercle le plus proche de ce point.

Ce que je veux faire est de déterminer les coordonnées (x, y) de 2 points sur la circonférence. Appelons-les P1 et P2. P1 et P2 sont deux extrémités d'un arc. L'arc est d'une longueur fixe (X). P est le point médian entre P1 et P2. En tant que tel, la longueur d'arc de P à P1 & P à P2 sont toutes deux X/2.

En résumé: étant donné C, R, P, X; J'ai besoin de calculer P1 et P2.

J'essaye de coder ceci en C++ mais n'importe quelles suggestions ou pseudo-code seraient grands.

EDIT: X est une longueur d'arc, pas une ligne droite entre P1 et P2

+19

Que diriez-vous de certains des exemples de ce qui suit: http://www.codeproject.com/KB/recipes/Wykobi.aspx Ils sont très efficaces et quelque peu élégants, cherchez "Point le plus proche sur un cercle de points externes" et "Segment de cercle tangent en cercle" –

Répondre

4

Sur un cercle, un angle theta correspond à une longueur d'arc de theta * R, ce qui signifie votre arc sous-tendre un angle de theta = X/R. Donc, si commencer par votre point

P = C + R * (sin(u), cos(u)) 

puis juste monter/par theta/2:

P1 = C + R * (sin(u + theta/2), cos(u + theta/2)) 

et

P2 = C + R * (sin(u - theta/2), cos(u - theta/2)) 
3

Un arc qui forme un angle de θ (en radians) a une longueur d'arc de θR. Donc, vous voulez un demi-angle de θ = X/(2R). Vous devez ensuite prendre le vecteur (P -C), le faire tourner de ± θ et rajouter C pour obtenir P1 et P2. Pour faire pivoter un vecteur d'un angle, multipliez-le par rotation matrix.

Ainsi, dans pseudocode, il ressemblerait à ceci:

θ = X/(2R) 
A = 2x2 rotation matrix corresponding to a rotation by θ radians 
A' = transpose of A 
P1 = C + A * (P - C) 
P2 = C - A' * (P - C) 
0

Il y a quelques petites choses qui pourraient aider. Je n'écrirai pas le code mais j'imagine que la solution va être basée sur des triangles. Considérez:

Tout rayon a la même longueur.

Ainsi, le triangle tiré de P1-P1-C est isocèle.

Toute tangente est perpendiculaire au rayon.

Je serais difficile de le prouver ici et maintenant, mais si vous étendez les lignes de C à P1/P2 à la tangente qui coupe le cercle à C-> P forme également un isocèle.

Devrait être facile à comprendre à partir de là.