计算机图形学(二)输出图元_10_多边形填充区_2_分割凹多边形

分割凹多边形

一旦识别出凹多边形,我们可以将它切割成一组凸多边形。这可使用边向量和边叉积来完成。我们可以利用顶点和边延长线的关系来确定哪些顶点在其一侧,哪些顶点在另一侧。在下面的算法中我们假定所有多边形均在xy平面上。当然,在世界坐标系中描述的多边形的初始位置可能不在xy平面上,但我们可以使用第5章的讨论的变换方法将它们移到xy平面上。对于分割凹多边形的向量方法(vector method),我们首先要形成边向量。给定相继的向量位置Vk和Vk+1定义边向量:

接着按多边形边界顺序计算连续的边向量的叉积。如果有些叉积的z分量为正而另一些为负,则多边形为凹多边形;否则,多边形为凸多边形。这意味着不存在三个连续的顶点共线,即不存在连续两个边向量其叉积为0。如果所有顶点共线,则得到一个退化多边形(一条线段)。我们可以通过逆时针方向处理边向量来应用向量方法。如果有一个叉积的z分量为负值(如图3.43所示),那么多边形为凹且可沿叉积中第一边向量的直线进行切割。下面的例子给出了分割凹多边形的这一方法。

例3.4分割凹多边形的向量方法

图3.44给出了一个有6个顶点的凹多边形。该多边形的边向量表示为

这里的z分量均为0,因为所有边均在xy平面上。两个连续的边向量的叉积Ejx Ek是垂直于xy平面的向量,其分量等EjxEky- EkxEjy:

因为叉积E2 x E3的z分量为负,我们沿向量E2的直线分割多边形。该边的直线方程中的斜率为1而y轴截距为-1。然后我们可以确定这条直线和其他边的交点来将多边形分割成两片。其他边又积不为负,所以得到的两个多边形均为凸多边形。

我们还可以使用旋转法(rotational method)来分割凹多边形。沿多边形的边的逆时针方向,逐一将顶点Vk移到坐标系原点。然后顺时针旋转多边形,使下一顶点Vk+1落在x轴上。如果再下一个顶点Vk+2位于x轴下面,则多边形为凹。然后我们利用x轴将多边形分割成两个新多边形,并对这两个新多边形重复使用凹测试。上述步骤一直重复到多边形中所有顶点均经过测试。对象位置旋转和平移的方法将在第5章讨论。图3.45给出了分割凹多边形的旋转法。

将凸多边形分割成三角形集

一旦有了一个凸多边形的顶点集,我们可以将其变成一组三角形。这通过将任意顺序的三个连续顶点定义为一个新多边形(三角形)来实现。然后将三角形的中间顶点从多边形原顶点队列中删除。接着使用相同的过程处理修改后的顶点队列来分出另一个三角形。这种分割一直进行到原多边形仅留下三个顶点,它们定义三角形集中的最后一个。凹多边形也可以使用这种方法分割为三角形集,但要求每次三顶点形成的内角小于180o(一个“凸”角)。

时间: 2024-11-14 23:55:43

计算机图形学(二)输出图元_10_多边形填充区_2_分割凹多边形的相关文章

计算机图形学(二)输出图元_10_多边形填充区_7_OpenGL多边形填充区函数(上)

OpenGL多边形填充区函数(上) 描述填充多边形的OpenGL过程与描述点和折线类似,但有一个例外.函数glVertex用来输入多边形的一个顶点坐标,而完整的多边形用从glBegin到glEnd之间的一组顶点来描述.但有另外一个函数可以用来显示具有完全不同格式的矩形. 默认时多边形内部显示为单色,由当前颜色设定确定其颜色.作为选项(下面的内容中叙述),可以用图案填充多边形且显示多边形的边作为内部填充的边界.函数glBegin中指定多边形填充区的变量可使用6个不同的符号常量.这6个基本常量可用来

计算机图形学(二)输出图元_10_多边形填充区_1_多边形分类和识别

