绳子算法

package app{
    import flash.display.Shape;
    import flash.geom.Point;
    import framework.Game;
    import framework.objs.GameObject;

    public class ThrowSceneRope extends GameObject{

        public static function create():void{
            var game:Game=Game.getInstance();
            var info:*={};
            game.createGameObj(new ThrowSceneRope(),info);
        }

        public function ThrowSceneRope(){
            super();
        }

        private const ptm_ratio:Number=100;//像素/米
        private const gravity:Point=new Point(0,9.81);
        private const dt:Number=1/30;
        private const lenNode:Number=4/ptm_ratio;//绳节长度,单位:米
        private const nodeCount:int=20; //节数

        private const ropeInitAngle:Number=0*0.01745;//绳子初始朝向角度 单位:弧度

        private var _origin:Point;//绳子悬挂点,单位:米

        private var _oldPosList:Vector.<Point>;
        private var _posList:Vector.<Point>;

        override protected function init(info:* = null):void{
            super.init(info);

            _origin=new Point(473.7/ptm_ratio,257.6/ptm_ratio);
            _posList=new Vector.<Point>(nodeCount,true);
            _oldPosList=new Vector.<Point>(nodeCount,true);

            for(var i:uint=0;i<nodeCount;i++){
                var x:Number=_origin.x+Math.cos(ropeInitAngle)*lenNode*i;
                var y:Number=_origin.y+Math.sin(ropeInitAngle)*lenNode*i;
                _oldPosList[i]=new Point(x,y);
                _posList[i]=new Point(x,y);
            }

        }

        override protected function update():void{
            step();
        }

        private function step():void{
            verlet();
            setConstraints();
            _posList[0].x=_origin.x;
            _posList[0].y=_origin.y;
            drawRope();

        }
        /**重力加速度模拟*/
        private function verlet():void{
            for(var i:uint=0;i<nodeCount;i++){
                var tmpx:Number=_posList[i].x;
                _posList[i].x+=(_posList[i].x-_oldPosList[i].x)+(gravity.x*dt*dt);

                var tmpy:Number=_posList[i].y;
                _posList[i].y+=(_posList[i].y-_oldPosList[i].y)+(gravity.y*dt*dt);

                _oldPosList[i].x=tmpx;
                _oldPosList[i].y=tmpy;
            }
        }

        /**约束绳节间的距离*/
        private function setConstraints():void{
            for(var c:uint=0;c<nodeCount;c++){
            for(var i:uint=1;i<nodeCount;i++){
                //Distance of two rope node
                var dx:Number=_posList[i].x-_posList[i-1].x;
                var dy:Number=_posList[i].y-_posList[i-1].y;
                var d:Number=Math.sqrt(dx * dx + dy * dy);

                var diff:Number=d-lenNode;
                var f:Number=0.5;

                _posList[i].x-=(dx/d)*diff*f;
                _posList[i].y-=(dy/d)*diff*f;

                _posList[i-1].x+=(dx/d)*diff*f;
                _posList[i-1].y+=(dy/d)*diff*f;
            }}
        }

        private var _shape:Shape;
        private function drawRope():void{
            if(_shape==null){
                _shape=new Shape();
                _game.global.layerMan.items2Layer.addChild(_shape);
            }

            _shape.graphics.clear();
            _shape.graphics.lineStyle(1, 0xff0000, 2);
            _shape.graphics.moveTo(_posList[0].x*ptm_ratio, _posList[0].y*ptm_ratio);
            for(var i:uint=1;i<nodeCount;i++){
                _shape.graphics.lineTo(_posList[i].x*ptm_ratio, _posList[i].y*ptm_ratio);
            }
        }

        override public function destroy():void{
            if(_shape && _shape.parent){
                _shape.parent.removeChild(_shape);
                _shape=null;
            }
            super.destroy();
        }
    };

}
时间: 2024-10-16 07:25:19

绳子算法的相关文章

图解NavMesh寻路中的漏斗算法

NavMesh是广泛使用的一种寻路技术,将地图中可走的部分生成连续的多边形/三角形网格,寻路在网格中进行,主要包含两步:1.根据网格的邻接信息构造图,使用A*之类的寻路算法计算出从起点到重点需要走过的多边形/三角形集合:2.使用漏斗算法/拉绳子算法,将多边形列表转换为一条最优的路店.本文主要讲一下对于三角形列表的漏斗算法原理. 诸位读者如果搜索过网络,会发现有一年GDC有人讲了这个算法,也有几篇博客翻译了这个GDC的演讲slides,但多半都是仅仅翻译一遍slides的水平,没有真的把算法说明白

算法91----切绳子

