[计算机图形学]多边形扫描转换算法

多边形的表示

  • 顶点表示。只要得到顶点再连线即可。如果是凸多边形由点集极角排序即可,其他情况不太了解
  • 点阵表示。需要判断哪些属于内部点

本文主要讨论点阵表示

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

1.逐点判断法

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

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

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

  • 特殊情况:

    • 该点在边上,要先特判该点是不是边上一点
    • 射线在边上,会有无数个点,要特断射线是否与边同线
    • 交点为顶点,如果异测是1个,同侧算0个或2个

判断点的实现代码(ACM):https://www.cnblogs.com/muyefeiwu/p/11260366.html

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

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

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之间的线段

交点计算

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

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

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

  • 水平边不参与计算交点

算法数据结构

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

  • 按照边的下端点,对非水平边进行分类的链表
  • 下端点\(y\)坐标值等于\(i\)的边属于第i类,同类中有多条边时按\(x\)从小到大排序(\(x\)也一样时按边上端点的\(x\)值)
struct ET{
    int ymax;     //边的上端点的y坐标值
    float x;      //边的下端点的x坐标
    float deltax; //边的斜率的倒数
    ET *nextEdge; //下一条边的指针
}edga[N];		  //每条扫描线对应一条链表

其中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\)坐标

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

  • 实例

\(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\)表都为空,算法结束
全部评论

相关推荐

不愿透露姓名的神秘牛友
05-29 22:21
Offer1:小马智行,深圳,测试开发工程师,17.0k*16.0,Offer2:追觅科技,深圳,嵌入式工程师,18.0k*15.0,
嵌软狗都不学:各位base深圳的同事,作为也是并肩作战的一员,今天想站在管理视角,和大家开诚布公地聊一聊:从近几个月的上下班数据对比看来,我们发现一个明显的差异:深圳同事的在岗时间普遍比苏州同事短。很多深圳同事早上9点之后才到公司,晚上不到 20 点就下班了;而总部那边,20点半甚至 22 点后还有不少同事在办公室忙碌,特别是研发团队,加班更是常态。相信去过苏州的同事,对这种场景都不陌生。我很好奇,这是因为苏州工作任务太重还是咱们深圳同事效率真的高到能在更短时间内完成工作?MOVA在深圳成立分公司是为了吸引更优秀的人才贡献更多更高质的价值,公司管理层给我反馈的是深圳招到的多是行业的专家大拿,大部分都是薪资比苏州高的,而且我们办公的租金等也远高于苏州的..MOVA虽脱胎于强壮的集团母体不久,各业务板块尚未实现全面盈利,虽说公司管理层目光长远,不纠结当下的人才投入,但行业内的普遍标准是,员工创造的价值要达到公司雇佣成本的 15 倍以上。大家不妨自我审视一下,自己是否达到了这个标准?如果是抱着划水、按时打卡走人拿毛爷爷的心态那不适合来MOVA,那样过下去不但自己过得尴尬也会影响MOVA这个大船的攻城略地的速度.我并非鼓励大家盲目加班,而是倡导高效工作,拒绝无效忙碌,不要让项目进度因低效受影响,也别把精力浪费在和苏州同事拼打卡时长上,提倡更高的人效比;考虑到两地地域和交通差异,相信大家会找最适合自己发挥的工作方式(比如按时下班后1小时到家晚饭后继续未竟工作等..)大家在遵守公司规章的情况下尽情地体现自己的能力价值,为MOV!和深圳公司争光我们在这边才能更安心更有信心的工作下去;请客BU长、名部门长、项目管理和各业务单元负责人,全面梳理团队情况,及时评估成员工作负荷与成果质量,坚决清退划水害虫痕疫,践行公司价值观,相互监督,防止管理漏洞及渎职。感谢人家的理解,也请人家多担待我的直言不讳……
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
04-25 10:45
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务