Zurück   Flashforum > Flash > ActionScript > Softwarearchitektur und Entwurfsmuster

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 11-12-2007, 13:38   #1 (permalink)
Neuer User
 
Benutzerbild von _crypto_
 
Registriert seit: Mar 2006
Beiträge: 1.573
Kugel Kollision

Also ich habe ein problem beim abarbeiten dieser kleinen anleitung:
Hier

Code:
    // b1, b2 Kugeln var s1 : Point = new Point( b1.x, b1.y ); var s2 : Point = new Point( b2.x, b2.y ); var a : Vector = b1.velocity; var b : Vector = b2.velocity; var c, d, impulse, impact : Vector; var mass1 : Number = b1.radius; var mass2 : Number = b2.radius; var impactSpeed : Number; impact = Vector.subtract( b, a ); // impulse = normalise( s2 - s1 ); was ist hier gemeint? schließlich muss ein Vektor rauskommen??? impactSpeed = Vector.dotProduct( impact, impulse ); impulse.multiply( Math.sqrt( impactSpeed * mass1 * mass2 ); c = Vector.add( a, impulse.divide( mass1 ) ); d = Vector.subtract( b, impulse.divide( mass2 ) );

ich kann auch gerne meine Vektorklasse angeben, aber ich versteh nich was ich da normalisieren soll?? ich hab doch keinen vektor was is denn dann normalisieren, in dem kontext?

danke schonmal ^^
__________________

Currently working on:

- --- ---

-----------------------------------------------------------------
ActionScript 3.0, C++, Java, Delphi
_crypto_ ist offline   Mit Zitat antworten
Alt 11-12-2007, 13:50   #2 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 18.053
http://de.wikipedia.org/wiki/Einheitsvektor

gibt die relative grössen der richtungen an


