Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wie bringe ich den Ball ins Rollen? (https://www.delphipraxis.net/143449-wie-bringe-ich-den-ball-ins-rollen.html)

Sherlock 16. Nov 2009 16:21

Re: Wie bringe ich den Ball ins Rollen?
 
Fussel, ich nehme an Deine Kugel ist in der abgebildeten Situation gerade vom rechten Paddel losgeflogen... sonst passt das Dreieck nicht. :)

Den Winkel kennst Du schon, hatte ich zumindest aus Deinem Anfangspost gelesen. Was Du jetzt brauchst ist eine Veränderung der Position der Kugel auf der Hypotenuse. Dazu musst Du dir verinnerlichen, daß die Bewegung der Kugel eben zwei Bestandteile hat: Einen waagrechten und einen senkrechten Teil. Das ganze in ein Koordinatensystem gemalt macht es Dir deutlicher. WEnn Du gleich noch berücksichtigst, daß in Delphi das Koordinatensystem oben links seinen Ursprung (x=0 und y=0) hat, und x bei Delphi mit Left und y eben mit Top bezeichnet werden kann, dann bist Du ein ganzes Stück weiter.

Um die Kugel zu bewegen musst Du sie also um ein paar Pixel in X-Richtung und ein paar Pixel in Y-Richtung bewegen. Such Dir eines davon aus, das andere kannst Du dann berechnen. Nehmen wir mal an, Du willst die Y-Richtung vorgeben, dann mal in Dein Bild einfach von Deiner Kugel ausgehend einen Strich von Oben nach Unten. Dieser Strich ist parallel zur Ankathete. Die Länge des Strichs kennst Du ja, hast Du selber vorgegeben. Um Dein Dreieck vollzukriegen musst Du einfach einen weiteren Strich vom Ende Deines ersten Strichs malen, bis er wieder durch die Hypothenuse geht. Die länge dieses Strichs kannst Du ausrechnen, denn Dir ist bekannt: Länge der neuen Ankathete und der Winkel ist gleich geblieben(!!!!)

Aus der Formel: tan(a) = Gegenkathete/Ankathete müsstest Du jetzt was machen können ;)

Sherlock

Wolfgang Mix 16. Nov 2009 16:25

Re: Wie bringe ich den Ball ins Rollen?
 
Sorry, die Antwort war an jfheins gerichtet, nicht an Dich.
Inzwischen glaube ich aber, daß Du ohne Mathe-Kenntnisse nicht weiterkommst.
Auch wenn wir hier Codeschippsel liefern würden, glaube ich, Du wirst sie
nicht verstehen. Deswegen bleibe ich erstmal im Hintergrund.

Gruß

Wolfgang

Medium 16. Nov 2009 16:30

Re: Wie bringe ich den Ball ins Rollen?
 
Ich bin mittlerweile schwer davon überzeugt, dass der TE es einfach nicht verstehen will, und dies uns noch so oft in suizid-naher Weise vorlamentieren wird bis wieder irgend ein Schnösel ein weichers Herz kriegt, ihm fertigen (und vermutlich noch grottig formatierten) Quellcode vor die Füße wirft, mit dem er dann in 4 Tagen wieder hier auf der Matte stehen wird, weil es ohne das Verständnis irgendwie nicht möglich war das zweite Paddel einzubauen :roll:


Edit: @fussel: Wenn du mit "einfacheren" trigonometrischen Funktionen auskommen willst, mach's vektoriell! Da brauchts nur an einer Stelle einen Sinus und einen Cosinus.

Wolfgang Mix 16. Nov 2009 16:34

Re: Wie bringe ich den Ball ins Rollen?
 
:-D

shmia 16. Nov 2009 17:06

Re: Wie bringe ich den Ball ins Rollen?
 
Eine Reflektion an waagerechten oder senkrechten Linien ist eigentlich ganz einfach.
Ein Ball hat in x- und y-Richtung eine bestimmte Geschwindigkeit.
Diese kann positiv oder negativ sein und sollte eine Flieskommazahl (oder Festkommazahl) sein.
Trifft der Ball auf eine senkrechte Wand ändert sich nur die Geschwindigkeit in x-Richtung:
Delphi-Quellcode:
speed_x := speed_x * (-1.0);   // bzw. speed_x := -speed_x
Bei einer waagerechten Wand gilt das analog für die Y-Geschwindigkeit.
Nur wenn die Reflektionsebene schräg zum Koordinatensystem stehen braucht man die trig. Funktionen.

Hier ungetestet eine Reflektion an einer senkrechten Wand:
Delphi-Quellcode:
// neue Position berechnen
ball_x := Round(ball_x+speed_x);
ball_y := Round(ball_y+speed_y);

// 500 ist der X-Wert der senkrechten Wand
if ball_x > 500 then
begin
  // ball ist quasi nach rechts durch die Wand geschlagen
  // also muss er genau um dieses Stückchen zu viel zurückgespiegelt werden

  ball_x := ball_x - 2 *(ball_x-500); // spiegeln
 
  speed_x := -speed_x; // die neue Geschwindigkeit
end;

Fussel9 16. Nov 2009 19:17

Re: Wie bringe ich den Ball ins Rollen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
@ Sherolck

DANKE :thumb:
das war eine hilfreiche Antwort, hab da noch mal eine Skizze gemacht kannst du mir da vielleicht noch mal drüberschaun?

@ Medium

Was bis du denn für einer?
Hast in dem ganzen Thread noch nix geschrieben und kommst dann an und laberst was von suizidal und nicht verstehen wollen ....
Machst du das immer so???

Mit verweis zum Mod--> was haben solche Leute hier zu suchen?

Lumpiluk 16. Nov 2009 19:37

Re: Wie bringe ich den Ball ins Rollen?
 
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.


Ein Pong-Spiel habe ich auch irgendwann mal geschrieben. Das mit der Reflektion habe ich genauso gemacht, wie shmia das schon beschrieben hat. Man kann zum Beispiel zwei Real-Variablen nehmen, die am Anfang mit einem Beliebigen Wert füllen (1,1 würde mit Canvas dann bedeuten, dass der Ball nach unten rechts 'rollt') und den Ball nach einem bestimmten Zeitintervall um diese Werte verschieben. Bei einem Aufprall werden die dann entsprechend mit -1 multipliziert...
Wenn du willst, kannst du nach einem Aufprall am Paddel je nach Entfernung zu dessen Mittelpunkt die Richtung ändern!

Ist vielleicht nicht die beste Lösung, aber so konnte ich mich vor Winkelberechnungen drücken :)

Medium 16. Nov 2009 19:42

Re: Wie bringe ich den Ball ins Rollen?
 
Lies dir deine Beiträge einfach nochmal nacheinander durch, und sag mir wie ich mir dabei nicht vorstellen soll wie du schon mit Schlinge um den Hals vorm PC sitzt und deine Neuronen in Richtung "was neues lernen" abgedichtet hast? Und DANN in Beitrag 20 auch noch patzig werden, pfft.
(Man kann nämlich sogar hervorragend Hilfe bekommen, ohne sich auf Staubkörnchengröße klein zu machen und verbal wie unwürdiger Bauer vorm Kaiser rumzurutschen. Die Art kann ich ja so GARnicht. Und ich bin mir auch nicht zu schade das direkt und ohne rosa Tufftuff zu sagen.)

Ich wüsste jetzt auch nicht, warum es nötig gewesen wäre vorher was hier zu schreiben (da als ich den Thread gelesen hab eh schon alles da stand). Zudem hab ich sogar einen Tipp gegeben, sogar einen garnicht mal so schlechten auf lange Sicht gesehen. War wohl ein Fehler :spin2:

Fussel9 16. Nov 2009 19:50

Re: Wie bringe ich den Ball ins Rollen?
 
Kann mal jemand diesen Typen abstellen?
der nervt und trägt absolut nix bei ...?!
Deine Beiträge sind einzig und allein wertend und falls du glaubst du kannst uns mit deinem Psycho geblubber einlullen dann hast du dich geschnitten, oh entschuldige das war nur Bildlich gemeint!
Versuchs doch einfach mal mit GRILLED CHEESE :mrgreen:

@ Lumpiluk
macht man in der 11 ten bzw am ende der 10 viel spaß dabei^^

Namenloser 16. Nov 2009 20:17

Re: Wie bringe ich den Ball ins Rollen?
 
Zitat:

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:28 Uhr.
Seite 3 von 4     123 4      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz