home *** CD-ROM | disk | FTP | other *** search
/ 404 Jogos / CLJG.iso / Diversos / Beez.swf / scripts / Box2D / Collision / Shapes / b2CircleShape.as < prev    next >
Encoding:
Text File  |  2008-09-03  |  4.8 KB  |  121 lines

  1. package Box2D.Collision.Shapes
  2. {
  3.    import Box2D.Collision.b2AABB;
  4.    import Box2D.Collision.b2Segment;
  5.    import Box2D.Common.Math.b2Mat22;
  6.    import Box2D.Common.Math.b2Vec2;
  7.    import Box2D.Common.Math.b2XForm;
  8.    import Box2D.Common.b2Settings;
  9.    
  10.    public class b2CircleShape extends b2Shape
  11.    {
  12.        
  13.       
  14.       public var m_localPosition:b2Vec2;
  15.       
  16.       public var m_radius:Number;
  17.       
  18.       public function b2CircleShape(def:b2ShapeDef)
  19.       {
  20.          m_localPosition = new b2Vec2();
  21.          super(def);
  22.          var circleDef:b2CircleDef = def as b2CircleDef;
  23.          m_type = e_circleShape;
  24.          m_localPosition.SetV(circleDef.localPosition);
  25.          m_radius = circleDef.radius;
  26.       }
  27.       
  28.       override public function TestSegment(transform:b2XForm, lambda:Array, normal:b2Vec2, segment:b2Segment, maxLambda:Number) : Boolean
  29.       {
  30.          var sY:Number = NaN;
  31.          var tMat:b2Mat22 = transform.R;
  32.          var positionX:Number = transform.position.x + (tMat.col1.x * m_localPosition.x + tMat.col2.x * m_localPosition.y);
  33.          var positionY:Number = transform.position.x + (tMat.col1.y * m_localPosition.x + tMat.col2.y * m_localPosition.y);
  34.          var sX:Number = segment.p1.x - positionX;
  35.          sY = segment.p1.y - positionY;
  36.          var b:Number = sX * sX + sY * sY - m_radius * m_radius;
  37.          if(b < 0)
  38.          {
  39.             return false;
  40.          }
  41.          var rX:Number = segment.p2.x - segment.p1.x;
  42.          var rY:Number = segment.p2.y - segment.p1.y;
  43.          var c:Number = sX * rX + sY * rY;
  44.          var rr:Number = rX * rX + rY * rY;
  45.          var sigma:Number = c * c - rr * b;
  46.          if(sigma < 0 || rr < Number.MIN_VALUE)
  47.          {
  48.             return false;
  49.          }
  50.          var a:Number = -(c + Math.sqrt(sigma));
  51.          if(0 <= a && a <= maxLambda * rr)
  52.          {
  53.             a /= rr;
  54.             lambda[0] = a;
  55.             normal.x = sX + a * rX;
  56.             normal.y = sY + a * rY;
  57.             normal.Normalize();
  58.             return true;
  59.          }
  60.          return false;
  61.       }
  62.       
  63.       public function GetLocalPosition() : b2Vec2
  64.       {
  65.          return m_localPosition;
  66.       }
  67.       
  68.       public function GetRadius() : Number
  69.       {
  70.          return m_radius;
  71.       }
  72.       
  73.       override public function ComputeSweptAABB(aabb:b2AABB, transform1:b2XForm, transform2:b2XForm) : void
  74.       {
  75.          var tMat:b2Mat22 = null;
  76.          tMat = transform1.R;
  77.          var p1X:Number = transform1.position.x + (tMat.col1.x * m_localPosition.x + tMat.col2.x * m_localPosition.y);
  78.          var p1Y:Number = transform1.position.y + (tMat.col1.y * m_localPosition.x + tMat.col2.y * m_localPosition.y);
  79.          tMat = transform2.R;
  80.          var p2X:Number = transform2.position.x + (tMat.col1.x * m_localPosition.x + tMat.col2.x * m_localPosition.y);
  81.          var p2Y:Number = transform2.position.y + (tMat.col1.y * m_localPosition.x + tMat.col2.y * m_localPosition.y);
  82.          aabb.lowerBound.Set((p1X < p2X ? p1X : p2X) - m_radius,(p1Y < p2Y ? p1Y : p2Y) - m_radius);
  83.          aabb.upperBound.Set((p1X > p2X ? p1X : p2X) + m_radius,(p1Y > p2Y ? p1Y : p2Y) + m_radius);
  84.       }
  85.       
  86.       override public function ComputeMass(massData:b2MassData) : void
  87.       {
  88.          massData.mass = m_density * b2Settings.b2_pi * m_radius * m_radius;
  89.          massData.center.SetV(m_localPosition);
  90.          massData.I = massData.mass * (0.5 * m_radius * m_radius + (m_localPosition.x * m_localPosition.x + m_localPosition.y * m_localPosition.y));
  91.       }
  92.       
  93.       override public function UpdateSweepRadius(center:b2Vec2) : void
  94.       {
  95.          var dX:Number = m_localPosition.x - center.x;
  96.          var dY:Number = m_localPosition.y - center.y;
  97.          dX = Math.sqrt(dX * dX + dY * dY);
  98.          m_sweepRadius = dX + m_radius - b2Settings.b2_toiSlop;
  99.       }
  100.       
  101.       override public function ComputeAABB(aabb:b2AABB, transform:b2XForm) : void
  102.       {
  103.          var tMat:b2Mat22 = transform.R;
  104.          var pX:Number = transform.position.x + (tMat.col1.x * m_localPosition.x + tMat.col2.x * m_localPosition.y);
  105.          var pY:Number = transform.position.y + (tMat.col1.y * m_localPosition.x + tMat.col2.y * m_localPosition.y);
  106.          aabb.lowerBound.Set(pX - m_radius,pY - m_radius);
  107.          aabb.upperBound.Set(pX + m_radius,pY + m_radius);
  108.       }
  109.       
  110.       override public function TestPoint(transform:b2XForm, p:b2Vec2) : Boolean
  111.       {
  112.          var tMat:b2Mat22 = transform.R;
  113.          var dX:Number = transform.position.x + (tMat.col1.x * m_localPosition.x + tMat.col2.x * m_localPosition.y);
  114.          var dY:Number = transform.position.y + (tMat.col1.y * m_localPosition.x + tMat.col2.y * m_localPosition.y);
  115.          dX = p.x - dX;
  116.          dY = p.y - dY;
  117.          return dX * dX + dY * dY <= m_radius * m_radius;
  118.       }
  119.    }
  120. }
  121.