praktische anwendung z.b.
http://www.seibsprogrammladen.de/fra.../Schnittpunkte
Linie durch 3-Eck im raum
und
Hilfsfunktionen: (darüber)
function vector_mul(a, m) { return {x:a.x*m, y:a.y*m, z:a.z*m}; }
function vector_len(a) { return Math.sqrt(a.x*a.x+a.y*a.y+a.z*a.z); }
function vector_norm(a) { return vector_mul(a,1/vector_len(a)); }
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (11-12-2007 um 13:55 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 11-12-2007, 21:07   #3 (permalink)
Neuer User
 
Benutzerbild von _crypto_
 
Registriert seit: Mar 2006
Beiträge: 1.573
sry vllt falsch ausgedrückt aber ...

ich weiß was einheitsvektoren sind
ich hab doch gesagt ich verstehe nicht wie ich das gemeint ist,
die differenz der punkte und damit irgendwie normalisieren???
__________________

Currently working on:

- --- ---

-----------------------------------------------------------------
ActionScript 3.0, C++, Java, Delphi
_crypto_ ist offline   Mit Zitat antworten
Alt 12-12-2007, 02:33   #4 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 18.053
ebenfalls sorry, das ich nicht weiss, was du weisst.

x/y/(z wenn im raum berechnet)- koordinaten eines punktes bzw. die der differenz von zwei punkten sind ein vektor (das weisst du bestimmt auch).

durch das normalisieren (weisst du selbst, wie du schreibst) erhält man den prozentanteil wieviel in jede richtung.
"..Both impulses are equal in size, and exactly opposite in direction (Green line).."
die grüne linie nicht absolut, sondern relativ.

damit erfolgt die berechnung des "geraden stosses" (was du bestimmt auch weisst):
"..
Now, the impulse is multiplied by the impact speed and the masses:
impulse = impulse * square_root(ImpactSpeed * mass1 * mass2)
and the impulse can be applied to the initial velocities to get the resultant velocities:
c = a + impulse / mass1
d = b - impulse / mass2
.."

durch impulse aufgeteilt wieviel % in die jeweilige x/y/(z)- richtung (weisst du bestimmt auch).
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 12-12-2007, 06:08   #5 (permalink)
Neuer User
 
Benutzerbild von _crypto_
 
Registriert seit: Mar 2006
Beiträge: 1.573
ja nur hab ich schwierigkeiten mit dem umsetzen:
ich hätte es so gemacht, aber so klapt keine saubere kollision.

Code:
    impuls = new Vector( b2.x - b1.x, b2.y - b1.y ); impuls.normalize();

wie gesagt, ergibt nicht das gewünschte resultat.

Vektorklasse:
Code:
    package {     public class Vector     {         public var x : Number;         public var y : Number;                 public static function add( v1 : Vector, v2 : Vector ) : Vector         {             return new Vector( v1.x + v2.x, v1.y + v2.y );         }                 public static function subtract( v1 : Vector, v2 : Vector ) : Vector         {             return new Vector( v1.x - v2.x, v1.y - v2.y );         }                 public static function project( v1 : Vector, v2 : Vector ) : Vector         {             var dp : Number = Vector.dotProduct( v1, v2 );             var px : Number = ( dp / ( v2.length() * v2.length() ) ) * v2.x;             var py : Number = ( dp / ( v2.length() * v2.length() ) ) * v2.y;                         return new Vector( px, py );         }                 public static function dotProduct( v1 : Vector, v2 : Vector ) : Number         {             return ( v1.x * v2.x + v1.y * v2.y );         }                 public static function crossProduct( v1 : Vector, v2 : Vector ) : Number         {             return ( v1.x * v2.y - v1.y * v2.x );         }                 public function Vector( x : Number = 0, y : Number = 0 )         {             this.x = x;             this.y = y;         }                 public function length() : Number         {             return Math.sqrt( x * x + y * y );         }                 public function angle() : Number         {             return Math.atan2( y, x );         }                 public function normalize() : Vector         {             var l : Number = this.length();                         x /= l;             y /= l;                         return this;         }                 public function multiply( f : Number ) : Vector         {             x *= f;             y *= f;                         return this;         }                 public function divide( f : Number ) : Vector         {             x /= f;             y /= f;                         return this;         }                 public function rotateBy( angle : Number ) : Vector         {             var ca : Number = Math.cos( angle );             var sa : Number = Math.sin( angle );                         x = x * ca - y * sa;             y = x * sa + y * ca;                         return this;         }                 public function rotateTo( angle : Number ) : Vector         {             var l : Number = this.length();             x = l * Math.cos( angle );             y = l * Math.sin( angle );                         return this;         }                 public function getOrthogonal() : Vector         {             return new Vector( -y, x );         }                 public function copy() : Vector         {             return new Vector( x, y );         }     } }

Mainklasse und die Kollision
Code:
    package {     import flash.display.Sprite;     import flash.events.Event;         [SWF(width='500', height='500', backgroundColor='0xFFFFFF', frameRate='40')]         public class Billard extends Sprite     {         private var b1 : BillardBall = new BillardBall( 250, 100, new Vector( 0, 2 ), 5 );         private var b2 : BillardBall = new BillardBall( 259, 250, new Vector( 0, -2 ), 5 );                 public function Billard()         {             this.addEventListener( Event.ENTER_FRAME, enterFrame );         }                 private function enterFrame( event : Event ) : void         {             graphics.clear();                         b1.forceScreen( stage );             b2.forceScreen( stage );                         if( b1.hasCollision( b2 ) || b2.hasCollision( b1 ) )             {                 var a : Vector = b1.velocity;                 var b : Vector = b2.velocity;                 var impulse : Vector, impact : Vector;                                 var mass1 : Number = b1.radius;                 var mass2 : Number = b2.radius;                 var impactSpeed : Number;                                 impact = Vector.subtract( b, a );                 impulse = new Vector( b1.x - b2.x, b1.y - b2.y ).normalize();                                 impactSpeed = Vector.dotProduct( impact, impulse );                 impulse.multiply( Math.sqrt( impactSpeed * mass1 * mass2 ) );                                 b1.velocity = Vector.add( a, impulse.divide( mass1 ) );                 b2.velocity = Vector.subtract( b, impulse.divide( mass2 ) );             }                         b1.solve();             b2.solve();                         b1.draw( graphics );             b2.draw( graphics );                         Time.update();         }     } }
Angehängte Dateien
Dateityp: zip Billard.zip (2,2 KB, 21x aufgerufen)
__________________

Currently working on:

- --- ---

-----------------------------------------------------------------
ActionScript 3.0, C++, Java, Delphi

Geändert von _crypto_ (12-12-2007 um 06:14 Uhr)
_crypto_ ist offline   Mit Zitat antworten
Alt 12-12-2007, 06:49   #6 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 18.053
wurzel aus negativen zahlen geht nicht
Angehängte Dateien
Dateityp: zip Billard.zip (8,2 KB, 54x aufgerufen)
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 12-12-2007, 14:28   #7 (permalink)
Neuer User
 
Benutzerbild von _crypto_
 
Registriert seit: Mar 2006
Beiträge: 1.573
Zitat:
Zitat von hgseib Beitrag anzeigen
wurzel aus negativen zahlen geht nicht
ich bin so dumm
hätt mir klar sein sollen das das punktprodukt auch negativ sein kann ^^

danke

für die viele hilfe gibts nun das
"Billard"
__________________

Currently working on:

- --- ---

-----------------------------------------------------------------
ActionScript 3.0, C++, Java, Delphi

Geändert von _crypto_ (12-12-2007 um 17:09 Uhr)
_crypto_ ist offline   Mit Zitat antworten
Alt 12-12-2007, 15:41   #8 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 18.053
na das lege ich mir doch unter den weihnachtsbaum ;-)
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib 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 03:03 Uhr.

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


Copyright ©1999 – 2014 Marc Thiele