`

[转] 缠绕规则在drawpath中的应用

阅读更多
使用as3的绘图API绘制填充区域时,经常会涉及到相交区域的颜色填充问题。Flash Player 10 和 Adobe AIR 1.5 还引入了路径“缠绕”(即路径的方向)这一概念。路径的缠绕可以是正向的(顺时针),也可以是负向的(逆时针)。渲染器为 data 参数解释矢量所提供坐标的顺序确定了缠绕的方向。
as3中的缠绕规则分为两种:奇偶规则和非零规则,奇偶规则是标准的缠绕规则,早期的绘图 API 都使用此规则。奇偶规则也是 Graphics.drawPath() 方法的默认规则。使用奇偶缠绕规则时,任何相交路径都交替使用开放填充与闭合填充。如果使用同一填充绘制的两个正方形相交,则不会填充相交的区域。通常,相邻区域不会都填充或都不填充。另一方面,非零规则依靠缠绕(绘制方向)来确定是否填充相交路径定义的区域。当相对缠绕的路径相交时,不填充所定义的区域,这与奇偶规则十分类似。对于相同缠绕的路径,将填充本来不填充的区域。
drawpaht方法的第三个可选参数参数winding,用于指定相交路径的缠绕或填充规则。这个参数的可选项分为GraphicsPathWinding.EVEN_ODD 或GraphicsPathWinding.NON_ZERO。
EVEN_ODD 是默认行为,它指在同样的填充下,图形的重叠区域不会被填充。
NON_ZERO,则提供了更多的缠绕规则的选择,在此行为下,通过使用非零缠绕规则可以灵活控制相交区域的填充和不填充。

下面的代码演示了在NON_ZERO行为下使用非零缠绕来实现的效果:
填充相交区域:
  var commands:Vector.<int>=new Vector.<int>();
   var lineto:int=GraphicsPathCommand.LINE_TO;
   var moveto:int=GraphicsPathCommand.MOVE_TO;
   commands.push(moveto,lineto,lineto,lineto,lineto);
   commands.push(moveto,lineto,lineto,lineto,lineto);
  
   var datas:Vector.<Number>=new Vector.<Number>();
   datas.push(0,0,100,0,100,20,0,20,0,0);
   datas.push(50,-50,70,-50,70,50,50,50,50,-50);
  
   var sp:Shape=new Shape();
   sp.graphics.beginFill(0xff00ff);
   sp.graphics.drawPath(commands,datas,GraphicsPathWinding.NON_ZERO);
   sp.graphics.endFill();
  
   sp.x=100;
   sp.y=100;
   addChild(sp);
通过修改其中一个图形的画线顺序,不填充相交区域:
   var commands:Vector.<int>=new Vector.<int>();
   var lineto:int=GraphicsPathCommand.LINE_TO;
   var moveto:int=GraphicsPathCommand.MOVE_TO;
   commands.push(moveto,lineto,lineto,lineto,lineto);
   commands.push(moveto,lineto,lineto,lineto,lineto);
  
   var datas:Vector.<Number>=new Vector.<Number>();
   datas.push(0,0,0,20,100,20,100,0,0,0);
   datas.push(50,-50,70,-50,70,50,50,50,50,-50);
  
   var sp:Shape=new Shape();
   sp.graphics.beginFill(0xff00ff);
   sp.graphics.drawPath(commands,datas,GraphicsPathWinding.NON_ZERO);
   sp.graphics.endFill();
  
   sp.x=100;
   sp.y=100;
   addChild(sp);
红色部分的改变轻松的实现了相交区域的不填充。
drawPath路径绘图方法在实现简单的绘图时,增加了代码的行数。但是,当我们在绘制复杂的图形时,它就给我们来了意想不到的魅力,特别是在做3d透视的过程中。对3d基础引擎开发的有兴趣的朋友,可以好好了解一下drawpath的使用。
在AdvancED_ActionScript 3.0一书中,对drawpath使用有详细的阐述和实例讲解。

文章来源:http://www.flashandflex.com/html/ASDVA/Drawing/1203.html
分享到:
评论
1 楼 baixiaozhe 2012-03-20  
好文 正需要

相关推荐

    DrawPath.m

    DrawPath.m

    DrawPathTest Demo代码

    路径 画图 IOS Demo 绘图 代码实例

    由直线、曲线创建图形,using System.Drawing.Drawing2D;的应用例子,C#源代码 Point[]

    的应用例子,C#源代码 Point[] points = { new Point(40, 60), new Point(50, 70), new Point(30, 90)}; GraphicsPath path = new GraphicsPath(); path.StartFigure(); // Start ...

    Qt 中实现任意阶贝塞尔曲线绘制 & 动态调节

    Qt 中有相当方便的绘制接口 ( 由 QPainter 提供 ) 。 例如贝塞尔曲线的 API: QPainterPath 的 quadTo() 和 cubicTo() 然后使用 QPainter::drawPath()。 然而,美中不足的是,Qt 的贝塞尔曲线只支持二次和三次,...

    VC GDI+绘制渐灭的文字

    GDI+绘制文字使用Graphics::DrawString函数,其中的brush参数可以使用透明度,通过控制该透明度(逐渐减少从而增加透明度),实现文字的透明度逐渐增加,最终融入到背景中,达到渐变消失的效果。具体实现上,设置...

    DrawPath:Java GUI + lejos EV3创建一个机器人,该机器人将沿着Java GUI中的画线前进,并且实现目标不需要的其他功能

    绘制路径 请注意,这是一个非常基本的程序,几乎没有使用Java的面向对象功能,它是为我的A级计算课程编写... Java GUI + lejos EV3创建一个机器人,该机器人将沿着Java GUI中的画线前进,并且实现目标不需要的其他功能

    使用文字线条轮廓创建窗体,C#源代码,设定文本输出质量,创建路径区域,向区域中追加文本,

    使用文字线条轮廓创建窗体,C#源代码,设定文本输出质量,创建路径区域,向区域中追加文本, //使用文字线条轮廓创建窗体 this.BackgroundImage = Image.FromFile("Water lilies.jpg"); Graphics g = this....

    android实现圆弧(或直线)进度框 可包裹任意layout或单个imageview

    在棋牌游戏开发过程中遇到了这样的一个需求: 需要在一个LAYOUT层外边实现进度的显示实现时钟的功能。 在github上面搜到了android-square-progressbar这个项目,可实现在图片周围显示进度。demo地址: ...

    ITween插件

    DrawPath的效果是在编辑器内部可以看到,但是运行时没有的 每个函数的参数和DrawLine()一样,就不一一列举了。 其中DrawLine是画直线而DrawPath是画曲线路径,也是物体移动的实际路径。 函数以Gizmos结尾的和...

    QT 绘图函数

    这是因为,反走样是一种比较复杂的算法,在一些对图像质量要求不高的应用中,是不需要进行反走样的。为了提高效率,一般的图形绘制系统,如Java2D、OpenGL之类都是默认不进行反走样的。 还有一个疑问,既然反走样...

    Android中PathMeasure仿支付宝支付动画

    在 Android 自定义 View 中,Path 可能用的比较多,PathMeasure 可能用的比较少,就我而言,以前也没有使用过 PathMeasure 这个 api,看到别人用 PathMeasure 和 ValueAnimator 结合在一起完成了很好的动画效果,于是...

    python3实现小球转动抽奖小游戏

    最近老师在讲 tkinter,所以我做了一个抽奖小游戏。 一、效果图 先上效果图。红色的小球会围绕蓝色小球做环形运动。我设置的四个角是奖品,其余的都是再接再厉。 二、方法 基于tkinter中的button,text,PIL ,time....

    AndroidAnimation-Android自定义View之星球运动.zip

     这是在dribbble中发现的动画 这是我自己实现的效果... 总觉得我这个星球有点胖... 因为胖所以转的慢么这是.速度等细节还有优化的余地设计过程老办法,先分解动画的构成.整个动画可以看做是一个自旋的星球从右上角...

    QT实现橡皮擦功能.rar

    QT实现的,环境是QT Creater 4.10.1 对应的QT版本是qt5.13.2.实现的功能是打开图片,画笔功能,橡皮擦功能,保存图片

    C# for CSDN 乱七八糟的看不懂

    本文由abc2253130贡献 doc文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。 C#(WINFORM)学习 一、 C#基础 基础 类型和变量 类型和变量 类型 C# 支持两种类型:“值类型”和“引用类型...

    C#全能速查宝典

    1.4.29 LastIndexOf方法——确定字符在字符串中最后索引 70 1.4.30 Matches方法——检查字符串是否有重复的词出现 71 1.4.31 MONTH函数——返回指定日期中月部分的整数 73 1.4.32 PadLeft方法——在左边用空格填充 ...

    Android代码-TextPathView是一个把文字转化为路径动画然后展现出来的自定义控件

     TextPathView分为两种,一种是每个笔画按顺序刻画的SyncTextPathView,一种是每个笔画同时刻画的AsyncTextPathView,使用方法都是一样,在xml里面配置属性,然后直接在java里面调用startAnimation()方法就行了,...

    CustomAnimationFramework:Android自定义曲线路径动画框架

    最近在一个项目中需要一个像QQ打开个人爱好那样的动画效果如下图: 可以看出每个小球都是以顺时针旋转出来的,说明像这样的曲线动画用Android中自带的平移动画是很难实现的。 曲线动画怎么画??? 我们先来看看Android...

    Android实现屏幕手写签名

    Android屏幕手写签名的原理就是把手机屏幕...在有移动操作与提起动作时调用Canvas对象的drawPath方法,将本次触摸绘制在画布上。 layout/activity_signature.xml界面布局代码如下: &lt;LinearLayout xmlns:android=

    android判断点击位置是否在扇形区域内

    在做仿支付宝记账本界面效果时遇到了一个问题,在环形图中点击每一个环是会显示出不同的内容,因此,必须判断用户到底点击了哪个圆环,网上查阅资料说可以根据颜色来判断,但是心里总是觉得根据颜色不是很好的解决...

Global site tag (gtag.js) - Google Analytics