Salut à tous les couche tard
j'ai un petit problème avec la fonction qui limite le déplacement de mon personnage à un polygone .
C'est un point and click , la fonction vérifie ou le joueur clique et si il clique a l'intérieur de la limite de déplacement (un polygone) , le personnage ce déplace.
J'utilise cette méthode :
Donc en fait :Soit le segment [AB], et le segment [CD].
Je note I le vecteur AB, et J le vecteur CD
Soit k le parametre du point d'intersection du segment CD sur la droite AB. on sera sur le segment si 0<k<1
Soit m le parametre du point d'intersection du segment AB sur la droite CD, on sera sur le segment si 0<m<1
Soit P le point d'intersction
P = A + k*I; // equation (1)
P = C + m*J;
D'ou :
A + k*I = C + m*J
On décompose les points et vecteurs, on a :
Ax + k*Ix = Cx + m*Jx
Ay + k*Iy = Cy + m*Jy
2 équations, 2 inconnues, en résolvant, on trouve :
m = -(-Ix*Ay+Ix*Cy+Iy*Ax-Iy*Cx)/(Ix*Jy-Iy*Jx)
k = -(Ax*Jy-Cx*Jy-Jx*Ay+Jx*Cy)/(Ix*Jy-Iy*Jx)
(Notez que les dénominateurs sont les meme)
Attention, si Ix*Jy-Iy*Jx = 0 , alors les droites sont paralleles, pas d'intersection.
Sinon, on trouve m et k
On vérifie que 0<m<1 et 0<k<1 --> sinon, cela veut dire que les droites s'intersectent, mais pas au niveau du segment.
Ensuite, pour retrouver P, on réinjecte m ou k dans une des 2 équations (1)
Z = (I.x * J.y - I.y * J.x)
m = -(-I.x * S1A.y + I.x * S2A.y + I.y * S1A.x - I.y * S2A.x)/ Z
k = -( S1A.x * J.y - S2A.x * J.y - J.x * S1A.y + J.x * S2A.y)/ Z
Si m et k sont plus grands que zero et plus petits que 1 alors les segments s'intersecte .
La j'ai juste commencer la fonction et normalement , il devrait y avoir toujours au moins une section donc, cela devrais tout le temps marcher quand je clique dans le polygone , or ça ne marche jamais ...?
voici en gros mon main.c (il n'est pas comme ça en vrai)
voici le fichier contenant les fonctions :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 typedef struct coord coord ; struct coord { long x; long y; }; typedef struct poly poly ; struct poly { coord point[70]; }; int main () { long joueurDansZone = 0; coord clic; poly polygone; polygone.point[0].x = 515 ; polygone.point[0].y = 235 ; polygone.point[1].x = 30 ; polygone.point[1].y = 559 ; polygone.point[2].x = 800 ; polygone.point[2].y = 559 ; polygone.point[3].x = 800 ; polygone.point[3].y = 446 ; polygone.point[4].x = 550 ; polygone.point[4].y = 235 ; // BLA BLA BLA , LES EVENEMENTS ( dans une boucle ect...) : if (evenement.button.button == SDL_BUTTON_LEFT)//Clik gauche (Action) { if ( curseur == Curseur_normal ) // Curseur par défaut (déplacement) { clic.y = evenement.button.y ; // Les coordonnées de clic sont celle de l'endroit ou on a cliquer clic.x = evenement.button.x ; joueurDansZone = clicPoly ( 5 , polygone , clic ); if (joueurDansZone == 1) { positionPerso.y = evenement.button.y - 220 ; // On enlève la taille du sprite positionPerso.x = evenement.button.x - 34 ; // Le bas est centrer au milieu (le perso fait 68 px) } } } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63 int clicPoly ( long nbppoly , poly polygone , coord clic ) { int i , sect = 0 ; coord infini; infini.x = 3000 ; infini.y = 4000 ; for ( i=0 ; i != nbppoly ; i++) { sect = sectSegment ( polygone.point[i] , polygone.point[i+1] , clic , infini) ; if ( sect == 1 ) return 1; } return 0; } int sectSegment (coord A , coord B , coord clic , coord infini) { coord vects1 , vects2 ; long m , m1 , m2 , k , k1 , k2 , z , continuer = 1 ; while (continuer) { z = m = k = 0 ; vects1.x = B.x - A.x ; vects1.y = B.y - A.y ; vects2.x = infini.x - clic.x ; vects2.y = infini.y - clic.y ; z = vects1.x * vects2.y - vects1.y * vects2.x ; if (z == 0) { infini.x ++; infini.y ++; } else if ( z != 0) { m1 = ( -vects1.x * A.y ) + ( vects1.x * clic.y ) ; m2 = ( vects1.y * A.x ) - ( vects1.y * clic.x ) ; m = (- m1 + m2 ) / z ; k1 = ( A.x * vects2.y ) - ( clic.x * vects2.y ); k2 = ( vects2.x * A.y ) + ( vects2.x * clic.y ); k = (- k1 - k2 ) / z ; if (m > 0 && m < 1 && k > 0 && k < 1 ) return 1; else return 0; } else { fprintf(stderr , "Erreur dans la fonction sectSegments"); exit(EXIT_FAILURE); } } }
Voila voila ...
@+ et merci d'avance
Partager