Tracer un segment dan un rectangle

Réponses à toutes vos questions après le Bac (Fac, Prépa, etc.)
olibara
Messages: 7
Enregistré le: 10 Aoû 2008, 20:26

Tracer un segment dan un rectangle

par olibara » 13 Mai 2014, 18:58

Bonjour

Je dispose des coordonnées d'un rectangle ABCD A(x,y), B(x,y),C(x,y),D(x,y)

Pour simplifier le point inférieur gauche A est (0,0) le point supérieur droit C est X,Y

Je connais un point d'origine O x1,y1 qui se trouve quelque part sur le perimetre du rectangle
J'ai deux vecteurs vX et vY donnant un coefficient de force en X et en Y (les valeurs peuvent etre positives ou negatives et indépendante de mon rectangle)

ces Deux vecteurs me permettent de calculer le coefficient a d'une droite de forme Y=aX+b
a= vY/vX

Je dois trouver le point le point d'intesection avec un coté du rectangle d'une droit passant par le point O ayant le coefficient a.

J'avoue que je seche
je travaille en programation cSharp mais je n'ai pas encore trouvé d'algorithme discret pour faire cela.
Je travaille a coup de calcul conditionnel if, else ca va plus ou moins mais je tombe souvent sur une exception qui me faire repartir dans la mauvaise direction sans traverser mon rectangle

Exemple de valeurs
A=(0,0)
C=(46,41)
vY=5.259999
vX=-5.940001

O=(38,41)

Merci pour votre aide !



Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 13 Mai 2014, 19:52

Yop,

Si tu prends ton rectangle

D--O-C
A----B
(pour respecter tes notations)

soit v(vX,vY) le vecteur direction.
pour l'algorithme je suggère de tester les côtés un par un.
Donc pour un côté, le but c'est de dire:
- l'intersection appartient au côté. Ou pas.

Pour savoir si l'intersection appartient au côté:
(1) : Tu cherches l'intersection (je l'appelle P) de la droite passant par ce côté, avec la droite passant par le point O et de vecteur directeur v.

(2) : Tu regardes si P appartient au côté (je considère [AD]).
----------------
pour (1) :
On peut considérer l'eq paramétrique de la droite (M) de même direction que v.
(D) : O+vt
De même (P) pour le côté [AD]: A+ut
avec u = (0,1) (vu que [AD] est vertical..)
On cherche le t, tel qu'on a l'intersection idem :
O+vt = A+ut
(O-A) = (v-u)t
et on déduit t (que j'appele t_solution).
Moyennant...
v.x - u.x !=0 (sauf si O.x - A.x ==0, auquel cas on a libre choix pour t pour cette coordonnée), idem les autres coordonnées.
Si tu trouves des t différents pour chacune des coordonnées, alors c'est pas le bon côté (tu dois avoir une parallèle qui traine...)

(2) il suffit alors de considérer H, le point de (D) qui intersecte (M), et de vérifier que H appartient à [AD]
H = A+ut_solution
et on s'assure que AH
Le plus gros effort à faire, il est dans s'assurer que l'algo ci-dessus marche dans les cas foireux :
O est dans un coin...
le vecteur v est nul...
le rectangle est plat...
la vie est une fête :)

olibara
Messages: 7
Enregistré le: 10 Aoû 2008, 20:26

par olibara » 13 Mai 2014, 22:14

Meci Fatal_error

Oui je pense que c'est la bonne piste

Ma droite est effectivement d'equation Y=aX+C
Comme je peux calculer A facilement : A=vX/vX et que j'ai l'origine oX,oY je peux calculer C
C = oY - (A * oX);

Pour chaque coté du rectangle, pas difficile c'est
Y=0
Y=y1
X=0
et
X=x1

Donc je dois résoudre

0=Ax+C
y1=Ax+C

Et voir si dans une des solution x est contenu entre x0 et X1

Ou résoudre

y=0+C
y=x1*A+C

Et voir si dans une des solution y est contenu entre y0 et y1

J'ai bien compris ?

Merci de ton aide


fatal_error a écrit:Yop,

Si tu prends ton rectangle

D--O-C
A----B
(pour respecter tes notations)

soit v(vX,vY) le vecteur direction.
pour l'algorithme je suggère de tester les côtés un par un.
Donc pour un côté, le but c'est de dire:
- l'intersection appartient au côté. Ou pas.

Pour savoir si l'intersection appartient au côté:
(1) : Tu cherches l'intersection (je l'appelle P) de la droite passant par ce côté, avec la droite passant par le point O et de vecteur directeur v.

(2) : Tu regardes si P appartient au côté (je considère [AD]).
----------------
pour (1) :
On peut considérer l'eq paramétrique de la droite (M) de même direction que v.
(D) : O+vt
De même (P) pour le côté [AD]: A+ut
avec u = (0,1) (vu que [AD] est vertical..)
On cherche le t, tel qu'on a l'intersection idem :
O+vt = A+ut
(O-A) = (v-u)t
et on déduit t (que j'appele t_solution).
Moyennant...
v.x - u.x !=0 (sauf si O.x - A.x ==0, auquel cas on a libre choix pour t pour cette coordonnée), idem les autres coordonnées.
Si tu trouves des t différents pour chacune des coordonnées, alors c'est pas le bon côté (tu dois avoir une parallèle qui traine...)

(2) il suffit alors de considérer H, le point de (D) qui intersecte (M), et de vérifier que H appartient à [AD]
H = A+ut_solution
et on s'assure que AH<AD et DH<AD

Le plus gros effort à faire, il est dans s'assurer que l'algo ci-dessus marche dans les cas foireux :
O est dans un coin...
le vecteur v est nul...
le rectangle est plat...

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 13 Mai 2014, 22:45

Donc je dois résoudre
0=Ax+C
y1=Ax+C
Et voir si dans une des solution x est contenu entre x0 et X1
Ou résoudre
y=0+C
y=x1*A+C


Ni l'un ni l'autre.
Exemple :
Soit le côté [AD]
avec A(1,2) et D(1,3)
Soit O(2,3)
Soit le vecteur v(1,1)
on a (D) : O+vt_1
on a (P) : A+ut_2
(j'ai fait une boulette tout à l'heure...il faut considérer t_1 et t_2 comme paramètres (pas seulement t)))
avec u=D-A=(0,1)
on cherche t_1 et t_2 tels que
O+vt_1 = A+ut_2
(O-A) = ut_2 - vt_1
sur les x :
(2 - 1) = 0t_2 - 1t_1
t_1 = -1
sur les y :
3 - 2 = 1t_2 - 1t_1
1 = t_2 + 1 t_2 = 0
Idem l'intersection H sur (AD)=(P), a pour coordonnée :
A + ut_2 = (1,2)+(0,1)0 = (1,2)

Pour vérifier c'est apres immédiat
AH = 0
AH <= AD
DH = AD...
DH <= AD
comme AH<=AD et DH<=AD, H est dans [AD]

ps: l'écriture :
(D) : O+vt_1
c'est pas le classique f(x) = ax+b, c'est genre l'eq paramétrique de la droite.
Genre pour un scalaire t_1, tu obtiens un nouveau point (a deux dimensions)
Regarde la def sur wiki ou autre au besoin
la vie est une fête :)

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 14 Mai 2014, 12:11

un fiddle =)
la vie est une fête :)

 

Retourner vers ✯✎ Supérieur

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 54 invités

cron

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite