2 Prozeduren für 2D-Spiele - Winkel

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

btw: angle1+angle2 >= 0 ist zwar ne nette idee...

aber: bei angle1 = -5 und angle2 = 20 ....???????


... wie gesagt: erst testen, dann posten...

.. bei mir ist der test-requester gleich middebei :P
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
MLK
Beiträge: 267
Registriert: 01.11.2004 13:17
Wohnort: Hamburg

Beitrag von MLK »

tja ;-)
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 »

Robert Wünsche hat geschrieben:
NicTheQuick hat geschrieben:ein paar billige Procedures
... stimmt !

Dein code aus dem codearchiv ist langsammer als meiner !
:mrgreen: :mrgreen: :mrgreen:
Soviel dazu !
Tja, das machts :wink: .

PS: Warn zwar nur ein paar millisekunden / 10000 benchs, aber egal!
Wenn es nur ein paar Millisekunden Unterschied bei 10000 Tests waren, dann sind das wahrscheinlich eher Messfehler. Zeig doch mal deine Procedure. Von wegen urheberechtlich geschützt. Soll ich mal laut lachen? :lol:
Robert Wünsche
Beiträge: 243
Registriert: 29.08.2004 12:46
Wohnort: Irgendwo im nirgendwo
Kontaktdaten:

Beitrag von Robert Wünsche »

Code: Alles auswählen

#tests = 1000000

;robs code:
Procedure.f winkel(x1.f,y1.f,x2.f,y2.f) 
  a.f = x2-x1 
  b.f = y2-y1 
  c.f = Sqr(a*a+b*b) 
  winkel.f = ACos(a/c)*57.29577 
  If y1 < y2 : winkel=360-winkel : EndIf 
  ProcedureReturn winkel 
EndProcedure

;und weils so schön ist noch nics
; Ermittelt den Winkel zwischen zwei Punkten 
Procedure.f Object_GetAngle_Points(x1.f, y1.f, x2.f, y2.f) 
  Protected w.f 
  w = ATan((y2 - y1) / (x2 - x1)) * 57.295776 
  If x2 < x1 
    w = 180 + w 
  EndIf 
  If w < 0 : w + 360 : EndIf 
  If w > 360 : w - 360 : EndIf 
  
  ProcedureReturn w 
EndProcedure

;und meiner !
;Routine zum bestimmen des Winkels
;x2 ist der punkt, der die mitte ist und von diesem die gradzahl bestimmt wird!
;y2
Procedure.f G_2d_Winkel (p_x1.f,p_y1.f,p_x2.f,p_y2.f) 
  grad.f =(1/((p_y1-p_y2)/(p_x1-p_x2)))
  grad.f = ATan(grad.f)*57.29 
  ProcedureReturn grad.f
EndProcedure 

;und jetzt das duel (lead the code) gggg
time = ElapsedMilliseconds() 
Repeat
  winkel(0,0,90,90)
  test + 1
Until test > #tests

time1 =  ElapsedMilliseconds() - time

test = 0
time = ElapsedMilliseconds() 
Repeat
  Object_GetAngle_Points(0,0,90,90)
  test + 1
Until test > #tests

time2 = ElapsedMilliseconds() - time 


test = 0
time = ElapsedMilliseconds() 
Repeat
  G_2d_Winkel(0,0,90,90)
  test + 1
Until test > #tests

time3 = ElapsedMilliseconds() - time
MessageRequester("test - robs","Benchmark @ "+Str(#tests)+" Durchgängen :"+Str(time1))
MessageRequester("test - nics","Benchmark @ "+Str(#tests)+" Durchgängen :"+Str(time2))
MessageRequester("test - Robert Wünsches","Benchmark @ "+Str(#tests)+" Durchgängen :"+Str(time3))
Mein code ist mein code :mrgreen: , und deshalb ist er nicht uhrheberrechtlich geschützt !

OK nic !
Du hast gewonnen !
aber sau knapp !
Rob ist letzter !
Naja.

Ich kann meinen code ja auch noch optimieren !
Zuletzt geändert von Robert Wünsche am 11.11.2004 22:28, insgesamt 1-mal geändert.
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

Code: Alles auswählen

  If grad.f = 0
    grad.f = 0
  Else
  EndIf 
Was gedenkst du denn mit dieser Textstelle zu erreichen? :?
Robert Wünsche
Beiträge: 243
Registriert: 29.08.2004 12:46
Wohnort: Irgendwo im nirgendwo
Kontaktdaten:

Beitrag von Robert Wünsche »

ja was denn ?
:mrgreen:
Ich weiß, war sinnlos, damit wollte ich (eigentlich) die "variable ist nicht da" fehlermeflung im debuger vermeiden !
Egal !
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

dann erstell sie doch mit global grad.f vorher :freak:
Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

btw: bei mir ist

180/pi = 57.29577951

eure näherungen sind beide fehlerhaft >_<

und pi = 3.1415927 und nicht weniger :-P
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
MLK
Beiträge: 267
Registriert: 01.11.2004 13:17
Wohnort: Hamburg

Beitrag von MLK »

damit hättste gewonnen ;-)

Code: Alles auswählen

Procedure.f G_2d_Winkel (p_x1.f,p_y1.f,p_x2.f,p_y2.f) 
    ProcedureReturn ATan((1/((p_y1-p_y2)/(p_x1-p_x2))))*57.29
EndProcedure 
sofern der code an sich korrekt ist..
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

*LOL*
MLK hat geschrieben:sofern der code an sich korrekt ist..
wieder mal erst geposted, dann getestet ???? :wink:
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten