网上有很多使用AS3画一个扇形的方法,但是却一个都没有解释这个函数是如何运作来画出扇形的,下面浅谈下我对这个函数的理解。

首先上代码,代码来自http://blog.csdn.net/weiming8517/article/details/12023411。

private function drawSector(mc:Sprite, x:Number = 200, y:Number = 200, r:Number = 100, angle:Number = 60, startFrom:Number = 0, color:uint = 0x000000):void
{
mc.graphics.clear();
mc.graphics.beginFill(color,50);
mc.graphics.lineStyle(0,color);
mc.graphics.moveTo(x,y); angle=(Math.abs(angle)>360)?360:angle; var n:Number=Math.ceil(Math.abs(angle)/45); var angleA:Number=angle/n; angleA=angleA*Math.PI/180; startFrom=startFrom*Math.PI/180; mc.graphics.lineTo(x+r*Math.cos(startFrom),y+r*Math.sin(startFrom)); for(var i:int = 1;i <= n;i++)
{
startFrom+=angleA; var angleMid:Number = startFrom-angleA/2; var bx:Number=x+r/Math.cos(angleA/2)*Math.cos(angleMid); var by:Number=y+r/Math.cos(angleA/2)*Math.sin(angleMid); var cx:Number=x+r*Math.cos(startFrom); var cy:Number=y+r*Math.sin(startFrom); mc.graphics.curveTo(bx,by,cx,cy);
} if(angle!=360)
{
mc.graphics.lineTo(x,y);
} mc.graphics.endFill();
}

画扇形函数

其中,angle是我用60度,起始点是(200,200),半径100,从右开始画,这样可以理解的容易些。

第一步,把要画的扇形角度等份分解成几个小部分,每部分不超过45度,同时因为等份分解,每部分的弧度也就相等,这里分成了2个30度。

第二步,对每个小部分绘制贝塞尔曲线,曲线需要3个点:起点,控制点,终点。

起点即当前绘图位置,第一次调用时,当前绘图位置在(300,200),图中起点是D点。

终点即这次小部分绘制中,最后要到达的点,图中终点是E点。

控制点是用来控制曲线弯曲的程度,曲线不会经过控制点,只会达到控制点与(起点与终点的连线即直线DE)的垂线的一半,图中C是控制点。

从图中可见,绿色线表示扇形的弧线,弧线最远也只达到C点的一半,这样这一部分的扇形就画好了。

PS:请无视图中的Y坐标,这是几何画板里的直角坐标系,非flash坐标系

第三步,重复第二步的过程,直到角度全画完。

第四步,返回最开始的起点(200,200),绘制完成。

补充:这个方法画的扇形其实还是有点误差的,图中的绿色弧线是圆的一部分,O是圆点,所以OD=OB=OE=100,角DOE是30度,OC垂直DE,CD垂直OD,可以轻松算出OA长度是100*cos(15度),OC长度是100/cos(15度),然后就可得出AB、BC的长度很相近但是不相等的,而贝塞尔曲线的控制点C是在AB延长线上且AB'=B'C,所以B'会是比图中的B更靠近A一点点的地方。所以说这个函数方法只是相似的画了一个扇形。

