返回顶部
首页 > 资讯 > 后端开发 > Python >AS3贝塞尔曲线类
  • 919
分享到

AS3贝塞尔曲线类

塞尔曲线 2023-01-31 06:01:59 919人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

贝塞尔曲线被广泛用于塔防类的游戏,当然一些特殊的缓动效果有些 也用 到这个 , 目前 这个没必要我们担心 , TweenMax 为我们提供了这些功能. package com.ainy.benz { import flash.geo

贝塞尔曲线被广泛用于塔防类的游戏,当然一些特殊的缓动效果有些 也用 到这个 , 目前 这个没必要我们担心 , TweenMax 为我们提供了这些功能.

package com.ainy.benz
{
    import flash.geom.Point;
                                   
    public class Bezier{
                                       
        //  =====================================  属性
                                       
        //  对外变量
        private  var p0:Point;                  // 起点
        private  var p1:Point;                  // 控制点
        private  var p2:Point;                  // 终点
        private  var step:uint;                 // 分割份数
                                       
        //  辅助变量
        private  var ax:int;
        private  var ay:int;
        private  var bx:int;
        private  var by:int;
                                       
        private  var A:Number;
        private  var B:Number;
        private  var C:Number;
                                       
        private  var total_length:Number;           // 长度
                                       
        private static var $instance : Bezier;
        public static function instance() : Bezier{
            if(null == $instance){
                $instance = new Bezier();
            }
            return $instance;
        }
        public function Bezier(){
            if($instance != null ){
                throw new Error("Bezier 类被设计成单例了!!!");
            }else{
                $instance = this;
            }
        }
                                       
        //  =====================================  方法
                                       
        //  速度函数
        private  function s (t:Number):Number
        {
            return Math.sqrt(A * t * t + B * t + C);
        }
                                       
        //  长度函数
        private  function L (t:Number):Number
        {
            var temp1:Number = Math.sqrt(C + t * (B + A * t));
            var temp2:Number = (2 * A * t * temp1 + B *(temp1 - Math.sqrt(C)));
            var temp3:Number = Math.log(B + 2 * Math.sqrt(A) * Math.sqrt(C));
            var temp4:Number = Math.log(B + 2 * A * t + 2 * Math.sqrt(A) * temp1);
            var temp5:Number = 2 * Math.sqrt(A) * temp2;
            var temp6:Number = (B * B - 4 * A * C) * (temp3 - temp4);
                                           
            return (temp5 + temp6) / (8 * Math.pow(A, 1.5));
        }
                                       
        //  长度函数反函数,使用牛顿切线法求解
        private  function InvertL (t:Number, l:Number):Number{
            var t1:Number = t;
            var t2:Number;
            do{
                t2 = t1 - (L(t1) - l)/s(t1);
                if (Math.abs(t1-t2) < 0.000001) break;
                t1 = t2;
            }while(true);
            return t2;
        }
                                       
                                       
        //  返回所需总步数
            
        public  function init ($p0:Point, $p1:Point, $p2:Point, $speed:Number):uint
        {
            p0   = $p0;
            p1   = $p1;
            p2   = $p2;
            //step = 30;
                                           
            ax = p0.x - 2 * p1.x + p2.x;
            ay = p0.y - 2 * p1.y + p2.y;
            bx = 2 * p1.x - 2 * p0.x;
            by = 2 * p1.y - 2 * p0.y;
                                           
            A = 4*(ax * ax + ay * ay);
            B = 4*(ax * bx + ay * by);
            C = bx * bx + by * by;
                                           
            //  计算长度
            total_length = L(1);
                                           
            //  计算步数
            step = Math.floor(total_length / $speed);
            if (total_length % $speed > $speed / 2)  step ++;
                                           
            return step;
        }
                                       
        // 根据指定nIndex位置获取锚点:返回坐标和角度
        public  function getAnchorPoint (nIndex:Number):Array
        {
            if (nIndex >= 0 && nIndex <= step)
            {
                var t:Number = nIndex/step;
                //  如果按照线行增长,此时对应的曲线长度
                var l:Number = t*total_length;
                //  根据L函数的反函数,求得l对应的t值
                t = InvertL(t, l);
                                               
                //  根据贝塞尔曲线函数,求得取得此时的x,y坐标
                var xx:Number = (1 - t) * (1 - t) * p0.x + 2 * (1 - t) * t * p1.x + t * t * p2.x;
                var yy:Number = (1 - t) * (1 - t) * p0.y + 2 * (1 - t) * t * p1.y + t * t * p2.y;
                                               
                //  获取切线
                var Q0:Point = new Point((1 - t) * p0.x + t * p1.x, (1 - t) * p0.y + t * p1.y);
                var Q1:Point = new Point((1 - t) * p1.x + t * p2.x, (1 - t) * p1.y + t * p2.y);
                                               
                //  计算角度
                var dx:Number = Q1.x - Q0.x;
                var dy:Number = Q1.y - Q0.y;
                var radians:Number = Math.atan2(dy, dx);
                var degrees:Number = radians * 180 / Math.PI;
                                               
                return new Array(xx, yy, degrees);
            }
            else
            {
                return [];
            }
        }
    }
}

应用:

steps = Bezier.instance().init(startPoint,controlPoint,endPoint,8);
            var tmpArr:Array = Bezier.instance().getAnchorPoint(crtStep);
            arrow.x =  tmpArr[0];
            arrow.y =  tmpArr[1];
            arrow.rotation =  tmpArr[2];
            this.crtStep++;
            if(crtStep>steps){
                crtStep=0;
                if(Math.random()>0.5){
                    tower.shooterLeft.GotoAndPlay(2);
                }else{
                    tower.shooterRight.gotoAndPlay(2);
                }
            }

Http://blog.sqstudio.com/as3/algorithm/768.html#codesyntax_2


--结束END--

本文标题: AS3贝塞尔曲线类

本文链接: https://lsjlt.com/news/189846.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • AS3贝塞尔曲线类
    贝塞尔曲线被广泛用于塔防类的游戏,当然一些特殊的缓动效果有些 也用 到这个 , 目前 这个没必要我们担心 , TweenMax 为我们提供了这些功能. package com.ainy.benz { import flash.geo...
    99+
    2023-01-31
    塞尔 曲线
  • iOS实现贝塞尔曲线动画
    本文实例为大家分享了iOS实现贝塞尔曲线动画的具体代码,供大家参考,具体内容如下 效果如图: 仿美人相机,手势滑动隐藏顶部view。为了方便讲解,将屏幕分为几个区域,如图: 在拖...
    99+
    2022-06-04
    iOS 贝塞尔曲线
  • canvas如何仿写贝塞尔曲线
    这篇文章给大家分享的是有关canvas如何仿写贝塞尔曲线的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。效果图:html<canvas id="mycan...
    99+
    2024-04-02
  • Unity贝塞尔曲线之美体验
    最近项目中用到了贝塞尔曲线,学习完成后记录一下自己的学习结果吧。 一阶贝塞尔曲线 一阶贝塞尔曲线就是一条线,我们很容易根据 t 求出 t 点的位置。 P(t)=P0+(P1-P...
    99+
    2024-04-02
  • Android自定义view贝塞尔曲线
    本文实例为大家分享了Android自定义view贝塞尔曲线,供大家参考,具体内容如下 贝塞尔曲线 以一个简单的贝塞尔曲线为例,二阶曲线原理 贝塞尔曲线很多功能都会用到,比如小火箭发...
    99+
    2024-04-02
  • Android用Canvas绘制贝塞尔曲线
    用Canvas画贝塞尔曲线,要画贝塞尔曲线首先了解贝塞尔曲线: 由于用计算机画图大部分时间是操作鼠标来掌握线条的路径,与手绘的感觉和效果有很大的差别。即使是一位精明的画师能轻松绘出各...
    99+
    2024-04-02
  • C#实现贝塞尔曲线的方法
    本文实例为大家分享了C#实现贝塞尔曲线的具体代码,供大家参考,具体内容如下 话不多直接上代码 public Transform[] controlPoints; //曲线的控制点 ,...
    99+
    2024-04-02
  • HTML5 Canvas如何绘制贝塞尔曲线
    这篇文章给大家分享的是有关HTML5 Canvas如何绘制贝塞尔曲线的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 贝塞尔曲线 :它可以是二次和三次方的形式,一般用于绘制复杂而...
    99+
    2024-04-02
  • Android使用贝塞尔曲线画心形
    本文实例为大家分享了Android使用贝塞尔曲线画心形的具体代码,供大家参考,具体内容如下 一开始我只是想画个圆,可画着画着就成了心形,那就将错就错 1. 创建一个Activity ...
    99+
    2024-04-02
  • 贝塞尔曲线、Path、PathMeasure理解在Android中
     1. 贝塞尔曲线在数学上的理解    3 点确定一断曲线,对于二阶贝塞尔曲线    在t 时间内,    从p0 到  q    从q  到 p1 上的点的连线,对应的切线,...
    99+
    2022-06-06
    path 贝塞尔 贝塞尔曲线 Android
  • android中贝塞尔曲线的应用示例
    前言: 贝塞尔曲线又称贝兹曲线,它的主要意义在于无论是直线或曲线都能在数学上予以描述。最初由保罗·德卡斯特里奥(Paul de Casteljau)于1959年运用德卡斯特里奥...
    99+
    2022-06-06
    示例 贝塞尔 贝塞尔曲线 Android
  • 如何使用canvas绘制贝塞尔曲线
    今天就跟大家聊聊有关如何使用canvas绘制贝塞尔曲线,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1、二次贝塞尔曲线  quadraticCurv...
    99+
    2024-04-02
  • canvas如何实现高阶贝塞尔曲线
    这篇文章主要介绍canvas如何实现高阶贝塞尔曲线,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!为什么需要一个试验场?在绘制复杂的高阶贝塞尔曲线时无法知道自己需要的曲线的控制点的精确位置。在试验场中进行模拟,可以实时...
    99+
    2023-06-09
  • 怎么在CSS中反转贝塞尔曲线
    今天就跟大家聊聊有关怎么在CSS中反转贝塞尔曲线,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。css是什么意思css是一种用来表现HTML或XML等文件样式的计算机语言,主要是用来设...
    99+
    2023-06-08
  • Android怎么自定义view贝塞尔曲线
    这篇文章主要介绍了Android怎么自定义view贝塞尔曲线的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android怎么自定义view贝塞尔曲线文章都会有所收获,下面我们一起来看看吧。贝塞尔曲线以一个简单的...
    99+
    2023-07-02
  • Android怎么用Canvas绘制贝塞尔曲线
    这篇文章主要介绍了Android怎么用Canvas绘制贝塞尔曲线的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android怎么用Canvas绘制贝塞尔曲线文章都会有所收获,下面我们一起来看看吧。用Canvas...
    99+
    2023-07-02
  • Android贝塞尔曲线初步学习第一课
    贝塞尔曲线有一阶、二阶、三阶、N阶 一阶就是一条直线,有起点终点,没有控制点,对应方法就是 canvas.drawLine(float startX, float sta...
    99+
    2022-06-06
    学习 Android
  • css3贝塞尔曲线函数有哪些参数
    本篇内容主要讲解“css3贝塞尔曲线函数有哪些参数”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“css3贝塞尔曲线函数有哪些参数”吧! ...
    99+
    2024-04-02
  • Android 贝塞尔曲线绘制一个波浪球
    目录前言一、绘制 backgroundColor 文本二、构建 circlePath三、绘制波浪线四、取交集五、绘制 foregroundColor 文本六、添加动画七、使用前言 当...
    99+
    2024-04-02
  • Android如何使用贝塞尔曲线画心形
    这篇“Android如何使用贝塞尔曲线画心形”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Android如何使用贝塞尔曲线画...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作