`

[转] 缠绕规则在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  
好文 正需要

相关推荐

    Android应用源码之不规则点击区域 三角形点击区域.zip

    总之,这个压缩包中的源码实例是一个很好的学习资源,它展示了如何在Android应用中创建不规则形状的点击区域,这对于想要提升Android UI交互设计能力的开发者来说非常有价值。通过实践这个例子,你不仅可以理解点击...

    Android应用源码之不规则点击区域 三角形点击区域.rar

    在Android开发中,有时我们可能需要创建不规则的点击区域,比如三角形的点击区域,以便用户在特定形状上触发事件。...在实际项目中,这种技术可以应用于各种场景,如游戏中的可交互元素或具有特殊交互设计的UI组件。

    Android 不规则窗体

    在Android开发中,不规则窗体(Irregular Windows)指的是那些形状非标准矩形的窗口,通常用于实现一些独特或富有创意的用户界面效果。在Android系统中,默认情况下,所有的Activity都以矩形形式呈现,但通过自定义...

    DrawPath.m

    DrawPath.m

    自定义不规则进度条

    这样,我们就能在应用中看到自定义的不规则进度条了。 总结来说,实现自定义不规则进度条的关键步骤包括: 1. 创建自定义`View`类,继承自`ProgressBar`。 2. 重写`onDraw()`方法,使用`Canvas`和`Path`绘制不规则...

    android实现六边形等不规则布局.rar

    在Android开发中,有时我们需要创建独特且引人注目的用户界面,例如六边形或其它不规则形状的布局。这个压缩包"android实现六边形等不规则布局.rar"提供了实现这种效果的相关资源,让我们来深入探讨一下如何在...

    C#不规则窗体_实现

    在描述中提到的"不规则窗体+TreeView+ListView"可能意味着示例代码还包含了对这两种控件的应用。TreeView控件用于展示层次结构数据,如文件系统目录,而ListView控件则常用于显示列表项,支持多种视图模式,如图标、...

    Android高级应用源码-不规则点击区域 三角形点击区域.zip

    为了实现三角形或其他不规则形状的点击区域,我们需要自定义`View`类,覆盖`onTouchEvent()`方法来处理触摸事件,并在`onDraw()`方法中绘制非矩形形状。 1. **自定义View类**:首先,我们需要创建一个继承自`View`...

    实现不规则窗体

    在实际应用中,你可能还需要处理鼠标和键盘事件,以使不规则窗体能够正常响应用户的交互。例如,你可能需要根据窗体的形状来调整鼠标点击的处理方式,确保点击在形状内的位置才能触发相应的操作。 文件列表中的`...

    C#实现的不规则窗体代码(有圆形、方形、不规则形)

    在编程领域,尤其是在Windows桌面应用开发中,创建不规则形状的窗体是一种独特而吸引人的设计方式。C#作为.NET框架的主要开发语言,提供了丰富的功能来实现这种效果。本篇文章将详细探讨如何使用C#来实现不规则形状...

    C#制作不规则窗体例子

    在描述中提到的"vs2010启动界面"就是一个典型的不规则窗体应用,它采用了非矩形形状,增加了界面的美观性和用户体验。 不规则窗体的实现主要依赖于Windows API(应用程序接口)和.NET Framework提供的支持。Windows...

    winform创建不规则窗体和控件源码

    在Windows Forms(Winform)开发中,创建不规则窗体和控件是一项高级技术,它允许开发者设计出具有独特形状的应用程序窗口,而非传统的矩形样式。本源码示例着重于利用C#编程语言来实现这一功能。下面将详细阐述相关...

    仿微信不规则形状图片

    在Android开发中,为了提供与微信类似的用户体验,有时我们需要实现不规则形状的图片展示,比如微信中的气泡图片。这种不规则形状的图片通常用于聊天界面,以模拟真实对话中的气泡效果,使得消息看起来更加生动和...

    不规则button

    在IT行业中,尤其是在Android或iOS应用开发中,创建自定义、不规则形状的按钮(控件)是一项常见的需求。这可以提升应用的视觉效果和用户体验,使得界面更加独特且易于识别。标题“不规则button”暗示我们将探讨如何...

    商业编程-源码-本代码通过简单的代码实现不规则窗体.zip

    本压缩包文件“商业编程-源码-本代码通过简单的代码实现不规则窗体.zip”提供了一个实例,展示了如何使用简洁的代码来创建不规则形状的窗口,这种技术在现代软件开发中尤为引人注目,因为独特的用户界面可以提升用户...

    Qt不规则对话框loginDlg.tar.gz

    在标准的Qt应用程序中,对话框通常具有矩形形状,遵循窗口管理器的规则。然而,不规则对话框允许开发者自定义对话框的形状,使其可以呈现任何几何形状,这在某些场景下能够提供更吸引人的用户体验。 创建不规则...

    DrawPathTest Demo代码

    在iOS开发中,"DrawPathTest Demo代码" 是一个典型的示例项目,它演示了如何在iOS应用中使用图形上下文(Graphics Context)和Core Graphics框架来绘制自定义的路径。Core Graphics是苹果的底层2D绘图系统,支持矢量...

Global site tag (gtag.js) - Google Analytics