多边形填充区 一个多边形(polygon)在数学上定义为由三个或者更多称为顶点的坐标位置描述的平面图形,这些顶点由称为多边性的边(edge或者side)顺序连接.进一步来看,几何上要求多边形的边除了端点之外没有其他公共点.因此,根据定义,一个多边形在其单一平面上必须有其所有的顶点且边之间无交叉.多边形的例子有三角形.矩形.八边形和十六边形等.有时,任一有封闭折线边界的平面图形暗指一个多边形,而若其没有交叉边则称为标准多边形(( standard polygon)或简单多边形( simple po

计算机图形学(二)输出图元_10_多边形填充区_3_内-外测试

内-外测试 各种图形处理经常需要鉴别对象的内部区域.识别简单对象如凸多边形.圆或椭圆的内部通常是一件很容易的事情.但有时我们必须处理较复杂的对象.例如,我们可能描述一个图3.46所示的有相交边的复杂填充区.在该形状中,xy平面上哪一部分为对象边界的"内部".哪一部分为"外部"并不总是一目了然的.奇偶规则和非零环绕规则是识别平面图形内部区域的两种常用方法. 奇偶规则(odd-even rule)也称奇偶性规则(odd-parity rule)或偶奇规则(even-od

计算机图形学(二)输出图元_10_多边形填充区_8_OpenGL顶点数组

OpenGL顶点数组 尽管前面给出的例子中只包含少量的坐标位置,但描述包含若干个对象的场景一般会复杂得多.我们先考虑描述一个简单的很基本的对象:图3.58中的单位立方体,为简化后面的讨论而使用了整数坐标.定义顶点坐标的直接方法是用一个双下标数组,例如: GLint points [8][3] = {{0,0,0},{0,1,0},{1,0,0},{1,1,0},{0,0,1},{0,1,1},{1,0,1},{1,1,1}}; 也可以先定义一个三维顶点位置的数据类型,然后给出作为单下标数组元素的

计算机图形学(二)输出图元_10_多边形填充区_4_多边形表

多边形表 场景中的对象一般用一组多边形面片来描述.实际上,图形软件包经常提供以多边形网格形式描述表面形状的函数.对每一个对象的描述包括指定多边形面片的几何信息和其他表面参数(如颜色.透明性及光反射特性).在输入每个多边形的信息时,数据放进一些表格中等待后续处理.显示和场景的对象管理.这些多边形数据表分成两组来组织:几何数据表和属性数据表.几何数据表包含顶点坐标和标识多边形面片空间方向的参数.对象的属性信息包含指定对象的透明程度及其表面的反射性能和纹理特征. 场景中对象的几何数据简单地组织为三张表

计算机图形学 复习笔记

计算机图形学 复习笔记 (个人整理,仅做复习用 :D,转载注明出处:http://blog.csdn.net/hcbbt/article/details/42779341) 第一章 计算机图形学综述 研究内容 图形的概念:计算机图形学的研究对象 能在人的视觉系统中产生视觉印象的客观对象 包括自然景物.拍摄到的图片.用数学方法描述的图形等等 图形的要素 几何要素:刻画对象的轮廓.形状等 非几何要素:刻画对象的颜色.材质等 图形表示法 点阵表示 枚举出图形中所有的点,简称为图像. 参数表示 由图形的

计算机图形学(二)输出图元_20_章节总结(上)

输出图元章节总结 发了好久第2章终于结束了,本章中讨论的输出图元为使用直线.曲线.填充区域.单元阵列样式和文本构造图形提供了基本的工具.我们通过在笛卡儿世界坐标系统中给出几何描述来指定图元. 用于沿线段路径绘制像素的三种方法是DDA算法.Bresenham算法和中点算法,Bresenham算法和中点算法是等同的并且是最有效的.沿线段路径的像素的颜色位存储按照递增地计算内存地址的方式而有效完成.任何线段生成算法都可以通过分割线段并将分割的线段分布到可用处理器上来获得并行的实现. 圆和椭圆采用中点算

计算机图形学 有效边表填充算法(6)

作者:卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/40154077 本文通过一个完整的实例,展示多边形有效边表填充算法. 1)创建CAET类 头文件:AET.h // AET.h: interface for the CAET class. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_AET_

计算机图形学和OpenGL(二)坐标系和绘制点线函数

这节开始前我们先了解一下图元的概念.图形软件包中用来描述各种图形元素的函数称为图形输出原语,也称图元(primitive).而描述对象几何要素的输出图元一般称为几何图元.点和线是最简单的几何图元,本节就会简单介绍点和线段的绘制方法. 一.坐标系统. 坐标系统一般分为屏幕坐标和OpenGL中的绘图坐标. 在上一节中我们简单的写了个示例程序,程序中介绍了gluOrtho2D命令.我们可以利用该命令设定一个二维笛卡尔坐标系.该函数的四个变量制定的是显示图形x和y坐标范围.所以我们可以使用下面代码制定一