Bewegung zu einem ziel
Übersicht

![]() |
US-Blitzehemals "SimssmiS"Betreff: Bewegung zu einem ziel |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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-Blitzehemals "SimssmiS" |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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-Blitzehemals "SimssmiS" |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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-Blitzehemals "SimssmiS" |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
feiderehemals "Decelion" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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-Blitzehemals "SimssmiS" |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
Jumper |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Schreib doch mal dies hinter diesen Zeilen:
BlitzBasic: [AUSKLAPPEN] xdis=xend-xh 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. |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
...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-Blitzehemals "SimssmiS" |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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#
...dass Floatzahlen mit ziemlicher Sicherheit nie genau gleich sind.
400.0000 <> 399.9997 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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() - 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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group