计算机图形学的多边形的扫描转化代码实现,[计算机图形学]多边形扫描转换算法...

多边形的表示

顶点表示。只要得到顶点再连线即可。如果是凸多边形由点集极角排序即可,其他情况不太了解

点阵表示。需要判断哪些属于内部点

本文主要讨论点阵表示

其实主要是PPT的copy,但是复制一遍确实印象深刻一点??

1.逐点判断法

即一个个点判断是不是属于图形内部,主要方法是射线法。

从待判断点发出射线,设与多边形交点个数为\(k\)

\(k\)与多边形边的交点若为奇数,在内部;若为偶数,则该点在外部

90f5d3087f1faab6aae5c324fdd8dfc9.png

特殊情况:

该点在边上,要先特判该点是不是边上一点

射线在边上,会有无数个点,要特断射线是否与边同线

交点为顶点,如果异测是1个,同侧算0个或2个

aa80748342020dff2fc2c6d1542bfc18.png

这个算法的特点是复杂度高

改进:利用内部点的连续性

2.扫描线算法

基本思路

扫描线一般取平行于\(X\)轴的直线,区间是指扫描线与边的交点

将扫描线与边的交点按\(x\)坐标从小到大排序

交点两两配对(交点个数为偶数),填充区间

连贯性

(1)边的连贯性(Edge Coherence)—优化交点计算

某条边与当前扫描线相交,也可能与下一条扫描线相交

如\(L_1\)与边AE和AB相交,下条扫描线\(L_2\)也与边AE和AB相交。

(2)扫描线的连贯性(Scan-line Coherence) )—优化交点排序

当前扫描线与各边的交点顺序与 下一条扫描线与各边的交点 顺序可能相同或类似

如点1,2的次序与点3,4的次序

(3)区间的连贯性(Span Coherence)

同一区间上的像素取同一颜色属性

如点3和点4之间的线段

8bb944a009bc4cf5707e6e71c850403f.png

交点计算

由扫描线\(y=e\)与多边形的交点递推计算扫描线 \(y=e+1\)的交点

第一类交点:位于同一条边上的后继交点—如\(I_0,I_2,I_4\) : $x’=x+\frac{1}{m} $

第二类交点:边与扫描线的第一个交点—如\(I_3 , I_1\) : 就是边的下端点

3c15683fbb273fc81b0649ed42dc2ac9.png

水平边不参与计算交点

算法数据结构

一、边的分类表\(ET\)(Edge Table)

b9f961101b65883e15cc0ec540be5a4c.png

按照边的下端点,对非水平边进行分类的链表

下端点\(y\)坐标值等于\(i\)的边属于第i类,同类中有多条边时按\(x\)从小到大排序(\(x\)也一样时按边上端点的\(x\)值)

struct ET{

int ymax; //边的上端点的y坐标值

float x; //边的下端点的x坐标

float deltax; //边的斜率的倒数

ET *nextEdge; //下一条边的指针

}edga[N]; //每条扫描线对应一条链表

6f20f67170a500d90174f59a22ef9162.png

其中edga[0],edga[2],edga[3],edga[6],edga[8]因为没有与边的下端点相交,所以为空

数据结构对应相关方法:

deltax:用于递推计算交点$x’=x+\frac{1}{m} $

ymax: 当扫描线 y = e + 1 == ymax,说明下 一条扫描线与此边不相交。

二、活性边表\(AEL\)(Active Edge List)

结构定义与\(ET\)表是一样的

x的含义不一样:当前扫描线与边的交点的\(x\)坐标

作用:存储与当前扫描线的交点,同时快速计算下一条扫描线与多边形相交的点,且可判断边是否与下一条扫描线相交

实例

5d7e8064206ef757ffcb3cea64d6b4b8.png

在\(Y=7\)的时候\(ET\)表不为空,所以就将\(ET\)表中的边插入到\(AEL\)表中

算法过程

先建立\(ET\)表,扫描线从下往上扫,即设置一个指针\(p\),从\(y_{min}\)开始

如果此时的\(ET\)表不为空,就将表中元素取出插入到\(AEL\)中,插入排序

\(AEL\)表中的元素两两配对,获得填充区段,再填充

p++

将\(AEL\)中满足\(y = y_{max}\)边删去 因为每条边被看作下闭上开的

对\(AEL\)中剩下的每一条边的\(x\)递增\(deltax\),即\(x = x+deltax\)

直到\(ET\)表和\(AEL\)表都为空,算法结束

原文:https://www.cnblogs.com/smallocean/p/12449768.html

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值