hi,
Ich sollte vielleicht mal erwähnen wofür man "soviel Mathematik" benötigt.
Ich habe ein Color Wheel welches 12 Farben darstellt. Wenn man nun in
eins der farbigen Flächen :lbdown ausführt bekommt man ja die aktuelle
Position. Nun hat man also {x1,y1} sowie das Zentrum mit {x0,y0}.
Aufgabe : wie ermittel ich in welches der 12 "Kuchenteile" der User nun
geclickt hat ?
und genau da setzt ATn2() an und berechnet auch den Koordinaten
Code: Alles auswählen
//** center
nX1 := ::aCenter[1]
nY1 := ::aCenter[2]
//** current
nX2 := aPos[1]
nY2 := aPos[2]
//** right angle point
nX3 := nx2
nY3 := ny1
...
/*
** Coder : VBHelper.com
*/
Function DotProduct(ax,ay,bx,by,cx,cy)
Local bax, bay, bcx, bcy
//** get vector coords
BAx := Ax - Bx
BAy := Ay - By
BCx := Cx - Bx
BCy := Cy - By
Return ( BAx * BCx + BAy * BCy )
/*
** Coder : VBHelper.com
*/
Function CrossProductLength(ax,ay,bx,by,cx,cy)
Local bax, bay, bcx, bcy
//** get vector coords
BAx = Ax - Bx
BAy = Ay - By
BCx = Cx - Bx
BCy = Cy - By
Return ( BAx * BCy - BAy * BCx )
damit erhalte ich nun nSine und nCosine und kann die ATn2() verwenden
hier nun die Lösung :
Code: Alles auswählen
/*
** Coder : VBHelper.com
*/
Function GetAngle(ax,ay,bx,by,cx,cy)
Local dot_product, cross_product
//** Get the dot product and cross product.
dot_product = DotProduct(Ax, Ay, Bx, By, Cx, Cy)
cross_product = CrossProductLength(Ax, Ay, Bx, By, Cx, Cy)
Return ATn2(cross_product, dot_product)
FUNCTION ATN2(nSin,nCos)
LOCAL nPi := PI()
LOCAL nAngle := 0
#define aTan ARCTAN
If nCos>0
nAngle:=aTan(nSin/nCos)
ElseIf nCos==0
If nSin>=0 /// {0,0} will erroneously result in an angle of 0
nAngle:= nPi/2
Else
nAngle:=-nPi/2
EndIf
Else
If nSin>0
nAngle:=nPi-aTan(nSin/-nCos)
Else
nAngle:=aTan(nSin/nCos)-nPi
EndIf
EndIf
RETURN nAngle
wie man an der #define sieht braucht man aber für die Lösung noch ATan.
eine ATan = ArcTan Lösung habe ich schnell gefunden, ich werde die in
die Wissensgroup anhängen.