Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 13-04-2006, 14:54   #1 (permalink)
Neuer User
 
Registriert seit: Nov 2003
Beiträge: 63
Physikalisch: Coulombkraft

Hi,

im Rahmen einer Facharbeit über das Thema Kernfusion muss ich eine Simulation programmieren. In dieser sollen sich zwei Protonen nähern. Nun versuche ich die Abstoßung zu simulieren. Es trat gleich ein Fehler auf, worauf hin ich eine sehr abgespeckte Version programmiert habe, bei der der Fehler immernoch auftrag:

Code:
_root.createEmptyMovieClip("geschoss", 1);
_root.createEmptyMovieClip("ziel", 2);

with (_root.geschoss)
{
	beginFill(0xFF0000, 100);
	lineStyle(0, 0x000000, 100);
	moveTo(-5, -5);
	lineTo(5, -5);
	lineTo(5, 5);
	lineTo(-5, 5);
	lineTo(-5, -5);
	endFill();
	
	_x = 50;
	_y = 50;
}

with (_root.ziel)
{
	beginFill(0x00FF00, 100);
	lineStyle(0, 0x000000, 100);
	moveTo(-5, -5);
	lineTo(5, -5);
	lineTo(5, 5);
	lineTo(-5, 5);
	lineTo(-5, -5);
	endFill();
	
	_x = 550;
	_y = 200;
}

offsetX = 50;
offsetY = 50;
vx = 3;
vy = 1;
t = 0;

_root.onEnterFrame = function()
{
	dx = ziel._x - geschoss._x;
	dy = ziel._y - geschoss._y;
	alpha = Math.atan(dy/dx);
	
	r = Math.sqrt(dx*dx + dy*dy);
	
	F = 1/(r*r);
	
	Fx = (Math.cos(alpha)) * F;
	Fy = (Math.sin(alpha)) * F;
	
	geschoss._x = offsetX + vx*t  -  0.5*Fx/0.001 * t*t;
	geschoss._y = offsetY + vy*t  -  0.5*Fy/0.001 * t*t;

	t++;
}
Zunächst werden die beiden Protonen sehr simpel gezeichnet. Dann kommt der wichtigere Teil:
Zuerst wird der horizontale und der vertikale Abstand zwischen den Protonen errechnet (dx und dy). Damit wird der Winkel alpha mittels arcus-tangens und die Hypothenuse r des rechtwinkligen Dreiecks mittels Pythagoras errechnet.
Die Kraft F berechnet sich durch Epsilon*Q1*Q2/r², das hab ich nun mal abgespeckt und durch 1/(r*r) ersetzt. Die vertikale und horizontale Komponente der Kraft errechnet sich nun mit sin und cos des Winkels. Also ergibt sich die neue x und y-koordinate des geschosses durch die Ausgangsposition offsetX/Y plus eine gleichförmige Bewegung durch die Anfangsgeschwindigkeit vx/vy minus einer beschleunigten Bewegung, die sich durch 1/2 at² = 1/2 F/m * t² errechnen lässt.
Ich hoffe soweit ist alles verständlich und korrekt.
Allerdings wird jeder sehen, dass wenn man das ganze testet irgendwas verrückt spielt, sobald das geschoss vollständig abgebremst wurde und umkehren soll. Nun frage ich mich woran das liegt. Irgendwie scheint ein Vorzeichen ständig umgedreht zu werden, nur weiß ich nicht welches. Ich wüsste nicht, wo ich irgend ein Vorzeichen falsch gesetzt haben soll. Liegt es möglicherweise an den Datentypen Flashs, dass es vielleicht irgendwo einen Bufferoverflow gibt o.ä.?

Wäre für jede Hilfe dankbar,

MfG, Herr-Vorragend
Herr-Vorragend ist offline   Mit Zitat antworten
Alt 13-04-2006, 15:31   #2 (permalink)
Der Wunderhund
 
Benutzerbild von gaspode
 
Registriert seit: Jun 2002
Ort: Hattingen
Beiträge: 10.515
hi.

nur so nebenbei: du weißt das flash bei trigonometrischen
funktionen mit radianten statt mit grad arbeitet?!

gruß, gaspode
gaspode ist offline   Mit Zitat antworten
Alt 13-04-2006, 15:39   #3 (permalink)
Neuer User
 
Registriert seit: Nov 2003
Beiträge: 63
Ja weiß ich, aber macht ja hier keinen Unterschied, da die Werte des Arcus-Tangens lediglich für den Sinus und Cosinus verwendet werden.
Herr-Vorragend ist offline   Mit Zitat antworten
Alt 13-04-2006, 19:09   #4 (permalink)
Level up
 
Benutzerbild von Alois
 
Registriert seit: Jun 2001
Ort: Bocholt
Beiträge: 4.155
Positionierungen werden gerundet

hmm...,
das scheint noch nicht die ganze Lösung des Problems zu sein, aber es geht dann schon mal besser:
Man kann einen mc nur auf 0.05 pixel genau positionieren also kann mc._x=0 sein oder mc._x=0.05 aber nix dazwischen, und weil Du mit so kleinen Positionsveränderungen rechnest ergibt sich dadurch natürlich ein recht gravierender Rundungsfehler. So geht schon mal besser:
PHP-Code:
_root.createEmptyMovieClip("geschoss"1);
_root.createEmptyMovieClip("ziel"2);
with (_root.geschoss) {
    
beginFill(0xFF0000100);
    
lineStyle(00x000000100);
    
moveTo(-5, -5);
    
lineTo(5, -5);
    
lineTo(55);
    
lineTo(-55);
    
lineTo(-5, -5);
    
endFill();
    
_x 50;
    
_y 50;
}
geschoss.geschoss._x;
geschoss.geschoss._y;
with (_root.ziel) {
    
beginFill(0x00FF00100);
    
lineStyle(00x000000100);
    
moveTo(-5, -5);
    
lineTo(5, -5);
    
lineTo(55);
    
lineTo(-55);
    
lineTo(-5, -5);
    
endFill();
    
_x 550;
    
_y 200;
}
ziel.ziel._x;
ziel.ziel._y;
offsetX 50;
offsetY 50;
vx 3;
vy 1;
0;
Fx 0;
_root.onEnterFrame = function() {
    
dx ziel.x-geschoss.x;
    
dy ziel.y-geschoss.y;
    
alpha Math.atan(dy/dx);
    
Math.sqrt(dx*dx+dy*dy);
    
1/(r*r);
    
Fx = (Math.cos(alpha))*F;
    
Fy = (Math.sin(alpha))*F;
    
geschoss.offsetX+vx*t-0.5*Fx/0.001*t*t;
    
geschoss.offsetY+vy*t-0.5*Fy/0.001*t*t;
    
geschoss._x geschoss.x;
    
geschoss._y geschoss.y;
    
t++;
}; 
...jetzt bekommst Du erst 'Probleme' wenn geschoss.x>ziel.x, aber vielleicht weisst Du ja jetzt selbst weiter.

Gruß

Alois
__________________
-Spuckt mir auf den Stuhl, ich will im Grünen sitzen-
Alois ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 00:53 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele