Bewegung zu einem ziel

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

US-Blitz

ehemals "SimssmiS"

Betreff: Bewegung zu einem ziel

BeitragFr, Feb 04, 2011 11:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
meine Frage ist wie ich einen vorbestimmten Vektor in seine x und y Werte zerteilen kann und wie ich vorher diesen Vektor ausrechne (mithilfe der jetzigen und der Endposition), wobei der Geschwindgkeitswert festgelegt und bekannt ist (2).

Vielen dank im Vorraus,
US-Blitz

BladeRunner

Moderator

BeitragFr, Feb 04, 2011 11:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn Du Start- und Ziel-Position hast kennst Du ja ihre Koordinaten. Die x- und y-Anteile sind nichts anderes als die Subtraktion der beiden Vektoren voneinander.
Was Du mit Geschwindigkeitswert meinst, ist mir unklar, aber wenn Du den Betrag des Vektors meinen solltest (was ja seine Länge darstellt): Das ist einfach Die Wurzel der Summe der Quadrate der Vektorkomponenten (also ein einfacher Pythagoras).
Hilft das weiter?
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

US-Blitz

ehemals "SimssmiS"

BeitragFr, Feb 04, 2011 11:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke Blade,
Wahrscheinlich ist der nächste Schritt sehr einfach, doch trotzdem blicke ich grade nicht durch. Ich würde noch gerne die Anteile berechnen, wenn festgelegt ist, dass das Objekt sich 2 Pixel pro Frame bewegt.

BladeRunner

Moderator

BeitragFr, Feb 04, 2011 11:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Dazu musst Du den Vektor auf die Länge 2 bringen:
Du dividierst die Komponenten des Vektors durch seinen Betrag. Damit erhältst Du den Einheitsvektor. Diesen nimmst Du mit der gewünschten Länge mal (also auch wieder die einzelnen Komponenten).
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

US-Blitz

ehemals "SimssmiS"

BeitragFr, Feb 04, 2011 12:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Also so?

Code: [AUSKLAPPEN]

      xdistanz=x_end_position-x
      ydistanz=y_end_position-y
      
      vector_betrag=xdistanz²+ydistanz²
      xadd=(xdistanz/vector_betrag)*2
      yadd=(ydistanz/vector_betrag)*2

hazumu-kun

BeitragFr, Feb 04, 2011 16:30
Antworten mit Zitat
Benutzer-Profile anzeigen
genau so.
EDIT: Oh wie peinlich dass ich das mit der wurzel übersehen hab...
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent
  • Zuletzt bearbeitet von hazumu-kun am Fr, Feb 04, 2011 21:12, insgesamt einmal bearbeitet

BladeRunner

Moderator