AS3绘制扇形算法解析的更多相关文章

  1. [转]SURF算法解析

    SURF算法解析 一.积分图像    积分图像的概念是由Viola和Jones提出的.积分图像中任意一点(i,j)的值为原图像左上角到任意点(i,j)相应的对焦区域的灰度值的总和,其数学公式如图1所示 ...

  2. 绘制扇形效果线条小Bug解决

    绘制线条基本代码: 变量: CPoint m_ptOrigin;//起点坐标 bool m_bTrue;//检查鼠标左键是否按下 CPoint m_ptOldOrigin;//记录上一次绘制终点坐标, ...

  3. 地理围栏算法解析(Geo-fencing)

    地理围栏算法解析 http://www.cnblogs.com/LBSer/p/4471742.html 地理围栏(Geo-fencing)是LBS的一种应用,就是用一个虚拟的栅栏围出一个虚拟地理边界 ...

  4. KMP串匹配算法解析与优化

    朴素串匹配算法说明 串匹配算法最常用的情形是从一篇文档中查找指定文本.需要查找的文本叫做模式串,需要从中查找模式串的串暂且叫做查找串吧. 为了更好理解KMP算法,我们先这样看待一下朴素匹配算法吧.朴素 ...

  5. Peterson算法与Dekker算法解析

    进来Bear正在学习巩固并行的基础知识,所以写下这篇基础的有关并行算法的文章. 在讲述两个算法之前,需要明确一些概念性的问题, Race Condition(竞争条件),Situations  lik ...

  6. python常见排序算法解析

    python——常见排序算法解析   算法是程序员的灵魂. 下面的博文是我整理的感觉还不错的算法实现 原理的理解是最重要的,我会常回来看看,并坚持每天刷leetcode 本篇主要实现九(八)大排序算法 ...

  7. Java虚拟机对象存活标记及垃圾收集算法解析

    一.对象存活标记 1. 引用计数算法 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器就加1:当引用失效时,计数器就减1:任何时刻计数器都为0的对象就是不可能再被使用的. 引用计数算法(Re ...

  8. JVM垃圾回收算法解析

    JVM垃圾回收算法解析 标记-清除算法 该算法为最基础的算法.它分为标记和清除两个阶段,首先标记出需要回收的对象,在标记结束后,统一回收.该算法存在两个问题:一是效率问题,标记和清除过程效率都不太高, ...

  9. DeepFM算法解析及Python实现

    1. DeepFM算法的提出 由于DeepFM算法有效的结合了因子分解机与神经网络在特征学习中的优点:同时提取到低阶组合特征与高阶组合特征,所以越来越被广泛使用. 在DeepFM中,FM算法负责对一阶 ...

随机推荐

  1. MyBatis操作指南-搭建项目基础环境(基于XML)含log4j配置

  2. C# ASP.NET MVC HtmlHelper用法大全

    UrlHrlper 下面的两个地址一样的功能 下边这个防止路由规则改变 比如UserInfo/Index改为UserInfo-Index,使用下面的不受影响 另一种形式的超链接: <%: Htm ...

  3. chrome浏览器不允许记忆登录账户的方法

    autocomplete方法 https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turning_off_ ...

  4. background-clip,background-origin

    开门见山,简单来说 background-origin定义了background的绘制区域(就是从什么地方开始绘制),三个属性 padding-box 背景图像相对于内边距框来绘制border-box ...

  5. C# 中using的几个用途

    参考文献 http://www.cnblogs.com/morningwang/archive/2008/03/12/1102952.html http://msdn.microsoft.com/zh ...

  6. ReportDB数据库存储选型分析

    SQLServer关于reportDB的存储选型做如下分析: 网络存储两大主要类型: 1.NAS 支持的文件传输协议:NFS(unix/linux文件共享).SMB(windows).samba(li ...

  7. java基本数据类型包装类

    Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数 ...

  8. 替换所有字符串,获取url参数值

    替换所有的字符串: var newStr = str.replace(/null/g, ""); 获取url参数值 <script type="text/javas ...

  9. 使用匿名函数在回调函数中正确访问JS循环变量

    有时候, 需要以不同的参数调用某个URL,并且在回调函数中仍然可以访问正在使用的参数, 这时候, 需要使用闭包保存当前参数, 否则, 当回调函数执行时, 之前的参数很可能早已被修改为最后一个参数了. ...

  10. Dynamics AX 2012 R3 Demo 安装与配置 - 导入测试数据 (Step 4)

        在前面三节中,Reinhard分别讲解了如何配置安装环境,安装数据库服务器,AOS和客户端,安装后的编译和配置.如果一直跟随Reinhard的脚步,到这里,已经拥有一个没有数据的系统.     ...