Probleme mit Abstandsberechnung

Übersicht BlitzBasic Allgemein

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

bear1

Betreff: Probleme mit Abstandsberechnung

BeitragDi, März 02, 2004 19:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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

regaa

Betreff: Re: Probleme mit Abstandsberechnung

BeitragDi, März 02, 2004 19:11
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink .

Markus2

BeitragDi, März 02, 2004 20:20
Antworten mit Zitat
Benutzer-Profile anzeigen
abstand# = Sqr((x_ab# ^ 2) + (y_ab# ^ 2))
If abstand# < 1.0 Then

Das ABS kannst du dir sparen denn
? -1*-1
= +1

Alfadur

BeitragMi, März 03, 2004 2:52
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, März 03, 2004 11:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Warum liest du denn nicht was ich schon geschrieben hab, hab mir sogar die Mühe gemacht und seinen Code zitiert.
 

Edlothiol

BeitragMi, März 03, 2004 15:02
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Alfadur

Betreff: @regaa

BeitragMi, März 03, 2004 18:41
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

BeitragMi, März 03, 2004 19:00
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, März 05, 2004 13:27
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Rolling Eyes

Dann so :
? -8*-8
64
? sqr( 64 )
8

rambo256

BeitragFr, März 05, 2004 15:36
Antworten mit Zitat
Benutzer-Profile anzeigen
@ 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

BeitragFr, März 05, 2004 18:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Was denn? Man kann eine Kollisionsabfrage für Rechtecke machen??????????????????????????????????????????????????????????????

Uff. Sad

Wie? Das habe ich noch nie gesehen.
Ja, ne...

Zum virtuellen Staat Eranien:
http://www.eranien.de
Zu meinem Blog:
http://www.erixpage.de

Holzchopf

Meisterpacker

BeitragFr, März 05, 2004 18:11
Antworten mit Zitat
Benutzer-Profile anzeigen
RectsOverlap heisst das Zauberwort

http://www.blitzbase.de/befehle2d/rectsoverlap.htm

MfG
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

Edlothiol

BeitragFr, März 05, 2004 19:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Markus2 hat Folgendes geschrieben:
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 Rolling Eyes

Dann so :
? -8*-8
64
? sqr( 64 )
8
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.

rambo256

BeitragFr, März 05, 2004 21:44
Antworten mit Zitat
Benutzer-Profile anzeigen
@holzchopf: Genau!!
Is doch viel viel einfacher so oder?!

Markus2

BeitragMo, März 08, 2004 13:34
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, März 10, 2004 21:06
Antworten mit Zitat
Benutzer-Profile anzeigen
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
Print "Messdurchläufe: " + (n/1000000) + " mio"
Print
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 Very Happy
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.

Holzchopf

Meisterpacker

BeitragMi, März 10, 2004 21:23
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Rolling Eyes
Aber für gewisse anwendungen wirds dennoch ausreichen
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

Travis

BeitragMi, März 10, 2004 23:44
Antworten mit Zitat
Benutzer-Profile anzeigen
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!! Shocked

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.

user posted image

Bis mir das keiner Widerlegt, muss ich davon ausgehen, dass nicht meine Version sondern die Andere unpräzise ist. Laughing
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.

D2006

Administrator

BeitragMi, März 10, 2004 23:49
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, März 11, 2004 0:13
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group