[Algo] 3D : 2 Vecteurs Perpendiculaire à leurs points d'aplication.

3D : 2 Vecteurs Perpendiculaire à leurs points d'aplication. [Algo] - Algo - Programmation

Marsh Posté le 27-07-2002 à 15:29:17    

Je realise un programme de 3D ou il sera possible de ce deplacé comme dans un jeu, mais pour les deplacements il me faut calculé certain truc, alors si quelqu'un pouvais m'aidais, je serais heureux :)
 
 
Un schema du probleme :
 
http://www.ifrance.com/yepslide/Pict0006.png
 
Ce que je sais, et que je dois trouver :
 
On connait les coordonnées des points A et B.
Les 2 vecteurs sont perpendiculaire en B.
La longeur de [BC] est de 1.
 
Trouvé les coordonnées du point C en fonction des coordonnées A et de B.
 
A(Xa,Ya);
B(Xb,Yb);
C(Xc,Yc);


Message édité par Slide le 27-07-2002 à 15:43:44
Reply

Marsh Posté le 27-07-2002 à 15:29:17   

Reply

Marsh Posté le 27-07-2002 à 15:39:43    

c'est impossible de résoudre ce pb. En 2D il y a 2 solutions (C et sont symetrique par rapport à (AB) ) et en 3D il y en a une infinité (tous les points du plan contenant B et  perdendiculaire au vecteur AB qui sont à une disatnce de 1 du point B)


---------------
"I wonder if the internal negative pressure in self pumping toothpaste tubes is adjusted for different market altitudes." John Carmack
Reply

Marsh Posté le 27-07-2002 à 15:42:24    

mareek a écrit a écrit :

c'est impossible de résoudre ce pb. En 2D il y a 2 solutions (C et sont symetrique par rapport à (AB) ) et en 3D il y en a une infinité (tous les points du plan contenant B et  perdendiculaire au vecteur AB qui sont à une disatnce de 1 du point B)




 
 
C'est dans un plan 2D, jai pas mis d'axe Z ;) : Donc c possible de résoudre puisque c'est pas en 3D (d'accord, le topic laisse desiré, mais, c'est pour faire de la 3D ce calcul, une fois que je l'aurais resulo, je pourrais me deplacé sur l'axe X et Y :).
Z, c'est pour plus tard.
 
Vous m'aidez :) ? svp
 
Au faite, j'ai modifier le 1er Message :
 

Slide a écrit a écrit :

 
Trouvé les coordonnées du point C en fonction des coordonnées A et de B.




 


Message édité par Slide le 27-07-2002 à 15:45:02
Reply

Marsh Posté le 27-07-2002 à 16:19:30    

A-B ( (xA-xB, yA-yB) ) te donne le vecteur directeur BA donc sur ton dessin (-4, 4) à peu près ...
 
formule de rotation d'un point / d'un vecteur dans le sens trigo :
 
x' = x*cos(a) - y*sin(a)
y' = x*sin(a) + y*cos(a)
 
(tu retrouves facilement cette formule avec un dessin)
 
ici, a = -pi/2, donc cos(a) = 0, sin(a) = -1
 
donc  
x'= y
y'= -x
 
ton vecteur directeur tourné est donc  
 
(yA - yB, - (xA - xB))
 
* tu le normalises pour trouver un vecteur unitaire : v1
* ton point C est alors B + v1 * l, où l est la distance entre B et C, ici 1.
 
edit : erreurs de signe :/


Message édité par youdontcare le 27-07-2002 à 16:22:08
Reply

Marsh Posté le 27-07-2002 à 17:34:07    

youdontcare a écrit a écrit :

A-B ( (xA-xB, yA-yB) )  
* tu le normalises pour trouver un vecteur unitaire : v1
* ton point C est alors B + v1 * l, où l est la distance entre B et C, ici 1.




 
Merci :) Je chercher avec une quelqu'un, et on trouvait des equations de 200 lignes lol :)  
 
En resumé, ca donne ceci non ?
 
BD etant le vecteur realisé avec la formule de rotation que tu as donné.
 
->                        
V1 = ((Ya-Yb)/BDx ; -(Xa-Xb)/BDy)
 
Et C = (Bx + V1x ; By + V1y)
 
C'est bien ca ?
 
Edit : Ajout d'information sur l'origine du point D


Message édité par Slide le 27-07-2002 à 17:38:23
Reply

Marsh Posté le 27-07-2002 à 17:47:36    

Slide a écrit a écrit :

 
->                        
V1 = ((Ya-Yb)/BDx ; -(Xa-Xb)/BDy)




 
 
Heu, ca va donné (1;1) ca non lol ?
Arf, je n'arrive pas à normalisé... :(
 
hummm, ce serai pas plutot la longeur du vecteur BD ?
 
Ca donnerai ca donc non ?
 
->                        
V1 = ((Ya-Yb)/BD ; -(Xa-Xb)/BD)


Message édité par Slide le 27-07-2002 à 17:49:21
Reply

Marsh Posté le 27-07-2002 à 18:06:31    

>>hummm, ce serai pas plutot la longeur du vecteur BD ?  
 
si.
 
normaliser un vecteur = faire en sorte que sa norme (sa longueur) fasse 1.
 
norme d'un vecteur (x, y) = racine(x*x + y*y) = n.  
donc (x/n, y/n) est le vecteur normalisé (preuve, calcule sa norme).
 
