ATn2() aus den "Tools"

Auf dem Weg von Clipper, FoxPro u.ä. nach Xbase++

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

ATn2() aus den "Tools"

Beitrag von AUGE_OHR »

hi,

ich habe hier die Function ATn2() aus den "Tools".
Wenn ich das richtig sehe ich das der ArcTan() ?

ich finde zu ArcTan() aber immer nur 1 Parameter und ich brauche 2.
Purpose

Calculates the radiant of an angle from sine and cosine

Syntax

Atn2( <nSine> , ;
<nCosine> ;
) --> nRadiant
nun würde ich gerne die "Tools" rauswerfen und suche nun das Equivalent
dazu in "pure" Xbase++ ... (jaja 10 Klasse Mathe ... hab da wohl nicht
aufgepasst ... )
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Beitrag von AUGE_OHR »

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.
gruss by OHR
Jimmy
Antworten