Probleme mit Abstandsberechnung
Übersicht

![]() |
bear1Betreff: Probleme mit Abstandsberechnung |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi,
ich hab hier ein winziges Fangspiel gemacht, bei dem sich 2 Punkte jagen. Das Problem ist nur, dass die Abstandsberechnung eine Meldung ausgibt, egal ob die zwei Punkte sich näher kommen oder nicht. ###### .anfang Global X = 210 Global y = 400 Graphics 1024,768, 2 SetBuffer BackBuffer() Text 500,300," Fangen" Text 500,330," von Eric Haberstroh" Text 500,360,"Zum Starten Enter drücken" WaitKey If KeyHit(28) Then Gosub spiel Else Goto anfang .spiel While Not KeyHit(1) Cls abstand#(x1#,y1#,x2#,y2#) Text 2,2,"Zum Beenden ESC drücken" Color 255,0,0 Line 2,2,2,1023 If KeyDown(200) Then y = y - 2 If KeyDown(208) Then y = y + 2 If KeyDown(203) Then x = x - 2 If KeyDown(205) Then x = x + 2 Rect X,Y, 10,10,1 Color 0,255,0 ;Alles auf Rot setzen If KeyDown(17) Then Y_2 = y_2 - 2 If KeyDown(31) Then Y_2 = y_2 + 2 If KeyDown(30) Then X_2 = x_2 - 2 If KeyDown(32) Then X_2 = x_2 + 2 Rect X_2,Y_2,10,10,1 Flip Wend Function abstand#(x1#,y1#,x2#,y2#) x_ab# = x1# - x2# ; x-Abstand y_ab# = y1# - y2# ; y-Abstand abstand# = Abs(Sqr((x_ab# ^ 2) + (y_ab# ^ 2))) ; Mittels Pythagoras den Abstand ausrechnen. If abstand# < 1 Then Text 500,330,"Gefangen!" EndIf Return abstand# End Function End ##### Danke im Voraus |
||
Ja, ne...
Zum virtuellen Staat Eranien: http://www.eranien.de Zu meinem Blog: http://www.erixpage.de |
![]() |
regaaBetreff: Re: Probleme mit Abstandsberechnung |
![]() Antworten mit Zitat ![]() |
---|---|---|
bear1 hat Folgendes geschrieben: Hi,
abstand#(x1#,y1#,x2#,y2#) If KeyDown(17) Then Y_2 = y_2 - 2 If KeyDown(31) Then Y_2 = y_2 + 2 If KeyDown(30) Then X_2 = x_2 - 2 If KeyDown(32) Then X_2 = x_2 + 2 Du benutzt die Variable x_2 übergibst aber x2. Du solltest schon die Variablen übergeben die du auch benutzt ![]() |
||
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
abstand# = Sqr((x_ab# ^ 2) + (y_ab# ^ 2))
If abstand# < 1.0 Then Das ABS kannst du dir sparen denn ? -1*-1 = +1 |
||
![]() |
Alfadur |
![]() Antworten mit Zitat ![]() |
---|---|---|
du benutzt im main x,y und x_2 und y_2, übergibst an die abstandsfunktion die variablen x1,y1,x2,y2... | ||
A Cray is the only computer that runs an endless loop in less than four hours. |
![]() |
regaa |
![]() Antworten mit Zitat ![]() |
---|---|---|
Warum liest du denn nicht was ich schon geschrieben hab, hab mir sogar die Mühe gemacht und seinen Code zitiert. | ||
Edlothiol |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Markus2 hat Folgendes geschrieben: abstand# = Sqr((x_ab# ^ 2) + (y_ab# ^ 2))
If abstand# < 1.0 Then Das ABS kannst du dir sparen denn ? -1*-1 = +1 Auch das Sqr kann er sich sparen, denn Sqr(1) ist auch 1. Er kann also auch das Ergebnis ohne Sqr() aussenrum mit 1 vergleichen. |
||
![]() |
AlfadurBetreff: @regaa |
![]() Antworten mit Zitat ![]() |
---|---|---|
@regaa: falls du mit mir geredet hast, dann lies dir nochmal deine und meine antwort durch. gibt nen kleinen aber feinen unterschied. und damit du nicht raten brauchst, sag ichs dir gleich....bei dir war nur von der x2/y2 koordinate die rede, der gute verfasser dieses threads hatte aber auch noch probleme mit der x1/y1 koordinate...
aber das mit dem code editieren hast du fein gemacht... |
||
A Cray is the only computer that runs an endless loop in less than four hours. |
![]() |
regaa |
![]() Antworten mit Zitat ![]() |
---|---|---|
Kannst ihm ja auch den Code berichtigen wenn du willst, ich hab ihn nur auf die Spur gebracht, er hat da sicherlich noch mehr Fehler gehabt. | ||
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Edlothiol hat Folgendes geschrieben: ...Auch das Sqr kann er sich sparen, denn Sqr(1) ist auch 1. Er kann also auch das Ergebnis ohne Sqr() aussenrum mit 1 vergleichen.
Scherzkeks ![]() Dann so : ? -8*-8 64 ? sqr( 64 ) 8 |
||
![]() |
rambo256 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@ Bear1: Wieso machst du nicht einfach eine Collisionsabfrage?! Is doch viel einfacher als mit Formeln den Abstand zu errechnen. Oder du guckst einfach,wann sich die x- und y-koordinaten gleichen und gibst dann die Meldung "Gefangen" raus?! | ||
![]() |
bear1 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Was denn? Man kann eine Kollisionsabfrage für Rechtecke machen??????????????????????????????????????????????????????????????
Uff. ![]() Wie? Das habe ich noch nie gesehen. |
||
Ja, ne...
Zum virtuellen Staat Eranien: http://www.eranien.de Zu meinem Blog: http://www.erixpage.de |
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
RectsOverlap heisst das Zauberwort
http://www.blitzbase.de/befehle2d/rectsoverlap.htm MfG |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
Edlothiol |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Markus2 hat Folgendes geschrieben: Edlothiol hat Folgendes geschrieben: Ja, klar. Aber er will ja nur wissen, ob die Wurzel < oder > 1 ist. Und da kann er das auch ohne Wurzel machen, denn die Wurzel von 1 ist 1, die Wurzel von Zahlen über 1 ist auch größer als 1, und die Wurzel von Zahlen unter 1 ist auch kleiner als 1.
...Auch das Sqr kann er sich sparen, denn Sqr(1) ist auch 1. Er kann also auch das Ergebnis ohne Sqr() aussenrum mit 1 vergleichen.
Scherzkeks ![]() Dann so : ? -8*-8 64 ? sqr( 64 ) 8 |
||
![]() |
rambo256 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@holzchopf: Genau!!
Is doch viel viel einfacher so oder?! |
||
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Edlothiol hat Folgendes geschrieben: ...Ja, klar. Aber er will ja nur wissen, ob die Wurzel < oder > 1 ist. Und da kann er das auch ohne Wurzel machen, denn die Wurzel von 1 ist 1, die Wurzel von Zahlen über 1 ist auch größer als 1, und die Wurzel von Zahlen unter 1 ist auch kleiner als 1.
Hm, aber für den Abstand benutzt man die Differenz X und Y zum anderen Punkt und da braucht man die Quadratwurzel . Wie du das meinst darf die Differenz nicht größer als 1 werden . Den nächsten Pixel kann man einfacher testen das stimmt . |
||
![]() |
Travis |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich weiss ja nicht, ob ihr es noch gebrauchen könnt, aber ich habe mal im Rahmen meines Neuen Projektes eine eigene Abstandsfunktion geschrieben. Sie ist etwa 7 mal so schnell, wie die andere.
Code: [AUSKLAPPEN] ; --- Abstand-Funktion (fast) --- Function Abstand(x1,y1,x2,y2) LangAbst = (Abs(X1 - X2) + Abs(Y1 - Y2)) If Abs(X1 - X2) < Abs(Y1 - Y2) Then KAbst = Abs(X1 - X2) If Abs(Y1 - Y2) < Abs(X1 - X2) Then KAbst = Abs(Y1 - Y2) If Abs(X1 - X2) = Abs(Y1 - Y2) Then KurzAbst = (LangAbst/2): Return KurzAbst KurzAbst = LangAbst - KAbst Return KurzAbst End Function ; --- Abstand-Funktion (fast) --- ; --- Abstand-Funktion (slow) --- Function Abstand2(x1,y1,x2,y2) xhypo = x1 - x2 yhypo = y1 - y2 Abstand = Sqr((xhypo ^ 2) + (yhypo ^ 2)) Return Abstand End Function ; --- Abstand-Funktion (slow) --- ; --- Zeitmessung --- AppTitle "Abstandsfunktionen" n = 20000000 ; Meßdurchläufe Print "Beliebige Taste zum starten..." WaitKey start = MilliSecs() For i = 1 To n Abstand = Abstand(350,150,200,200) Next zeit# = MilliSecs()-Start Print "Messdurchläufe: " + (n/1000000) + " mio" Print "Benötigte Zeit: " + zeit# + " ms" Print "Pro Durchglauf: " + zeit#/n * 1000000 + " ns" ; ns WaitKey End ; --- Zeitmessung --- Mal zum Vergleich: Bei 20mio Messdurchläufen: Abstand2 (slow) = 456,25 ns pro Durchlauf Abstand (fast) = 62,9 ns pro Durchlauf Das kann die Framerate schon um einiges hochschrauben ![]() |
||
www.funforge.org
Ich hasse WASD-Steuerung. Man kann alles sagen, man muss es nur vernünftig begründen können. |
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sehr schön, doch leider ist die schnelle Funktion unpräzise.
Hier mal ein Auszug von ein paar Werten, die ich getestet habe: Code: [AUSKLAPPEN] x1, y1, x2, y2, Afast, Aslow 100, 100, 200, 200, 100, 141 200, 100, 200, 200, 100, 100 250, 100, 200, 200, 100, 112 350, 100, 200, 200, 150, 180 400, 100, 200, 200, 200, 224 500, 100, 200, 200, 300, 316 Wie du siehst ist die Abweichung nichtmal proportional ![]() Aber für gewisse anwendungen wirds dennoch ausreichen |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
![]() |
Travis |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das ist ja verblüffend. Ich habe mal einen Automatischen Vergleich von 10000 Abstandsberechnungen beider Funktionen gemacht. Dabei gab es In einem Koordinatensystem von 1000x1000 Pixel eine Abweichung von bis zu 390 Pixeln!! ![]() Ich habe die andere langsame Abstandsberechnung aber mal in mein Programm integriert. Dort habe ich ein Spielfeld von 10x10 Feldern und ich will den Abstand von Feld A zu Feld B ermitteln. Mit meiner Funktion funzt alles Prima, aber wenn ich die Andere nehme, kommt es zu erstaunlichen Fehlern. ![]() Bis mir das keiner Widerlegt, muss ich davon ausgehen, dass nicht meine Version sondern die Andere unpräzise ist. ![]() |
||
www.funforge.org
Ich hasse WASD-Steuerung. Man kann alles sagen, man muss es nur vernünftig begründen können. |
![]() |
D2006Administrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
es geht 5 felder nach rechts und 5 felder nach oben.
nach pythagoras: hyp = SQR ( 5² + 5² ) hyp = SQR ( 25 + 25) hyp = SQR ( 50 ) mit TR: 7,0710678118654400844362104849 MfG |
||
![]() |
Travis |
![]() Antworten mit Zitat ![]() |
---|---|---|
Stimmt, das leuchtet ein.
Code: [AUSKLAPPEN] A²+B²=C²
Aber für meine Zwecke ist da eine Sieben unbrauchbar, da die Felder ja eindeutig nicht soweit außeinander liegen. Wenn ich davon ausgehe, dass ich wissen möchte, wie oft ich meinen Spielstein verschieben muß, um auf das Zielfeld zu gelangen, komme ich auf einen Wert von 5. Der wird auch von meiner Abstandsberechnung angezeigt. |
||
www.funforge.org
Ich hasse WASD-Steuerung. Man kann alles sagen, man muss es nur vernünftig begründen können. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group