5 votes

Trouver l'intersection entre deux lignes

Je me suis donc cassé la tête sur cet algorithme relativement simple. Je ne sais pas exactement ce qui ne va pas dans mon code, mais je n'obtiens pas le point d'intersection où ils se croisent réellement.

J'utilise Unity3D et j'essaie de trouver le point d'intersection de deux lignes, dans le plan x,z mais pas dans le plan x,y. Je suppose que l'algorithme qui fonctionne pour x,y devrait fonctionner pour x,z ;

Mon code :

Vector3 thisPoint1 = thisCar.position + (2 * thisCar.forward);
Vector3 thisPoint2 = thisCar.position + (20 * thisCar.forward);

Debug.DrawLine(thisPoint1, thisPoint2, Color.white, 2);

Vector3 otherPoint1 = threateningCar.position + (2 * threateningCar.forward);
Vector3 otherPoint2 = threateningCar.position + (20 * threateningCar.forward);

Debug.DrawLine(otherPoint1, otherPoint2, Color.white, 2);

float A1 = thisPoint2.z - thisPoint1.z;
float B1 = thisPoint1.x - thisPoint2.x;
float C1 = A1 * thisPoint1.x + B1 * thisPoint1.z;

float A2 = otherPoint2.z - otherPoint1.z;
float B2 = otherPoint1.x - otherPoint2.x;
float C2 = A2 * otherPoint1.z + B2 * otherPoint1.z;

float det = A1 * B2 - A2 * B1;

float x = (B2 * C1 - B1 * C2) / det;
float z = (A1 * C2 - A2 * C1) / det;

return new Vector3(x, this.transform.position.y, z);

Quelqu'un peut-il m'aider en m'indiquant ce que je fais mal ?

thisCar.forward y threateningCar.forward sont généralement [0,0,1], [0,0,-1] o [1,0,0], [-1,0,0]

3voto

Jonny Points 1371

Je l'ai trouvé !!!

float A2 = otherPoint2.z - otherPoint1.z;
float B2 = otherPoint1.x - otherPoint2.x;
float C2 = A2 * otherPoint1.z + B2 * otherPoint1.z;

Il devrait l'être :

float A2 = otherPoint2.z - otherPoint1.z;
float B2 = otherPoint1.x - otherPoint2.x; 

float C2 = A2 * otherPoint1 .x + B2 * otherPoint1.z ;

Beaucoup de temps perdu pour rien :/.

Quoi qu'il en soit, cela aidera tous ceux qui cherchent à faire des croisements de lignes.

0voto

Vous pourriez créer un lien de parenté entre un GameObject vide et la voiture et le placer légèrement devant elle (soit dans l'IDE, soit au démarrage). De cette façon, vous pouvez obtenir en toute sécurité les deux points nécessaires pour tracer une ligne.

0voto

ja72 Points 9417

Si vous connaissiez la distance t cette voiture doit voyager et u l'autre voiture, alors le point d'intersection est trivial.

Vector3 intersection = thisCar.position + (t * thisCar.forward);
Vector3 intersection = threateningCar.position + (u * threateningCar.forward);

Mais vous pouvez résoudre t y u en utilisant un peu d'algèbre et le produit vectoriel croisé en 2D, [x_1,z_1] × [x_2,z_1] = (x_2 z_1 - z_2 x_1) qui est le y une valeur scalaire du produit vectoriel 3D.

t = Vector3.Cross(threateningCar.forward, thisCar.position - threateningCar.position).y 
    / Vector3.Cross(thisCar.forward, threateningCar.forward).y;

u = Vector3.Cross(thisCar.forward, thisCar.position - threateningCar.position).y 
    / Vector3.Cross(thisCar.forward, threateningCar.forward).y;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X