Page 1 sur 1
Problème de math...
Publié : mar. 06/juin/2006 15:14
par Anonyme
les maths & moi sa fait 2
je voudrais savoir comment connaitre l'angle entre 2 points sur l'écran
en gros l'inverse de cela :
- en admetant que angle = 20
- le point(x,y) est à 10 pixel sur l'angle 20°.
x = x + 10 * cos(Angle * 2 * 3.1415 /360)
y = y + 10 * sin(Angle * 2 * 3.1415 /360)
Merki.
Publié : mar. 06/juin/2006 15:43
par Anonyme
bon , je reponds tout seul à mes questions
Voici une p'tite proc, pas très fiable , mais qui fonctionne à peu près :
Code : Tout sélectionner
#Deg = 2*#PI/360
Procedure Distance(x1,y1,z1,x2,y2,z2)
Protected Result.f
Result = Sqr( Pow(x1-x2,2) + Pow(y1-y2,2) + Pow(z1-z2,2) )
ProcedureReturn Result
EndProcedure
Procedure ReturnAngle(x1,y1,x2,y2)
Protected Distance.l,Xa.l,Ya.l
Distance = Distance(x1,y1,0,x2,y2,0)
For a = 0 To 360
Xa = X1 + Distance * Cos(a*#Deg)
Ya = Y1 + Distance * Sin(a*#Deg)
If Xa = x2 And Ya = y2
ProcedureReturn a
EndIf
Next a
EndProcedure
si quelqu'un peut m'aider à l'améliorer

Re: Problème de math...
Publié : mar. 06/juin/2006 16:22
par SPH
Cpl.Bator a écrit :je voudrais savoir comment connaitre l'angle entre 2 points sur l'écran
Il n'y a pas d'ANGLE entre 2 points. Il y en a un (4 meme) a l'intersection de 2 droites. Par contre, entre 2 points, il y a une DISTANCE !
Publié : mar. 06/juin/2006 16:37
par Anonyme
Il n'y a pas d'ANGLE entre 2 points. Il y en a un (4 meme) a l'intersection de 2 droites
tu es contradictoire, il y a forcement un angle entre le point A(x,y) et le point B(x,y). pour la distance je le SAIS aussi...
si tu as un exemple d'intersection, car je ne comprends pas du tout.
merci.
@++
Publié : mar. 06/juin/2006 17:01
par olivier
et en plus c'est vrai
Il existe un angle entre deux droite mais pas entre deux points. Sous entend tu les droites passant par l'origne 0,0, et tes points ?????
Il faut nous en dire plus .
Publié : mar. 06/juin/2006 17:03
par poshu
non, non... Il n'y a pas d'angle entre deux point, SPH a raison. un angle, c'est entre deux droites/segments.
Oups, doublé.
Publié : mar. 06/juin/2006 17:07
par AWEAR
En regardant son code, j'ai plutôt l'impression qu'il s'agit de l'angle entre les deux points et l'axes des abscisses.
Publié : mar. 06/juin/2006 17:23
par Anonyme
Un image vaut mieux qu'un long discourt.
ps :en tout cas en topographie, pour désigner un objectif (tir d'artillerie), on doit connaitre l'angle(en millième) pour déterminer les coordonées de notre objectif (Angle/Distance/site)
Publié : mar. 06/juin/2006 17:24
par SPH
AWEAR a écrit :En regardant son code, j'ai plutôt l'impression qu'il s'agit de l'angle entre les deux points et l'axes des abscisses.
Oui, je parierais aussi que c'est ce qu'il entend
EDIT : BINGO, c'etait bien ca
(100,100) et (200,200) ?
simple : 45°+180°
Plus serieusement, cela fait 180+X (mais je n'ai pas le temps la, je dois filer)

Publié : mar. 06/juin/2006 17:24
par djes
Je te recopie un truc vite fait, si ça peut t'aider...
Code : Tout sélectionner
;******************************************************************************************************
; returns the dot product between 2 vectors a and b.
Procedure.f dot(ax.f, ay.f, bx.f, by.f)
ProcedureReturn = (ax * bx) + (ay * by)
EndProcedure
;******************************************************************************************************
;Return the angle (rad) between two normalised vectors
Procedure.f angle_from_normalised_vectors(norm_vect1_x.f, norm_vect1_y.f, norm_vect2_x.f, norm_vect2_y.f)
angle.f=ACos(dot(norm_vect1_x,norm_vect1_y,norm_vect2_x,norm_vect2_y))
If norm_vect1_x<0
angle=#pi+#pi-angle
EndIf
ProcedureReturn angle
EndProcedure
;******************************************************************************************************
x.f=100
y.f=100
dist.f=Sqr(x*x+y*y)
;normalize
x/dist
y/dist
debug angle_from_normalised_vectors(x,y,0,1)
Publié : mar. 06/juin/2006 23:17
par Frenchy Pilou
Regarde donc cette BD en format PDF de Jean Pierre Petit
"La CAO sans peine"
c'est gratoche
http://www.savoir-sans-frontieres.com/J ... _peine.htm
Y a tout, et comme il avait fait cela en basic en plus
Tu peux regarder les autres aussi (y en a 25) c'est très intéressant
http://www.savoir-sans-frontieres.com/J ... nloads.htm
Publié : mer. 07/juin/2006 7:48
par olivier
Bon voila expliquer comme cela on peut te répondre.
Code : Tout sélectionner
Procedure calcul_angle(xa,ya,xb=150,yb=150)
StartDrawing(WindowOutput(0))
DrawingMode(#PB_2DDrawing_Transparent)
LineXY(xa,ya,xb,yb)
LineXY(xb,yb,xb+100,yb)
DrawText(xb-10,yb-10,"B")
;calcul de l'angle en radian
ar.f=ATan((ya-yb)/(xa-xb))
Debug ar
;conversion en degres (je suis pas un crac des radians, je préfère bosser avec les degrés)
ad=ar*360/2/3.1415
Debug ad
;ajout de la partie de l'angle suivant la position des points car Atang ne renvoie qu'un angle de -90 à 90
If xa<xb And ya<yb : ad=180+ad :EndIf ; cas haut gauche
If xa>xb And ya<yb : ad=360+ad :EndIf ;cas haut droite
If xa<xb And ya>yb : ad=180+ad :EndIf ; cas bas gauche
If xa>xb And ya>yb : :EndIf ; cas bas droite
; reconversion en radian si tu en as besoins
ar=ad*2*3.1415/360
DrawText(xa-10,ya-10,"A "+Str(ad)+" "+StrF(ar))
StopDrawing()
EndProcedure
xa=Random(200)
ya=Random(200)
OpenWindow(0,10,10,300,300,"clic sur l'image")
calcul_angle(xa,ya)
Repeat
event=WaitWindowEvent()
Select event
Case #WM_LBUTTONUP
calcul_angle(WindowMouseX(0),WindowMouseY(0))
EndSelect
Until event=#wm_close
Publié : mer. 07/juin/2006 9:45
par Anonyme
Merci à tous !
@Olivier , ton code est super
@Pilou , je connaissais déjà ces liens, merki quand même ^^
et merci encore aux autres d'avoir essayé d'aidé un deumeuré (moi) en math
@++
Publié : mer. 07/juin/2006 19:31
par Dräc
Ce qu’il y a de bien avec les maths, c’est qu’il existe plusieurs solutions…
Je ne sais pas si tu connais la notion de vecteur (incluant la norme d’un vecteur) et de produit scalaire ?
Ca risque d’etre un peu matheux à tes yeux, mais cela peut grandement t’aider dans tes problèmes d’angle, car la méthode est générale.
C'est la solution qu'a choisie djes.
Voici une bonne page
http://fr.wikipedia.org/wiki/Produit_scalaire
N’oublis pas que l’angle donné par l’inverse de cos() est entre 0 et PI.
Cet angle sera tjrs l’angle le plus petit défini pas tes deux vecteurs.