Berechnung bei Ballistik

Hairman

Grünschnabel
Hallo auch,
(wie ihr seht ist das hier mein 1. Beitrag, also nicht gleich schlagen :-( )
habe hier ein mathematisches Problem, hat nicht wirklich etwas mit actionscript im allgemeinen zu tun.
Ich bastele gerade an einem kleineren "Carambolage"-Spiel weil ich einfach zu viel zeit habe und so meine Flash-Kenntnisse erweitern möchte. Bis jetzt hat auch alles wunderbar geklappt, aber jetzt habe ich das Problem dass ich die Kollision zwischen 2 Kugeln nicht berechnen kann, ich komme einfach nicht drauf... vielleicht könnt ihr mir helfen.

also die Berechnung an den Banden ist ja recht einfach. ich habe 3 Variablen je Kugel (3 Kugeln mit Namen "weiß", "rot" und "blau"), eine Geschwindigkeit und 2 Richtungen "xRichtung" und "yRichtung" und an den entsprechenden Banden multipliziere ich mit "-1", soweit dazu. aber bei Kollisionen sollte ich den Winkel zwischen den Kugeln ja auch berücksichtigen - und dazu reichen die Kenntnisse bei mir nicht mehr...

zu Testzwecken lasse ich die Kugeln erstmal mit vorgegebenen Geschwindigkeiten übers Feld laufen, die Werte werden in bild 1 initialisiert, hier das script von bild 2: (mit markierung wo ich nicht weiterkomme....)
Code:
movieclip.prototype.bewegung = function(pGeschw) {
	this.onEnterFrame = function(){
		i += 1;
		if (this.rolldauer < pGeschw){
			this.rolldauer += 0.2;
		} else { this.rolldauer = pGeschw
			};
		//Kollisionsberechnung
		this.bande(525,115,110,365);
		this.kugel();
		//Bewegung
		this._x += (pGeschw-this.rolldauer) *this.xRichtung/2;
		this._y += (pGeschw-this.rolldauer) *this.yRichtung/2;
	}
}

movieclip.prototype.bande = function(pRechts, pLinks, pOben, pUnten) {
	if (this._x>pRechts || this._x<pLinks) {
			this.xRichtung *= -1; }
	if (this._y>pUnten || this._y<pOben) {
			this.yRichtung *= -1; }
}

movieclip.prototype.kugel = function() {
		//Differenzen
	if (this._x != weiß._x) {
		this.winkel(weiß._x-this._x,weiß._y-this._y);
	}		
	if (this._x != blau._x) {
		this.winkel(blau._x-this._x,blau._y-this._y);
	}
	if (this._x != rot._x) {
		this.winkel(rot._x-this._x,rot._y-this._y);
	}
}

movieclip.prototype.winkel = function(pDifferenzX,pDifferenzY) {
		//Pythagoras zur Bestimmung der Entfernung
		//***es reicht "this.width", weil alle Kugeln die gleiche Größe haben und
		//2 Radien addiert werden also einem Durchmesser der Kugel entspricht***
		if (pDifferenzX*pDifferenzX + pDifferenzY*pDifferenzY <=
				this.width*this.width) {
			//Winkelberechnung
		**** hier brauch ich jetzt HILFÄÄÄÄÄÄ ****
		}
}

weiß.bewegung(30);
rot.bewegung(35);
blau.bewegung(25);
gotoAndStop(2);
 
Hi,

wenn Du eine virtuelle Linie vom Mittelpunkt der Kugel A zum Mittelpunkt der Kugel B ziehst, bekommst Du einen (kartesischen) Vektor, den Du in Polarkoordinaten (Winkel und Entfernung) umwandeln kannst.

(Die Geschwindigkeit einer Kugel bekommst Du durch die Umrechnung ihrer x- und y-Vektoren in Polarkoordinaten (Entfernung wäre dann die Geschwindigkeit).)
PHP:
Entfernung = Math.sqrt(Math.pow(ballB._x - ballA._x, 2) + Math.pow(ballB._y - ballA._y, 2));
Winkel = Math.atan((ballB._y - ballA._y) / (ballB._x - ballA._x));

Gruß
 
hm klingt gut erstmal danke,
leider löst das nicht meine probleme...

ich habe gerade erst einmal versucht, deinen scriptausschnitt zu verstehen - das meiste erschließt sich mir ja ganz gut, nur leider will sich mir Math.pow(x,y) nicht erschließen. Hab in der Hilfe nachgeschaut: "Method; computes and returns x to the power of y, xy. " ja.. schön... und was heißt das nun?

[edit]oha, ok gerade ists bei mir gefallen als ich nochmal die zeile angeguckt hab... :-) pow = ^ stimmts? ;) [/edit]

die Entfernung an sich ist mir ja eigentlich nicht wichtig, ich überprüfe ja schon, ob die Entfernung unter den Summen der Radien liegt, mehr ist für mich ja nicht wichtig, da brauche ich diese ja nicht zu speichern... größere Probleme bereitet mir, wie ich das ganze in die entsprechende Richtung umrechne, die die Kugel nachher haben soll. Die Winkelberechnung per arcus tangens leuchtet mir ein, das ist nicht wirklich schwer. Nur wie mache ich aus dem Winkel dann die entsprechenden Beschleunigungen für x und y?
 
Zuletzt bearbeitet:
Hi,

  • Math.pow berechnet eine Exponenz (in diesem Fall das Quadrat)
  • (wo habt Ihr nur alle die englischen Versionen her? :rolleyes: )
  • Du kannst die Richtungswinkel zweier Kugeln berechnen; aus der Differenz beider Winkel errechnet sich der Kollisionswinkel. Halbiere diesen Winkel, um den Aufprallwinkel einer Kugel zu bestimmen. Der Abprallwinkel ist dann der Negativwert des Aufprallwinkels. Addiere diesen zum ursprünglichen Richtungswinkel, um den neuen Richtungswinkel zu erhalten.
  • Sobald Du den neuen Richtungswinkel hast, kannst Du ihn (und die Geschwindigkeit) wieder in kartesische Koordinaten (zur Bewegung) umrechnen:
PHP:
dx = Entfernung * Math.cos(Winkel);
dy = Entfernung * Math.sin(Winkel);

Gruß

P.S.: es kann sein, dass ich jetzt aus dem Kopf einige kleine Fehler gemacht habe; sollten erstaunliche Resultate herauskommen, einfach mal Subtraktionen in Additionen umändern und ein wenig rumprobieren ;)
 
Zuletzt bearbeitet:
thx datic ich glaub das bringt mich ein relativ großes Stück weiter :)
werd mich nochmal melden falls des nicht klappt oder noch besser - falls es klappt...
 
Zurück