1
Graphique / Re: Besoin d'aide pour un calcul de trajectoire...
« le: Juillet 24, 2017, 04:48:48 pm »
En faite on ne fait pas une recherche d'intersection entre un rectangle et une droite mais entre deux segments.
Pour l'étendre à un rectangle, tu peux le faire sur les quatre fois (une fois pour chaque côté du rectangle) ou uniquement sur les diagonale pour gagner du temps de calcul. Ce qui peut être intéressant si tu as beaucoup de rectangles à tester
Cependant, en faisant le calcul sur les diagonales tu perds un peu en précision. La détection ne se fera pas dans certains cas particuliers où le rayon entre dans le rectangle mais s’arrête avant d'atteindre une diagonale. Ce qui n'est pas un problème dans le cas où le rayon à une portée « illimitée ».
De plus le point d'intersection retourné se trouve à l'intérieur du rectangle et non sur l'un des bords. Cela peut être gênant suivant l'ordre d'affichage.
A toi de voir ce que tu souhaites privilégier en fonction de tes besoins.
Pour ce qui est du calcul de l'intersection en lui même c'est juste un peu de maths ^_^
Il faut commencer par calculer les paramètres des équations des droites dont les segments font partie.
Donc j'ai un segment [A0 A1] qui fait partie de la droite d'équation y = Aa * x + Ab, et le segment [B0 B1] qui fait partie de la droite d'équation y = Ba * x + Bb. Tu peux adapter cette partie là si tu utilises des coordonnées polaires pour définir ton rayon à la place de deux points.
Ensuite on teste si la pente des droites ne sont pas les mêmes, si c'est le cas les droites sont parallèles il n'y aura donc pas d'intersection.
Pour trouver l'intersection, il reste juste à résoudre un système de 2 équations 2 inconnues :
y = Aa * x + Ab
y = Ba * x + Bb
La solution étant :
Il reste alors à vérifier que le x trouvé pour le point d'intersection se trouve bien sur le segment et pas sur une le reste des droites. Dans le cas où tu aurais un rayon avec une portée illimitée il ne faudra faire ce test que pour le segment correspondant au rectangle.
Si c'est le cas tu peux alors calculer ton y et affecter le résultat au pointeur passé en paramètre
Voila, j'espère que ça répond à tes questions ^_^
Pour l'étendre à un rectangle, tu peux le faire sur les quatre fois (une fois pour chaque côté du rectangle) ou uniquement sur les diagonale pour gagner du temps de calcul. Ce qui peut être intéressant si tu as beaucoup de rectangles à tester
Cependant, en faisant le calcul sur les diagonales tu perds un peu en précision. La détection ne se fera pas dans certains cas particuliers où le rayon entre dans le rectangle mais s’arrête avant d'atteindre une diagonale. Ce qui n'est pas un problème dans le cas où le rayon à une portée « illimitée ».
De plus le point d'intersection retourné se trouve à l'intérieur du rectangle et non sur l'un des bords. Cela peut être gênant suivant l'ordre d'affichage.
A toi de voir ce que tu souhaites privilégier en fonction de tes besoins.
Pour ce qui est du calcul de l'intersection en lui même c'est juste un peu de maths ^_^
Il faut commencer par calculer les paramètres des équations des droites dont les segments font partie.
Donc j'ai un segment [A0 A1] qui fait partie de la droite d'équation y = Aa * x + Ab, et le segment [B0 B1] qui fait partie de la droite d'équation y = Ba * x + Bb. Tu peux adapter cette partie là si tu utilises des coordonnées polaires pour définir ton rayon à la place de deux points.
float Aa = (_A1.y - _A0.y) / (_A1.x - _A0.x);
float Ab = _A0.y - (Aa * _A0.x);
float Ba = (_B1.y - _B0.y) / (_B1.x - _B0.x);
float Bb = _B0.y - (Ba * _B0.x);
float Ab = _A0.y - (Aa * _A0.x);
float Ba = (_B1.y - _B0.y) / (_B1.x - _B0.x);
float Bb = _B0.y - (Ba * _B0.x);
Ensuite on teste si la pente des droites ne sont pas les mêmes, si c'est le cas les droites sont parallèles il n'y aura donc pas d'intersection.
if (Aa == Ba)
return false;
return false;
Pour trouver l'intersection, il reste juste à résoudre un système de 2 équations 2 inconnues :
y = Aa * x + Ab
y = Ba * x + Bb
La solution étant :
float x = (Bb - Ab) / (Aa - Ba);
Il reste alors à vérifier que le x trouvé pour le point d'intersection se trouve bien sur le segment et pas sur une le reste des droites. Dans le cas où tu aurais un rayon avec une portée illimitée il ne faudra faire ce test que pour le segment correspondant au rectangle.
if (x < _A0.x || x > _A1.x)
return false;
if (x < _B0.x || x > _B1.x)
return false;
return false;
if (x < _B0.x || x > _B1.x)
return false;
Si c'est le cas tu peux alors calculer ton y et affecter le résultat au pointeur passé en paramètre
_intersects->x = x;
_intersects->y = Aa * x + Ab;
_intersects->y = Aa * x + Ab;
Voila, j'espère que ça répond à tes questions ^_^