Kreis Punkte setzen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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:
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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
---------------------------
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

ubs ^^

naja passiert mal :-P
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag 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:
Kinder an die Macht http://scratch.mit.edu/
Antworten