BeitragFr, Feb 04, 2011 16:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, denn da fehlt noch die Wurzel bei Vektor_betrag. Zudem wirst du unter BB mit ^2 statt ² arbeiten müssen.
Denke weiterhin daran dass alle verwendeten Variablen Floats (#) sein müssen.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

US-Blitz

ehemals "SimssmiS"

BeitragFr, Feb 04, 2011 16:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke aber jetzt kommt bei mir immer "Iteger devided by Zero"
hier mal der ganze Code:
Code: [AUSKLAPPEN]

Graphics 1280,1024,32,3
SetBuffer BackBuffer()
SeedRnd MilliSecs()

Global sun=LoadImage ("sunny.png")
MaskImage sun,255,0,255
Local xh=500
Local yh=400
Local hov=Rnd(0,1)
Local oot=Rnd(0,1)
Local xend=500
Local yend=400
Local speed=1
Local xadd=0
Local yadd=0
Local xdis=0
Local ydis=0

Local vec=1

Repeat
   If xh=xend And yh=yend Then
      hov=Rnd(0,1)
      oot=Rnd(0,1)
      If hov=0 Then   ;horiontal
         
         If oot=0 Then   ;links
            xend=1
            yend=Rnd(0,730)
         EndIf
         
         If oot=1 Then   ;rechts
            xend=1000
            yend=Rnd(0,730)
         EndIf
         
      EndIf
      
      If hov=0 Then   ;vertikal
         
         If oot=0 Then   ;oben
            xend=Rnd(0,1000)
            yend=1
         EndIf
         
         If oot=1 Then   ;unten
            xend=Rnd(0,1000)
            yend=730
         EndIf
         
      EndIf
      
      xdis=xend-xh
      ydis=yend-yh
      
      vec=(xdis*xdis)+(ydis*ydis)
      xadd=(xdis/vec)*2
      yadd=(ydis/vec)*2
      
      
   EndIf
   
   
   
   xh=xh+xadd
   yh=yh+yadd
   
   Cls
   DrawImage sun,xh,yh
   Flip
   If KeyHit(1) Then End
   
Forever

BladeRunner

Moderator

BeitragFr, Feb 04, 2011 16:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Siehe mein vorheriger Beitrag. Zudem ist es natürlich sinnvoll zu Prüfen ob denn die Zielkoordinate schon erreicht ist.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

feider

ehemals "Decelion"

BeitragFr, Feb 04, 2011 16:45
Antworten mit Zitat
Benutzer-Profile anzeigen
BladeRunner hat Folgendes geschrieben:
Denke weiterhin daran dass alle verwendeten Variablen Floats (#) sein müssen.


Momentan teilst du wahrscheinlich durch eine zahl, so dass das ergebnis zwischen 0 und 1 liegt. da du integers verwendest, wird auf 0 abgerundet. wenn du dann dadurch teilst, geht das nicht.

US-Blitz

ehemals "SimssmiS"

BeitragFr, Feb 04, 2011 18:43
Antworten mit Zitat
Benutzer-Profile anzeigen
So jetzt aber. Das Bild verschwindet jetzt einfach. Ich sehe es auch nich aufblitzen. Was mache ich falsch?

BlitzBasic: [AUSKLAPPEN]
Graphics 1280,1024,32,3
SetBuffer BackBuffer()
SeedRnd MilliSecs()

Global heart=LoadImage ("sunny.png")
MaskImage heart,255,0,255
Local xh#=500
Local yh#=400
Local hov=Rnd(0,1)
Local oot=Rnd(0,1)
Local xend=500
Local yend=400
Local speed#=1
Local xadd#=0
Local yadd#=0
Local xdis#=0
Local ydis#=0

Local vec=1

Repeat
If xh=xend And yh=yend Then
hov=Rnd(0,1)
oot=Rnd(0,1)
If hov=0 Then ;horiontal

If oot=0 Then ;links
xend=1
yend=Rnd(0,730)
EndIf

If oot=1 Then ;rechts
xend=1000
yend=Rnd(0,730)
EndIf

EndIf

If hov=0 Then ;vertikal

If oot=0 Then ;oben
xend=Rnd(0,1000)
yend=1
EndIf

If oot=1 Then ;unten
xend=Rnd(0,1000)
yend=730
EndIf

EndIf

xdis=xend-xh
ydis=yend-yh

vec=(xdis*xdis)+(ydis*ydis)
xadd=(xdis/vec)*1
yadd=(ydis/vec)*1


EndIf



xh=xh+xadd
yh=yh+yadd

Cls
DrawImage heart,xh,yh

Flip
If KeyHit(1) Then End

Forever
 

Jumper

BeitragFr, Feb 04, 2011 19:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Schreib doch mal dies hinter diesen Zeilen:
BlitzBasic: [AUSKLAPPEN]
                xdis=xend-xh
ydis=yend-yh
; Hier einfügen
Print xdis
Print vec
Print xadd
Print yadd
WaitKey


und schau mal mir was für Parameter Du rechnest. 'vec' ist in der Regel 0, und geteilt durch Null geht nun mal nicht. In der ganzen Berechnung ist mindestens ein Denkfehler, ohne das ich es jetzt getestet hätte. Schreib mal die Print Zeilen ins Programm, dann wirst Du schnell dahinter kommen was an der Berechnung falsch ist.

BladeRunner

Moderator

BeitragFr, Feb 04, 2011 19:38
Antworten mit Zitat
Benutzer-Profile anzeigen
...und die Wurzel fehlt auch immer noch.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

US-Blitz

ehemals "SimssmiS"

BeitragFr, Feb 04, 2011 22:10
Antworten mit Zitat
Benutzer-Profile anzeigen
So jetzt müsste das mit der Wurzel richtig sein und alle Variabeln sind Floats. Doch wie jetzt weiter und warum soll vec meistens 0 sein?

BlitzBasic: [AUSKLAPPEN]
Graphics 1280,1024,32,3
SetBuffer BackBuffer()
SeedRnd MilliSecs()

Global heart=LoadImage ("sunny.png")
MaskImage heart,255,0,255
Local xh#=500
Local yh#=400
Local hov#=Rnd(0,1)
Local oot#=Rnd(0,1)
Local xend#=500
Local yend#=400
Local speed#=1
Local xadd#=0
Local yadd#=0
Local xdis#=0
Local ydis#=0

Local vec#=1

Repeat
If xh=xend And yh=yend Then
hov=Rnd(0,1)
oot=Rnd(0,1)
If hov=0 Then ;horiontal

If oot=0 Then ;links
xend=1
yend=Rnd(0,730)
EndIf

If oot=1 Then ;rechts
xend=1000
yend=Rnd(0,730)
EndIf

EndIf

If hov=0 Then ;vertikal

If oot=0 Then ;oben
xend=Rnd(0,1000)
yend=1
EndIf

If oot=1 Then ;unten
xend=Rnd(0,1000)
yend=730
EndIf

EndIf

xdis=xend-xh
ydis=yend-yh

vec=Sqr ((xdis*xdis)+(ydis*ydis))
xadd=(xdis/vec)*1
yadd=(ydis/vec)*1


EndIf



xh=xh+xadd
yh=yh+yadd

Cls
DrawImage heart,xh,yh

Print xdis
Print vec
Print xadd
Print yadd
WaitKey

Flip
If KeyHit(1) Then End

Forever

Xeres

Moderator

BeitragFr, Feb 04, 2011 22:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Keine Ahnung was dein Block mit hov und oot bringen soll, aber das der Vektor 0 ist, ist ja logisch;
Code: [AUSKLAPPEN]
Local xh#=500
Local yh#=400
Local xend#=500
Local yend#=400
[...]
xdis=xend-xh
ydis=yend-yh


Nachtrag:
Ach, du willst feststellen, ob das ziel erreicht ist? Dann ist dir hoffentlich klar...
Code: [AUSKLAPPEN]
If xh#=xend#
400.0000 <> 399.9997
...dass Floatzahlen mit ziemlicher Sicherheit nie genau gleich sind.
Stattdessen, benutze doch den Vektor... Du rechnest ja die Distanz zum ziel aus, benutze
Code: [AUSKLAPPEN]
If vec# < 5
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Noobody

BeitragFr, Feb 04, 2011 22:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Mehrere Probleme:

- hov und oot sind Floats, obwohl du ihnen eigentlich nur die Werte 0 oder 1 zuweisen willst. Ausserdem verwendest du Rnd (welches Floats generiert) statt Rand. Das heisst, dass in hov und oot Werte zwischen 0 und 1 (z.B. 0.135497) liegen. Das bedeuted, dass die If-Ausdrücke nie ausgeführt werden, da z.B. 0.135497=0 nie wahr sein wird. Mache also hov und oot als Integer (das # wegnehmen) und benutze bei hov und oot Rand statt Rnd.

- Du prüfst zweimal, ob hov=0 ist. Das muss natürlich einmal hov=0 und einmal hov=1 heissen.

- Du zeichnest alles, dann löschst du den Bildschirm mit Cls und dann lässt du alles mit Flip anzeigen. Logisch, dass da alles nur schwarz bleibt Razz Setze das Cls an den Anfang der Schleife.

- xh=xend And yh=yend wird nur ganz am Anfang wahr sein. Falls der Punkt beim zweiten Mal in die Nähe des Ziels kommt, wird er natürlich nie exakt auf dem Zielpunkt landen. Falls also dein Ziel z.B. als xend=100 und yend=200 gewählt wird, ist dein herumfliegender Punkt vielleicht mal auf xh=100.01234 und yh=200.4312, also sehr in der Nähe, aber nie exakt drauf. Daher bietet es sich hier an zu schauen, ob z.B. der Punkt in einem gewissen Radius zum Zielpunkt ist.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group