Mad Race : calcul de coordonnées 3D

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Mad Race : calcul de coordonnées 3D

Message par Cool Dji »

Hello,

Je me balade depuis un moment sur les sites de maths sans trouver de solution à mon problème qu'au millénaire dernier, j'aurai pu résoudre en peu de temps 8O

Voici un schéma du problème :
Tous les éléments en bleu sont connus et je cherche une équation permettant de déterminer les coordonnées du point rouge (x3,y3)

Le point rouge doit être à la verticale du segment (x1,y1) (x2,y2) en passant par (x2,y2) à une distance d
Normalement, l'angle fait 90° mais je préfère une équation générique qui marche avec n'importe quel angle car je cherche aussi à trouver des points de l'autre coté...

Je fais appel à tous ceux pour qui "équation de droite"," coefficient directeur" et tout le reste ne correspond pas à un très lointain souvenir :|

Image

Edit:
Pour être plus concret, voici ce qui me motive :
Je cherche à disposer des boules blanches de chaque coté de la ligne rouge centrale .
Pour l'instant, je place au hasard les boules blanches autour de la ligne rouge et ça ne va pas du tout, mais alors pas du tout :mrgreen: :mrgreen:

http://xdji.free.fr/Telechargement/Mad%20Race.zip

Merci d'avance de votre aide :D
Dernière modification par Cool Dji le mar. 21/sept./2010 13:15, modifié 1 fois.
Only PureBasic makes it possible
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Pb pour calcul de coordonnées

Message par G-Rom »

Salut Cool Dji.

Dans un premier temps & pour faire simple , tu dois calculer
l'angle entre le couple (x1,y1) & (x2,y2)
pour ce faire , j'avais codé cette fonction :

Code : Tout sélectionner

Procedure.f ReturnDegAngle(x1.f,y1.f,x2.f,y2.f) ; DEGREE
  A.f = x1-x2
  b.f = y1-y2
  c.f = -Sqr(A*A+b*b)
  Angle.f = ACos(A/c)*180/#PI
  If y1 < y2 : Angle=360-Angle : EndIf
  ProcedureReturn Abs(Angle - 360)
EndProcedure
sache que même si c'est pour de la 3D , le code reste valable , tu travail dans un repère à 2 dimensions (XY) (XZ) (YZ)
un fois que tu connais l'angle , il te faut une distance entre (x2,y2) & (x3,y3) , là pas de calcul , c'est toi qui choisi


on calcul sa position donc de cette manière :

X3 = X2 + DISTANCE * Cos( (AngleX1X2 + 90) * #PI / 180)
Y3 = Y2 + DISTANCE * Sin( (AngleX1X2 + 90) * #PI / 180)

et le code de test :

Code : Tout sélectionner

Procedure.f ReturnDegAngle(x1.f,y1.f,x2.f,y2.f) ; DEGREE
  A.f = x1-x2
  b.f = y1-y2
  c.f = -Sqr(A*A+b*b)
  Angle.f = ACos(A/c)*180/#PI
  If y1 < y2 : Angle=360-Angle : EndIf
  ProcedureReturn Abs(Angle - 360)
EndProcedure



OpenWindow(0,0,0,640,480,"Cool Dji")


X1.f = 100
Y1.f = 400


X2.f = 500
Y2.f = 100


Angle     = ReturnDegAngle(X1,Y1,X2,Y2)
Distance  = 64

X3.f = X2 + Distance * Cos( (Angle - 90) *  #PI/180)
Y3.f = Y2 + Distance * Sin( (Angle - 90) *  #PI/180)

X4.f = X2 + Distance * Cos( (Angle + 90) *  #PI/180)
Y4.f = Y2 + Distance * Sin( (Angle + 90) *  #PI/180)



Repeat
  
  StartDrawing(WindowOutput(0))
  
   
  LineXY(X1,Y1,X2,Y2,$0A0A0A)
  LineXY(X2,Y2,X3,Y3,$0A0A0A)
  LineXY(X3,Y3,X4,Y4,$0A0A0A)
  
  
  
  Circle(X1,Y1,6,$FF)
  Circle(X2,Y2,6,$FF)
  Circle(X3,Y3,6,$FF00)
  Circle(X4,Y4,6,$FF00)
  
  
  StopDrawing()
  
Until WindowEvent() = #PB_Event_CloseWindow
@+
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: [Resolu] Pb pour calcul de coordonnées

Message par Cool Dji »

Merci, merci G Rom,

Le code et tes explications sont très claires :D

J'étais parti sur les coef directeurs de 2 droites perpendiculaires =-1, :cry:

Ta méthode est vraiment plus simple et plus rapide (surtout ça marche !)

Alzheimer me guette (pourtant j'ai eu 16/20 au bac en mécanique).
En ce moment, je fais un blocage sur la trigo, ça m'inquiète un peu pour la suite... :mrgreen:
Vivement que les enfants entrent au collège pour choper leurs bouquins de maths !!
Only PureBasic makes it possible
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Pb pour calcul de coordonnées

Message par djes »

Un bon site pour réviser les maths de base : http://cmath.fr/
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Pb pour calcul de coordonnées

Message par Cool Dji »

Merci Djes,

Ouf, je vais pouvoir aller directement au niveau CM2 :mrgreen: :mrgreen: :mrgreen:
Only PureBasic makes it possible
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Pb pour calcul de coordonnées

Message par djes »

Si tu comprends tu m'expliques :)
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Pb pour calcul de coordonnées

Message par Cool Dji »

Hop,

Je n'ai pas résisté à intégrer le code de G-Rom dans mon programme
Voici donc en exclusivité, les premières lignes de code et le premier écran de Mad Race...
Ce n'est qu'une épreuve dans un jeu pour enfants sur lequel je travaille depuis un moment

http://xdji.free.fr/Telechargement/Mad%20Race.zip

@djes, oki :D
Only PureBasic makes it possible
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Pb pour calcul de coordonnées

Message par G-Rom »

si tu ne veut pas que tes enfants fassent de crise d'épilepsie , tu devrais "lisser" le mouvement de la caméra
en utilisant des vecteurs par exemple.


Ex :

tu as 2 points ( vecteur ) dans l'espace A & B :

A\x = 50
A\y = 250
A\z = 28

B\x = 150
B\y = 450
B\z = 328

Ta caméra se déplace entre ces vecteurs , pour cela il te faut connaitre la direction :

Direction = B-A

puis de le "normalisé" ( on divise le résultat par sa longueur )

soit

Code : Tout sélectionner

Lenght.f = sqr(   (A\x - B\x) * (A\x - B\x) + (A\y - B\y) * (A\y - B\y) +  (A\z - B\z) * (A\z - B\z) )

if Lenght<>0 ; Prevent div 0
  Dir\x = (B\x - A\x) / Lenght
  Dir\y = (B\y - A\y) / Lenght
  Dir\z = (B\z - A\z) / Lenght
endif 
Dir contient donc la direction que dois prendre A pour aller à B ( 0.26 , 0.53 , 0.80 )
si B\y avait la valeur de A\y et vice versa , le vecteur direction en Y serais donc de -0.53 !

en admettant que tu positionne ta camera sur A & tu appliques ceci :

CameraPosition + Direction * vitesse

Ta caméra se dirigera vers le point B !

c'est lien te seront utile :

http://www.siteduzero.com/tutoriel-3-88 ... teurs.html
http://olivier.buga.free.fr/sandy/bases.html


simple non ?

@++
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Pb pour calcul de coordonnées

Message par G-Rom »

j'oublias le code pour testé :D :

Code : Tout sélectionner

Structure vecteur3f
  x.f
  y.f
  z.f
EndStructure

A.vecteur3f
B.vecteur3f
C.vecteur3f
Dir.vecteur3f


A\x = 50
A\y = 250
A\z = 28

B\x = 150
B\y = 450
B\z = 328

C\x = A\x
C\y = A\y
C\z = A\z


vitesse.f = 2.0

Lenght.f = Sqr(   (A\x - B\x) * (A\x - B\x) + (A\y - B\y) * (A\y - B\y) +  (A\z - B\z) * (A\z - B\z) )

If Lenght<>0 ; Prevent div 0
  Dir\x = (B\x - A\x) / Lenght
  Dir\y = (B\y - A\y) / Lenght
  Dir\z = (B\z - A\z) / Lenght
EndIf 




For i = 0 To 99
  
  C\x + Dir\x * vitesse
  C\y + Dir\x * vitesse
  C\z + Dir\x * vitesse
  
  Debug "POSITION ACTUELLE : X = "+StrF(C\x,2)+" Y = "+StrF(C\y,2)+" Z = "+StrF(C\z,2)
  Delay(250)
Next 


Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Pb pour calcul de coordonnées

Message par Cool Dji »

Merci G-Rom,

Mince je viens de poster et il s'est perdu dans la nature !!

Ok, merci encore pour le code et les conseils.

Le principe pour le joueur :
il est guidé par une sorte de rail et ne pourra jamais sortir du circuit.
En revanche il peut accélérer et faire des mouvement gauche-droite-haut-bas pour éviter des malus ou attraper des bonus.
On ajoute un effet force centrifuge...

C'est pourquoi, je vais baser le déplacement du joueur sur une ligne contrainte : ce n'est pas comme dans un jeu de voiture où le joueur peut se déplacer comme il veut, déraper... (voire faire demi-tour).
Only PureBasic makes it possible
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Pb pour calcul de coordonnées

Message par Cool Dji »

Ok, à la place de :
G-Rom a écrit :

Code : Tout sélectionner

For i = 0 To 99
  
  C\x + Dir\x * vitesse
  C\y + Dir\x * vitesse
  C\z + Dir\x * vitesse
  
  Debug "POSITION ACTUELLE : X = "+StrF(C\x,2)+" Y = "+StrF(C\y,2)+" Z = "+StrF(C\z,2)
  Delay(250)
Next 
Je pense qu'il fallait lire

Code : Tout sélectionner

C\x + Dir\x * vitesse
  C\y + Dir\y * vitesse
  C\z + Dir\z * vitesse
Merci, je pense que j'ai de quoi bien avancer avec tout ça :D
Only PureBasic makes it possible
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Pb pour calcul de coordonnées

Message par Cool Dji »

OK, voilà j'ai utilisé le code de G-Rom pour construire un algo qui modifie la liste de points composant le circuit.
Maintenant, je vais avoir une liste de points tous à la même distance les uns des autres...
Un vrai moteur pas à pas...

La suite demain, un peu fatigué là !!

Code : Tout sélectionner

Structure vecteur3f
  x.f
  y.f
  z.f
EndStructure

A.vecteur3f
B.vecteur3f
C.vecteur3f
Dir.vecteur3f

; liste de points définissant unecourbe
Global Dim cx.f(10),Dim cy.f(10),Dim cz.f(10)

; liste de points recalculés avec un espacement normés
nbnewpoints=0

Global Dim Dx.f(nbnewpoints),Dim Dy.f(nbnewpoints),Dim Dz.f(nbnewpoints)

; 3 points pour l'exemple
cx(0)=10
cy(0)=10
cz(0)=10

cx(1)=15
cy(1)=20
cz(1)=8

cx(2)=18
cy(2)=24
cz(2)=15


; là, je découpe tous les segments entre les points en
; autant de tronçon de longueur 1 en 3d

k=0
j=0
For j=0 To 2-1
A\x = cx(j)   ; point de départ
A\y = cy(j)
A\z = cz(j)

B\x = cx(j+1)  ; point d'arrivée
B\y = cy(j+1)
B\z = cz(j+1)

C\x = A\x
C\y = A\y
C\z = A\z

; calcul la longueur du segment en 3d
; cette longueur deviendra le nombre de tronçons du segment de longueur 1
Lenght.f = Sqr(   (A\x - B\x) * (A\x - B\x) + (A\y - B\y) * (A\y - B\y) +  (A\z - B\z) * (A\z - B\z) )
nbnewpoints=nbnewpoints+Lenght

ReDim Dx(nbnewpoints): ReDim Dy(nbnewpoints): ReDim Dz(nbnewpoints)
If Lenght<>0 ; Prevent div 0
  Dir\x = (B\x - A\x) / Lenght
  Dir\y = (B\y - A\y) / Lenght
  Dir\z = (B\z - A\z) / Lenght
EndIf

Debug "Lenght "+StrF(Lenght,2)  ; longueur du segment = nombre de découpe
Debug "Depart : "+StrF(cx(j),1)+"   "+StrF(cy(j),1)+"   "+StrF(cz(j),1) ; point de départ
Debug "Arrivée : "+StrF(cx(j+1),1)+"   "+StrF(cy(j+1),1)+"   "+StrF(cz(j+1),1) ; point d'arrivée
Debug "Segment : "+StrF(Dir\x,1)+"   "+StrF(Dir\y,1)+"   "+StrF(Dir\z,1) ; vecteur du segment de longueur 1

For i= 1 To Lenght
  k=k+1
  Dx(k)=C\x + Dir\x*i ; calcul les coordonnées des nouveaux points
  Dy(k)=C\y + Dir\y*i
  Dz(k)=C\z + Dir\z*i
Debug "X : "+StrF(Dx(k),2)+", Y : "+StrF(Dy(k),2)+", Z : "+StrF(Dz(k),2)+"    Segment normé : "+StrF(Sqr(   (Dx(k-1) - Dx(k)) * (Dx(k-1) - Dx(k)) + (Dy(k-1) - Dy(k)) * (Dy(k-1) - Dy(k)) +  (Dz(k-1) - Dz(k)) * (Dz(k-1) - Dz(k)) ),2)
Next

cx(j+1)=Dx(k) ; remplace les coordonnées de l'ancien point par les
cy(j+1)=Dy(k) ; nouvelles coordonnées recalculées.
cz(j+1)=Dz(k) ; et prends ce point comme nouveau point de départ pour le prochain calcul...

Next

Only PureBasic makes it possible
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Pb pour calcul de coordonnées

Message par G-Rom »

ca avance , ca avance !
pense aussi à la syntaxe unix pour moi quand tu charges les medias ! c'est portable '/' au lieu de '\' & attention à la case ;)
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Pb pour calcul de coordonnées

Message par Cool Dji »

ok pour la syntaxe unix : j'oublie toujours la case !
=> déjà je n'utilise que les sprite3D, plus de water :wink: et je m'appliquerai pour le reste !
Only PureBasic makes it possible
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Pb pour calcul de coordonnées

Message par Backup »

.............
Dernière modification par Backup le sam. 01/oct./2011 11:18, modifié 1 fois.
Répondre