计算机图形学(二)输出图元_10_多边形填充区_2_分割凹多边形
来源:互联网 发布:sql 删除行数据 编辑:程序博客网 时间:2024/05/06 16:01
分割凹多边形
一旦识别出凹多边形,我们可以将它切割成一组凸多边形。这可使用边向量和边叉积来完成。我们可以利用顶点和边延长线的关系来确定哪些顶点在其一侧,哪些顶点在另一侧。在下面的算法中我们假定所有多边形均在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(一个“凸”角)。
- 计算机图形学(二)输出图元_10_多边形填充区_2_分割凹多边形
- 计算机图形学(二)输出图元_10_多边形填充区_1_多边形分类和识别
- 计算机图形学(二)输出图元_10_多边形填充区_4_多边形表
- 计算机图形学(二)输出图元_10_多边形填充区_3_内-外测试
- 计算机图形学(二)输出图元_10_多边形填充区_5_平面方程
- 计算机图形学(二)输出图元_10_多边形填充区_6_前向面与后向面
- 计算机图形学(二)输出图元_11_OpenGL多边形填充区函数(上)
- 计算机图形学(二)输出图元_11_OpenGL多边形填充区函数(下)
- 计算机图形学(二)输出图元_9_填充区图元
- 计算机图形学-多边形填充法
- 计算机图形学(二)输出图元_14_OpenGL像素阵列函数_2_像素图函数
- 计算机图形学(二)输出图元_2_ OpenGL画线函数
- 计算机图形学(二)输出图元_6_OpenGL曲线函数_2_中点画圆算法
- 计算机图形学(二)输出图元_18_显示列表_2_执行OpenGL显示表
- 计算机图形学(二)输出图元_17_图形分割
- 计算机图形学(三)_图元的属性_10_ 通用扫描填充算法
- 计算机图形学(二)输出图元
- 如何识别分割凹多边形
- Appium移动自动化环境搭建
- Java中的NIO和IO的对比分析
- 思迅账套数据库软件修复,思迅软件数据库置疑
- [J2SE]s02e06.反射(课后练习)
- Swift设计模式之外观模式
- 计算机图形学(二)输出图元_10_多边形填充区_2_分割凹多边形
- ANSI、GBK、GB2312、UTF-8、GB18030和、UNICODE编码解读
- 增强学习Reinforcement Learning经典算法梳理3:TD方法
- Android Https相关完全解析 当OkHttp遇到Https
- Swift设计模式之适配器模式
- 1.Linux基础权限
- 权限管理-数据权限
- XML无效字符过滤
- [Gradle]Error:java.lang.OutOfMemoryError: Java heap space . Please assign more memory to Gradle in t