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:
  1. // b1, b2 Kugeln
  2.  
  3. var s1 : Point = new Point( b1.x, b1.y );
  4. var s2 : Point = new Point( b2.x, b2.y );
  5.  
  6. var a : Vector = b1.velocity;
  7. var b : Vector = b2.velocity;
  8. var c, d, impulse, impact : Vector;
  9.  
  10. var mass1 : Number = b1.radius;
  11. var mass2 : Number = b2.radius;
  12. var impactSpeed : Number;
  13.  
  14. impact = Vector.subtract( b, a );
  15. // impulse = normalise( s2 - s1 ); was ist hier gemeint? schließlich muss ein Vektor rauskommen???
  16.  
  17. impactSpeed = Vector.dotProduct( impact, impulse );
  18. impulse.multiply( Math.sqrt( impactSpeed * mass1 * mass2 );
  19.  
  20. c = Vector.add( a, impulse.divide( mass1 ) );
  21. 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.018
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.018
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:
  1. impuls = new Vector( b2.x - b1.x, b2.y - b1.y );
  2. impuls.normalize();

wie gesagt, ergibt nicht das gewünschte resultat.

Vektorklasse:
Code:
  1. package
  2. {
  3.     public class Vector
  4.     {
  5.         public var x : Number;
  6.         public var y : Number;
  7.        
  8.         public static function add( v1 : Vector, v2 : Vector ) : Vector
  9.         {
  10.             return new Vector( v1.x + v2.x, v1.y + v2.y );
  11.         }
  12.        
  13.         public static function subtract( v1 : Vector, v2 : Vector ) : Vector
  14.         {
  15.             return new Vector( v1.x - v2.x, v1.y - v2.y );
  16.         }
  17.        
  18.         public static function project( v1 : Vector, v2 : Vector ) : Vector
  19.         {
  20.             var dp : Number = Vector.dotProduct( v1, v2 );
  21.             var px : Number = ( dp / ( v2.length() * v2.length() ) ) * v2.x;
  22.             var py : Number = ( dp / ( v2.length() * v2.length() ) ) * v2.y;
  23.            
  24.             return new Vector( px, py );
  25.         }
  26.        
  27.         public static function dotProduct( v1 : Vector, v2 : Vector ) : Number
  28.         {
  29.             return ( v1.x * v2.x + v1.y * v2.y );
  30.         }
  31.        
  32.         public static function crossProduct( v1 : Vector, v2 : Vector ) : Number
  33.         {
  34.             return ( v1.x * v2.y - v1.y * v2.x );
  35.         }
  36.        
  37.         public function Vector( x : Number = 0, y : Number = 0 )
  38.         {
  39.             this.x = x;
  40.             this.y = y;
  41.         }
  42.        
  43.         public function length() : Number
  44.         {
  45.             return Math.sqrt( x * x + y * y );
  46.         }
  47.        
  48.         public function angle() : Number
  49.         {
  50.             return Math.atan2( y, x );
  51.         }
  52.        
  53.         public function normalize() : Vector
  54.         {
  55.             var l : Number = this.length();
  56.            
  57.             x /= l;
  58.             y /= l;
  59.            
  60.             return this;
  61.         }
  62.        
  63.         public function multiply( f : Number ) : Vector
  64.         {
  65.             x *= f;
  66.             y *= f;
  67.            
  68.             return this;
  69.         }
  70.        
  71.         public function divide( f : Number ) : Vector
  72.         {
  73.             x /= f;
  74.             y /= f;
  75.            
  76.             return this;
  77.         }
  78.        
  79.         public function rotateBy( angle : Number ) : Vector
  80.         {
  81.             var ca : Number = Math.cos( angle );
  82.             var sa : Number = Math.sin( angle );
  83.            
  84.             x = x * ca - y * sa;
  85.             y = x * sa + y * ca;
  86.            
  87.             return this;
  88.         }
  89.        
  90.         public function rotateTo( angle : Number ) : Vector
  91.         {
  92.             var l : Number = this.length();
  93.             x = l * Math.cos( angle );
  94.             y = l * Math.sin( angle );
  95.            
  96.             return this;
  97.         }
  98.        
  99.         public function getOrthogonal() : Vector
  100.         {
  101.             return new Vector( -y, x );
  102.         }
  103.        
  104.         public function copy() : Vector
  105.         {
  106.             return new Vector( x, y );
  107.         }
  108.     }
  109. }

Mainklasse und die Kollision
Code:
  1. package
  2. {
  3.     import flash.display.Sprite;
  4.     import flash.events.Event;
  5.    
  6.     [SWF(width='500', height='500', backgroundColor='0xFFFFFF', frameRate='40')]
  7.    
  8.     public class Billard extends Sprite
  9.     {
  10.         private var b1 : BillardBall = new BillardBall( 250, 100, new Vector( 0, 2 ), 5 );
  11.         private var b2 : BillardBall = new BillardBall( 259, 250, new Vector( 0, -2 ), 5 );
  12.        
  13.         public function Billard()
  14.         {
  15.             this.addEventListener( Event.ENTER_FRAME, enterFrame );
  16.         }
  17.        
  18.         private function enterFrame( event : Event ) : void
  19.         {
  20.             graphics.clear();
  21.            
  22.             b1.forceScreen( stage );
  23.             b2.forceScreen( stage );
  24.            
  25.             if( b1.hasCollision( b2 ) || b2.hasCollision( b1 ) )
  26.             {
  27.                 var a : Vector = b1.velocity;
  28.                 var b : Vector = b2.velocity;
  29.                 var impulse : Vector, impact : Vector;
  30.                
  31.                 var mass1 : Number = b1.radius;
  32.                 var mass2 : Number = b2.radius;
  33.                 var impactSpeed : Number;
  34.                
  35.                 impact = Vector.subtract( b, a );
  36.                 impulse = new Vector( b1.x - b2.x, b1.y - b2.y ).normalize();
  37.                
  38.                 impactSpeed = Vector.dotProduct( impact, impulse );
  39.                 impulse.multiply( Math.sqrt( impactSpeed * mass1 * mass2 ) );
  40.                
  41.                 b1.velocity = Vector.add( a, impulse.divide( mass1 ) );
  42.                 b2.velocity = Vector.subtract( b, impulse.divide( mass2 ) );
  43.             }
  44.            
  45.             b1.solve();
  46.             b2.solve();
  47.            
  48.             b1.draw( graphics );
  49.             b2.draw( graphics );
  50.            
  51.             Time.update();
  52.         }
  53.     }
  54. }
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.018
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.018
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 20:36 Uhr.

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


Copyright ©1999 – 2014 Marc Thiele