不能一.题目:切绳子 有n根绳子,第i根绳子长度为Li,现在需要M根等长的绳子,你可以对n根绳子进行任意裁剪(不能拼接),计算出这m根绳子最长的长度是多少. 输入:第一行2个正整数N,M,表示N根原始的绳子,和最终需要M根绳子数 第二行包含N 个整数,第i个整数Li表示第i根绳子的长度 其中,1≤N.M≤100000,0 <Li<1000000000 输出一个数字,表示裁剪后最长的长度,保留两位小数. 输入: 3 4 3 5 4 输出: 2.5 二.思路: 在绳子长度中进行二分查找最长的长度,

【17贪心算法】 剪绳子

这题和我之前做的https://www.cnblogs.com/Jun10ng/p/12363679.html 是同一个题目,但是现在多了一个条件 1<=n<=1000 如果还是用dp的话,dp数组就要用大数类BigInteger 但是,还有一种解法,贪心算法 题目 同上 思路 原本打算用大数类的dp数组 但是看了下贪心的解法,也很容易理解 就是一直乘3, 收获 大数类的使用 头文件是 java.math.BigInteger 初始化函数是BigInteger(String类的数字) 代码(贪

算法笔试

1.把二元查找树转变成排序的双向链表 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向.   10  / \  6  14 / \ / \4  8 12 16 转换成双向链表4=6=8=10=12=14=16.  首先我们定义的二元查找树 节点的数据结构如下: struct BSTreeNode{  int m_nValue; // value of node  BSTreeNode *m_pLeft; // left child of

javascript 算法

前段时间学习算法方面的知识看了一下用C语言写的一些简单的算法自己用js模拟实现一遍现在整理出来和大家分享一下. 河内塔 斐波那契数列 巴斯卡三角形 三色棋 河内之塔(Towers of Hanoi)是法国人M.Claus(Lucas)于1883年从泰国带至法国的,河内为越战时北越的首都,即现在的胡志明市:1883年法国数学家Edouard Lucas曾提及这个故事,据说创世纪时Benares有一座波罗教塔,是由三支钻石棒(Pag)所支撑,开始时神在第一根棒上放置64个由上至下依由小至大排列的金盘

算法分析之三色旗算法

一条绳子挂红白蓝三种颜色的旗子,且排列无序,现用程序把三种旗子同色归类,顺序为蓝-白-红,每次只能交换2面旗子,采用最少步骤完成. 算法描述:只需把红色和蓝色的旗子进行交换,红旗和篮旗都就位后,白旗自然就位. 1) 如果白旗所在位置的元素是白旗,表示该位置的元素应该在此,将white++,接着处理下一个旗子: 2) 如果white所在位置的元素是蓝旗,表示需将蓝旗与blue变量所在位置的元素对调,然后使blue++.white++,处理下一个旗子: 3) 如果white所在位置的元素是红旗,表示

《割绳子》《蜡笔物理学》《Contre Jour》《顽皮鳄鱼爱洗澡》等游戏用Box2D引擎实现物理部分的方法(转)

从最热门游戏排行榜和flash游戏网站上,你能看到什么?许多2D游戏都有非常出色的物理学和美术设计.现在我们要学习那些游戏使用了什么物理学以及如何用Box2D制作它们. 除了知道是“什么”,更重要的是知道“如何做”,首先,我想问读者一个问题:如果你想复制物理游戏的机制或行为,你需要什么技术和方法? 一年以前,我问了自己同样的问题,<6 Dimensions>就是问题的答案.这款游戏是一个创意的盒子,每一面都包含一组使用Box2D物理学再加上视觉美学技术制作的不同的游戏机制.在此,我将与大家分享

java算法---五家共井

古代数学巨著<九章算数>中有这么一道题叫“五家共井,甲二绠(汲水用的井绳)不足,如(接上)乙一绠:乙三绠不足,如丙一绠: 丙四绠不足,如丁一绠:丁五绠不足,如戊一绠:戊六绠不足,如甲一绠,皆及. 意思就是说五家人共用一口井,甲家的绳子用两条不够,还要再用乙家的绳子一条才能打到井水:乙家的绳子用三条不够,还要再用丙家的绳子 一条才能打到井水:丙家的绳子用四条不够,还要再用丁家的绳子一条才能打到井水:丁家的绳子用五条不够,还要再用戊家的绳子一条才能打 到井水:戊家的绳子用六条不够,还要再用甲家的绳

经典算法回顾1

本文根据园主一线码农的进程来学习,今后也会自己补充一些,希望能够有所进步public class Main { public static void main(String[] args) { // TODO Auto-generated method stub /* * 公鸡五文钱一只,母鸡三文钱一只,小鸡三只一文钱 * 用100文钱买100只鸡,其中公鸡,母鸡,小鸡必须有,请问各多少只 */ for(int i = 1; i < 20;i++){ for(int j =1; j < 33;