tu en es où scolairement ? tout ça c'est la base de l'algèbre linéaire, tu devrais chercher des cours sous google.

Reply

Marsh Posté le 27-07-2002 à 18:12:05    

youdontcare a écrit a écrit :

>>hummm, ce serai pas plutot la longeur du vecteur BD ?  
 
si.
 
normaliser un vecteur = faire en sorte que sa norme (sa longueur) fasse 1.
 
norme d'un vecteur (x, y) = racine(x*x + y*y) = n.  
donc (x/n, y/n) est le vecteur normalisé (preuve, calcule sa norme).
 
tu en es où scolairement ? tout ça c'est la base de l'algèbre linéaire, tu devrais chercher des cours sous google.




 
En faite, c'est parce que j'ai trop de variable lol, et je commence a avoir bcp de code lol, c'est un programme en Delphi.
Bon ca devrait donner ca donc :)
 

Code :
  1. Vk_Right : begin      //droite
  2.                    VecteurABpx:= (positionCamZD-positionCamZT);
  3.                    VecteurABpy:= -(positionCamXD-positionCamXT);
  4. VecteurBCx:= VecteurABpx div trunc(sqrt((VecteurABpx)*(VecteurABpx) + (VecteurABpx)*(VecteurABpx)));
  5. VecteurBCy:= VecteurABpy div trunc(sqrt((VecteurABpx)*(VecteurABpx) + (VecteurABpx)*(VecteurABpx)));
  6.                  positionCamXT:=positionCamXT+VecteurBCx;
  7.                  positionCamZT:=positionCamZT+VecteurBCy;
  8.                    end;


 
Ca devrait deplacé la camera a droite :)


Message édité par Slide le 27-07-2002 à 18:13:32
Reply

Marsh Posté le 27-07-2002 à 18:22:59    

ton code n'est pas très lisible. si tu veux faire de la 3d, il est impératif que tu utilises des classes point, vecteur, matrice & co et que tu surcharges les opérateurs addition, multiplication, etc.  
 
un exemple c++ (ça doit être kif kif en delphi) si tu as une classe point/vecteur 2d, qui contient ses coordonnées x et y, des opérateurs d'addition, le calcul de norme ... :
 
// définition de tes deux points
Point A = Point(-3, 2);
Point B = Point(1, -3);
 
// calcul du vecteur directeur, rotation, normalisation pour avoir un vecteur unitaire
Point vD = A - B;  
vD.rotate(-PI/2);
vD.normalize();
 
// et hop !
Point C = B + vD;
 
non, je n'ai pas envie de debugguer ton code delphi. tu as tous les éléments pour calculer ton point, mais tu ne devrais pas mettre la charrue avant les boeufs. donc : potasse le code objet, potasse tes cours (si tu n'en as pas eu, google), et ensuite code.

Reply

Marsh Posté le 27-07-2002 à 18:40:14    

Code :
  1. Vk_Right :  begin      //gauche
  2.                    VecteurABpx:= -(positionCamZD-positionCamZT);
  3.                    VecteurABpz:= (positionCamXD-positionCamXT);
  4.                    VecteurBCx:= VecteurABpx div trunc(sqrt((VecteurABpx)*(VecteurABpx) + (VecteurABpz)*(VecteurABpz)));
  5.                    VecteurBCz:= VecteurABpz div trunc(sqrt((VecteurABpx)*(VecteurABpx) + (VecteurABpz)*(VecteurABpz)));
  6.                    positionCamXT:=positionCamXT+VecteurBCx;
  7.                    positionCamZT:=positionCamZT+VecteurBCz;
  8.                    positionCamXD:=positionCamXD+VecteurBCx;
  9.                    positionCamZD:=positionCamZD+VecteurBCz;
  10.                    end;
  11. Vk_left : begin      //droite
  12.                    VecteurABpx:= (positionCamZD-positionCamZT);
  13.                    VecteurABpz:= -(positionCamXD-positionCamXT);
  14.                    VecteurBCx:= VecteurABpx div trunc(sqrt((VecteurABpx)*(VecteurABpx) + (VecteurABpz)*(VecteurABpz)));
  15.                    VecteurBCz:= VecteurABpz div trunc(sqrt((VecteurABpx)*(VecteurABpx) + (VecteurABpz)*(VecteurABpz)));
  16.                    positionCamXT:=positionCamXT+VecteurBCx;
  17.                    positionCamZT:=positionCamZT+VecteurBCz;
  18.                    positionCamXD:=positionCamXD+VecteurBCx;
  19.                    positionCamZD:=positionCamZD+VecteurBCz;
  20.                    end;


 
Voilà, ca marche un peu, jai quelque bug, je vais trouvé ca.
Bon, k, je vais utilisé les variables prevu pour X et Y :), en faite, j'ai eu une TI 80 à mes 12 ans, et j'ai pris l'habitude de tt stocké comme ca lol ;p
 
Va falloir que je change.


Message édité par Slide le 27-07-2002 à 18:40:43
Reply

Marsh Posté le 27-07-2002 à 18:40:14   

Reply

Marsh Posté le 28-07-2002 à 00:45:44    

[OT]euh pourquoi mettre des lol a toutes les phrases?
on se croirait sur le chat caramail.. [/OT]
 
LeGreg

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed