风雨AS3 发表于 2018-12-11 23:52:54

AS3绳子的算法

转载:未知~~



package
{
    import flash.display.Shape;
    import flash.display.MovieClip;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;

    /**
   * ...
   * @author Maxim Sprey <gamitude@gmail.com>
   */
    public class stick extends MovieClip
    {
      // Stick properties
      var mass: Number = 6; //总质量   
      var len: Number = 3; //总长度
      var div: Number = 50;
      var massDiv: Number = mass / div; //每一节的质量
      var lenDiv: Number = len / div; //每一节的长度    0.06米
      // Circle properties
      var cX: Number = 300;
      var cY: Number = 200;
      var cR: Number = 50;
      // World Characteristics
      var g: Number = 9.81; //重力加速度
      var pm: Number = 100; // Pixels/meter      //像素相对 米的长度比例                总长度为3米 有50节那么每节相当于1.5个像素
      var dt: Number = 1 / 60; //时间单位      帧频为60的画 dt 相当于一帧的时间 这是时间单位
      //    var itr:uint = 3; // Number of rigid body iterations
      // Program Characteristics
      var pX: Array = [];
      var pY: Array = [];
      var oX: Array = [];
      var oY: Array = [];
      var aX: Array = [];
      var aY: Array = [];

      var mS: Shape = new Shape(); //每一个点的形状我在这里 只是当他为一个空点 然后每2个点之间用直线连接

      public function stick(): void
      {
            //初始化 速度 加速度 位移
            for (var i: uint = 0; i <= div; i++)
            {
                // 初始化运动后坐标
                pX = 10 + (lenDiv * pm * i);
                pY = 10;

                //    初始化运动前的坐标   
                oX = 10 + (lenDiv * pm * i);
                oY = 10;

                //初始化加速度
                aX = 0;
                aY = 0;
            }
            addChild(mS);
            addEventListener(Event.ENTER_FRAME, frame);
      }

      public function frame(evt: Event): void
      {
            //固定开始点
            pX = 300;
            pY = 200;
            //最后一个点跟随鼠标运动
            pX = stage.mouseX;
            pY = stage.mouseY;

            //设置重力加速度
            accForces();

            verlet();
            //判断是否碰到圆 然后做什么处理
            //checkColl();
            for (var j: uint = 0; j <= div - 1; j++)
            {
                satConstraints();
            }
            // Draw line
            mS.graphics.clear();
            mS.graphics.lineStyle(1, 0x000000, 2);
            mS.graphics.moveTo(0, 0);
            mS.graphics.drawCircle(cX, cY, cR);
            mS.graphics.moveTo(0, 0);
            mS.graphics.moveTo(pX, pY);

            pX = 300;
            pY = 200;

            pX = stage.mouseX;
            pY = stage.mouseY;
            //画圆或者 矩形
            for (var i: uint = 0; i <= div; i++)
            {
                mS.graphics.lineTo(pX, pY);
                //mS.graphics.drawRect(pX, pY, 0,0);
            }
      }
      public function verlet(): void
      {
            for (var i: uint = 0; i <= div; i++)
            {
                var tempX: Number = pX;
                pX += (0.99 * pX - 0.99 * oX) + (aX * pm * dt * dt);
                var tempY: Number = pY;
                pY += (0.99 * pY - 0.99 * oY) + (aY * pm * dt * dt);
                oX = tempX;
                oY = tempY;
            }
      }
      public function accForces(): void
      {
            for (var i: uint = 1; i <= div; i++)
            {
                aY = g;
            }
      }
      public function satConstraints(): void
      {
            for (var i: uint = 1; i <= div; i++)
            {
                var dx: Number = (pX - pX) / pm;
                var dy: Number = (pY - pY) / pm;
                var d: Number = Math.sqrt((dx * dx) + (dy * dy));
                var diff: Number = d - lenDiv;
                pX -= (dx / d) * 0.5 * pm * diff;
                pY -= (dy / d) * 0.5 * pm * diff;
                pX += (dx / d) * 0.5 * pm * diff;
                pY += (dy / d) * 0.5 * pm * diff;
            }
      }
      public function checkColl(): void
      {
            for (var i: uint = 0; i <= div; i++)
            {
                var dx: Number = pX - cX;
                var dy: Number = pY - cY;
                var r: Number = Math.sqrt((dx * dx) + (dy * dy));
                //trace(r);
                var rr: Number = r - cR;
                if (rr < 0)
                {
                  // Collision
                  pX += (-dx / r) * rr;
                  pY += (-dy / r) * rr;
                }
            }
      }

    }
}


勤奋的蜗牛 发表于 2018-12-13 15:38:59

感谢分享~~~~~~学习了~

qiuhao 发表于 2019-3-23 16:55:10

遇到算法就不懂了

anghuo 发表于 2021-11-8 00:56:02

完美完美完美完美完美完美完美完美完美完美完美完美完美完美完美完美
页: [1]
查看完整版本: AS3绳子的算法

感谢所有支持论坛的朋友:下面展示最新的5位赞助和充值的朋友……更多赞助和充值朋友的信息,请查看:永远的感谢名单

SGlW(66139)、 anghuo(841)、 whdsyes(255)、 longxia(60904)、 囫囵吞澡(58054)

下面展示总排行榜的前3名(T1-T3)和今年排行榜的前3名的朋友(C1-C3)……更多信息,请查看:总排行榜今年排行榜

T1. fhqu1462(969)、 T2. lwlpluto(14232)、 T3. 1367926921(962)  |  C1. anghuo(147)、 C2. fdisker(27945)、 C3. 囫囵吞澡(58054)