11RIA 闪客社区 - 最赞 Animate Flash 论坛

搜索
查看: 2801|回复: 3
上一主题 下一主题

[★ AS3 类库] AS3绳子的算法

[复制链接] TA的其它主题
发表于 2018-12-11 23:52:54 | 显示全部楼层 |阅读模式

【游客模式】——注册会员,加入11RIA 闪客社区吧!一起见证Flash的再次辉煌……

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
转载:未知~~


[Actionscript3] 纯文本查看 复制代码
package
{
    import flash.display.Shape;
    import flash.display.MovieClip;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;

    /**
     * ...
     * @author Maxim Sprey <[email]gamitude@gmail.com[/email]>
     */
    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[i] = 10 + (lenDiv * pm * i);
                pY[i] = 10;

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

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

        public function frame(evt: Event): void
        {
            //固定开始点
            pX[0] = 300;
            pY[0] = 200;
            //最后一个点跟随鼠标运动
            pX[pX.length - 1] = stage.mouseX;
            pY[pY.length - 1] = 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[0], pY[0]);

            pX[0] = 300;
            pY[0] = 200;

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

    }
}


发表于 2018-12-13 15:38:59 | 显示全部楼层
感谢分享~~~~~~学习了~
回复

使用道具 举报

发表于 2019-3-23 16:55:10 | 显示全部楼层
遇到算法就不懂了
回复

使用道具 举报

发表于 2021-11-8 00:56:02 | 显示全部楼层
完美完美完美完美完美完美完美完美完美完美完美完美完美完美完美完美
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

感谢所有支持论坛的朋友:下面展示最新的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)



快速回复 返回顶部 返回列表