Einzelnen Beitrag anzeigen

Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#30

Re: Wie bringe ich den Ball ins Rollen?

  Alt 16. Nov 2009, 20:17
Zitat von Lumpiluk:
Wo wir gerade dabei sind:
Wann lernt man in der Schule sowas mit Tangens, Sinus, Cosinus, Kreisberechnung, Vektorenberechnung etc.?! Ich bin jetzt in der 10. Klasse und bis jetzt hatten wir nur Kreisberechnung einmal kurz in Physik beim elektrischen Widerstand angesprochen
Das würde mich im Moment eher interessieren.
Hängt wohl vom Bundesland ab, bei mir (Hessen) kam es in der 9. Klasse dran, was regulär der 10. Klasse entspricht (war in einer G8-Klasse, die von unserer Schule freiwillig angeboten wurde). Allerdings ist die Trigonometrie, die man für Pong braucht, so billig, dass ich sie schon Jahre vorher angewendet habe, ohne zu wissen, dass man das "Trigonometrie" nennt.

Alles was man wissen muss ist folgendes:

cos(Alpha) gibt den Wert zurück, den man zur X-Koordinate hinzuaddieren muss, um sich in die entsprechende Richtung zu bewegen.
sin(Alpha) tut das gleiche für die Y-Koordinate.

sin() und cos() geben jeweils Gleitkommawerte im Bereich von -1 bis +1 zurück, das heißt, wenn man sich mit einer anderen Geschwindigkeit als 1 Pixel pro Zeiteinheit bewegen will, muss man die Werte mit einem Faktor - quasi der Geschwindigkeit - multiplizieren.

Dann gilt es noch zu beachten, dass Alpha im Bogenmaß statt im Gradmaß angegeben werden muss, was sich aber komplizierter anhört als es ist. Letztendlich bedeutet es bloß, dass Alpha im Bereich von 0 bis 2*Pi liegt, statt wie im Gradmaß von 0 bis 360. Umrechnen kann man die Einheiten ganz einfach per Dreisatz, oder man bedient sich der Funktionen aus der Unit math.

Wenn man statt eines Winkels die Geschwindigkeiten in der X- und Y-Richtung gegeben hat, bekommt man den Winkel über den Arcustangens heraus:
Alpha = arctan(Y/X);
Das Verhältnis von Y zu X bezeichnet man als Tangens, daher heißt die Funktion auch Arcustangens. Die Umrechnung ist möglich, weil der Tangens im Grunde auch nur eine andere Darstellungsform für den Winkel ist, was einem auch klar wird, wenn man mal etwas darüber nachdenkt. Ausnahme: Man kann die beiden Winkel 0° und 180° nicht voneinander unterscheiden, außerdem gibt es bei 90° und 270° eine Division durch 0. Daher sind hier im Vorfeld zusätzliche abfragen nötig, die man sich aber sparen kann, wenn man einfach gleich die Funktion arctan2() aus der Unit math benutzt.
Alpha = arctan2(Y, X);

Der Vollständigkeit halber noch wie man die Geschwindigkeit ausrechnet: Wie bereits erwähnt hast du durch die X- und Y-Geschwindigkeit die beiden Katheten (="kurze Seiten") eines rechtwinkligen Dreiecks gegeben. Die Geschwindigkeit entspricht also der Hypothenuse, die sich mit dem Satz des Pythagoras ausrechnen lässt:
C = sqrt(sqr(A) + sqr(B));

Ein Vektor ist übrigens eigentlich nichts anderes als das, was du unter Delphi als (eindimensionales) Array kennst, also eine Variable, die sich aus mehr als einem Wert zusammensetzt. Die Kombination von X- und Y-Koordinate ist also ein Vektor. Ebenso wäre die Kombination von Geschwindigkeit und Winkel ein Vektor.
Mit Vektoren kannst du ähnlich rechnen wie mit skalaren Werten (= normaler, eindimensionaler Wert), z.B. kannst du sie addieren und subtrahieren, indem du jeweils die X- und Y-Werte von zwei Vektoren zusammenaddierst. Es gibt auch kompliziertere Operationen, die bei mir aber leider auch noch nicht im Unterricht behandelt wurden, und aus Wikipedia bin ich zugegebenermaßen auch nicht wirklich schlau geworden.
  Mit Zitat antworten Zitat