2009-10-11 13 views
3

J'ai un cercle. A l'intérieur du cercle est un point. J'ai un vecteur originaire à ce stade. J'aimerais savoir quel point sur le cercle ce vecteur croise. Voici un dessin:Intersection sur un cercle de vecteur provenant du cercle

http://n4te.com/temp/circle.png http://n4te.com/temp/circle.png

Le point rouge est le point que je suis en train de déterminer.

Je connais ces choses: le centre du cercle, l'origine du vecteur et la direction du vecteur. Je sais que c'est une question de base, mais j'ai toujours des problèmes. La plupart des Googlings m'amènent à une collision entre les cercles, qui est liée mais pas tout à fait la même. Merci pour toute l'aide que vous pourrez fournir!

+1

Le lien est rompu –

+0

L'image liée est partie, désolé. Était juste un cercle avec un vecteur originaire en elle et en intersection avec le cercle. – NateS

Répondre

11

Elementary vector algebra.

O — center of circle (vector) 
r — its radius  (scalar) 
A — origin of ray (vector) 
k — direction of ray (vector) 

Solve (A + kt - O)² = r² pour t scalaire, choisissez racine positive et A + kt est votre point.

Des explications complémentaires:

. est dot product, ² pour un vecteur est produit scalaire du vecteur avec lui-même. Développez LHS

(A + kt - O)² = (A - O)² + 2(k.(A - O))t + k²t². 

Le second degré est k²t² + 2(k.(A - O))t + (A - O)² - r² = 0. En termes de variables, cela devient (rayVX² + rayVY²)t² + 2(rayVX(rayX - circleX) + rayVY(rayY - circleY))t + (rayX - circleX)² + (rayY - circleY)² - r² = 0.

+1

Merci pour la réponse. Il n'est pas clair pour moi comment passer de votre équation au code Java. Pouvez-vous montrer comment résoudre en utilisant les variables suivantes? circleX, circleY, rayon, rayonX, rayY, rayVX, rayVY – NateS

+1

Recherchez l'équation quadratique dans la référence mathématique de votre choix. – starblue

+1

J'ai peur que cela n'aide pas. Je ne comprends pas comment cela fonctionne quand O, A et k sont deux valeurs. ([rayX, rayY] + [rayonVX, rayonVY] * t - [cercleX, cercleY]) ² = r² – NateS

7

Merci beaucoup à Anton Tykhyy pour sa réponse détaillée. C'était le code Java résultant:

float xDiff = rayX - circleX; 
float yDiff = rayY - circleY; 
float a = rayVX * rayVX + rayVY * rayVY; 
float b = 2 * (rayVX * (rayX - circleX) + rayVY * (rayY - circleY)); 
float c = xDiff * xDiff + yDiff * yDiff - r * r; 
float disc = b * b - 4 * a * c; 
if (disc >= 0) { 
    float t = (-b + (float)Math.sqrt(disc))/(2 * a); 
    float x = rayX + rayVX * t; 
    float y = rayY + rayVY * t; 
    // Do something with point. 
} 
Questions connexes