Seite 3 von 3

Verfasst: 07.02.2008 21:08
von NicTheQuick
@Stargate:
Kürzer wäre vielleicht noch das hier:

Code: Alles auswählen

Procedure.d Winkel2(x.d, y.d)
  Protected a.d = ACos(x / Sqr(x * x + y * y))
  If y < 0 : a = -a + 2 * #PI : EndIf
  ProcedureReturn a * 180 / #PI
EndProcedure
Aber ob das schneller ist, weiß ich nicht, weil ich gerade keine Lust habe mir
den ASM-Output anzuschauen. :wink:

Verfasst: 07.02.2008 21:22
von STARGÅTE
das ist langdammer, alleiner wegen der Wurzel, da die ja auch nur ein Nährungsverfahren ist und damit auch länger dauert

Beispiel:

Code: Alles auswählen

Procedure.d Winkel2(x.d, y.d) 
  Protected a.d = ACos(x / Sqr(x * x + y * y)) 
  If y < 0 : a = -a + 2 * #PI : EndIf 
  ProcedureReturn a * 180 / #PI 
EndProcedure

Procedure.d Winkel(x.d,y.d)
 Protected Winkel.d = ATan(y/x)/#PI*180
 If x < 0 : Winkel + 180 : EndIf 
 ProcedureReturn Winkel
EndProcedure


a = timeGetTime_()
For n = 1 To 1000000
 z.f = Winkel(1,1)
Next n
b = timeGetTime_()-a


c = timeGetTime_()
For n = 1 To 1000000
 z.f = Winkel2(1,1)
Next n
d = timeGetTime_()-a


MessageRequester("", "ATan:"+Str(b)+Chr(10)+"ACos:"+Str(d))
---------------------------

---------------------------
ATan:370
ACos:907
---------------------------
OK
---------------------------

Verfasst: 07.02.2008 21:49
von NicTheQuick
Du Schummler! :wink:
Du holst bei Winkel2 als Referenzzeit die der ersten Schleife.

Code: Alles auswählen

c = timeGetTime_()
For n = 1 To 1000000
 z.f = Winkel2(1,1)
Next n
d = timeGetTime_()-a  ;das a is nix gudd, da komme c hin
Aber trotzdem ist ACos() ein bisschen langsamer, aber nicht so viel wie bei
deiner Schummelei. :wink:

///Edit:
Nochwas:
Witzigerweise ist das 'WinkelM'-Makro von mir nochmal ein bisschen schneller
als die 'Winkel'-Procedure.

Code: Alles auswählen

Macro WinkelM(x, y)
  (ATan(y / x) / #PI * 180.0 + (x < 0.0 And 1) * 180.0 + (y < 0.0 And x > 0) * 360.0)
EndMacro
Zeiten:
Winkel: 3792 ms
WinkelM: 3512 ms

Verfasst: 07.02.2008 22:14
von STARGÅTE
ubs ^^

naja passiert mal :-P

Verfasst: 12.02.2008 14:32
von Xaby
Cool wäre, wenn zwischen den beiden Punkten, wo die Maus wirklich auftrifft, eine gebogene Linie gezeichnet wird, weil ja sonst das Gebilde zwar nicht gepunktet, aber doch recht zackig und eckig aussieht.

Vielleicht müsste man dazu eine Bezierkurve zwischen den beiden Mauspunkten zeichen statt einer einfachen Linie.

:roll: