Abprallfunktion
-
Hallo Leute!
Ich habe aus langeweile ein programm angefangen welches eigentlich ganz simpel ist: Irgendwo auf einem 44x80 Konsolenbildschirm erscheint ein Ball welcher sich linear weiterbewegt und am Rand abprallt und so immer weiter. Ich habe eine Funktion geschrieben die mir die Flugbahn berechnet. Die sieht so aus:
void Flugbahn(KOORD ball, double AG){ int i; double k; double AR; AR = (M_PI*AG)/180; k=tan(AR); for(i=0;i<=80;i++){ Flyway[i].x = ball.x; Flyway[i].y = ]=k*ball.x + ball.y; if(Seite == 0) ball.x--; else ball.x++; } }
Übergeben werden Ballposition und Winkel in Grad.
Mein Problem ist jetzt das der Ball einfach nicht richtig abprallt. wenn er eine Mauer (Bildschirmrand) berührt wird der Winkel mit diesem AusdruckAG=0-AG;
negativiert und die Flugbahn wird neu berechnet. HAb ich irgendwo in meiner Funktion einen Denkfehler?
-
wo steht "AG= -AG;" und wo steht "Seite"?
-
Warum macht ihr sowas immer mit Winkeln? Man braucht nur einen Vector für die Geschwindigkeit und wenn der Ball anstößt wird einfach ein Wert negiert.
-
Seite ist nur ob er gerade von links nach rechts oder von rechts nach links fliegt. AG = - AG steht im Hauptprogramm.
-
wo ist das problem?
du haste eine funktion y = m*x, in jedem schritt wird x um 1 erhoeht oder um 1 minimiert je nachdem. stößt der ball oben oder unten an, so nimmst du m * -1
wobei m der tan von α, also deinem winkel ist.
aber den winkel musste natürlich noch umrechnen von grad ins bogenmaß(? glaub ich), je nachdem wie du ihn übergibst natürlich au gar netmfg
blut-lecker
-
Du hast vollkommen Recht und genau das macht mein Prog auch darum versteh ich auch nicht warum es nicht funktioniert.
-
das hier ist zwar java, aber vielleicht hilfts dir etwas weiter..
private void mirror (double alpha) { this.dir = 180.0 - (this.dir - alpha); if (this.dir > 360.0) { this.dir -= 360.0; } if (this.dir < 0) { this.dir += 360; } } public void redirect(Ball foreign) { double a = foreign.getPosX() - this.posX; double b = foreign.getPosY() - this.posY; double c = Math.sqrt((a * a) + (b * b)); double alpha = Math.asin(b/c); mirror (alpha); } public boolean collides(double x, double y, int r, double dir) { double newX = posX, newY = posY; /* test for collision */ newX = this.posX + (Math.sin(Math.PI / 180.0 * this.dir) * this.impulse ); newY = this.posY + (Math.cos(Math.PI / 180.0 * this.dir) * this.impulse ); double a = x - newX; double b = y - newY; /* if collision */ if ((a * a) + (b * b) <= (double)((r + this.size)* (r + this.size))) { return true; } return false; }
P.S.: Ist wirklich nicht grad auf Geschwindigkeit ausgelegt
wollte damals in nem Java-Kurs nur etwas mit awt und threads rumspielen..