CGA裁剪算法之Sutherland-Hodgman多边形裁剪算法

CGA裁剪算法之Sutherland-Hodgman多边形裁剪算法

  Sutherland-Hodgman算法也叫逐边裁剪法,该算法是萨瑟兰德(I.E.Sutherland)和霍德曼(Hodgman)在1974年提出的。

  这种算法采用了分割处理、逐边裁剪的方法。这一算法,适合任何凸多边形窗口对任何“凸或者凹,或者平面或者非平面”多边形的裁剪处理。

  逐边逐次裁剪特点:逐边是分别用裁剪平面的边界来处理,且裁剪各个边界的处理顺序无关紧要。逐次是每次的裁剪边界对多边形的每条边处理是依次进行的,有顺序要求。

1. 基本思想

  “逐边裁剪”,即依次用裁剪窗口的一条边裁剪多边形所有的边。

  裁剪边与多边形每条边裁剪,只需要处理“单个裁剪边”与“单个多边形边”的位置关系。多边形顶点列表中,相邻两个端点组成多边形的边,SP作为前后相邻的端点(P第一点除外),则SP与裁剪边的位置关系如下图所示,只有4中可能。

  

  每条裁剪边对多边形的所有边处理后,想输出顶点列表输出1个,或者2个,或者0个(不输出)顶点。

  【1】如果边完全可见,则输出P点,注意,因为是“逐次”处理多边形的顶点,所以S点作为前一个点的终点已经摆输出;

  【2】如果完全不可见,则不输出,0个;

  【3】如果部分可见,分两种情况,如果是离开的情况,则需要输出将交点I作为输出点输出,此时输出1个,其次如果是进入的情况,则需要将交点I以及终点P依次输出,此时输出 2个。

2. 算法的关键问题处理

(1) 处理多边形的特殊点:

  【1】多边形的第一个点P1,需要根据它的可见性判定是否输出到输出顶点表,如果可见则输出,并作为起点S。如果不可见,则不输出,但是任然作为S保存,处理后续的第二个点;

  【2】处理多边形左后一条边:PnP1,需要分开处理,为了不消除P1的特殊性,可以把P1保存为F(first),这样当处理最后一条边是,即为PnF,可以与其他边一样进行同样处理。

(2)判定顶点与当前裁剪边的可见性

  向量叉积法判定。
   
为简单计,测试点表示为P点。假设窗口边界方向为顺时针,如图中所示,对于其中任一边界向量,从向量起点A向终点B看过去:

  【1】如果被测试点P在该边界线右边(即内侧),AB×AP的方向与X-Y平面垂直并指向屏幕里面,即右手坐标系中Z轴的负方向,叉乘结果<0。     
      【2】反过来,如果P在该边界线的左边(即外侧)内或者边界上,这时AB×AP的方向与X-Y平面垂直并指向屏幕外面,即右手坐标系中Z轴的正方向,叉乘结果>=0

  AB×AP叉乘,右手坐标,中四指头由AB到AP的方向,顺着AB方向,此时大拇指Z正向(朝向你)为结果正, 大拇指Z负半轴(背向你)为负。

  如下图,边界AB是顺时针的,所以右手定则时,说些别扭咯。

  
      设:点P(x,y)、点A(xA,yA)、点B(xB,yB),
      向量AB={(xB-xA),(yB-yA)},
      向量AP={(x-xA),(y-yA)},          
      那么AB×AP的方向可由下式的符号来确定:            
      V=(xB-xA)·(y-yA)-(x-xA)·(yB-yA)          
      因此,当V>=0时,P在边界线内侧, 可见。 而V<0时,P在边界线外侧。

(3)相交线段的求交处理

  方法有三种【1】区域编码,处理,【2】中点分割, 【3】参数方程。

  因为在已确定两线段为相交情况,则采用参数方程法最合适。

  如: 线段P1P2, P3P4, 他们的参数方程如下,

  P(s) = P1 + s*(P2 - P1)   0<= s <=1

  P(t) = P3 + t*(P4 - P3)    0<= t <=1

  则交点P(s) = P(t) ,因为P(s),P(t)都是矢量函数,即,P(s)= [X(s),  Y(s)]   P(t) = [X(t),  Y(t)] 则两个未知量两个方程,可以求解出结果。

  【1】如果方程无解,则两线段平行;【2】如果s或者t超出了范围,则两线段不想交且不平行;【3】没有超出范围,则有效交点。

  用助阵形式求解方程组最合适。

  如:

  =,令M=,其行列式=3×1-3×(-2)=9≠0,

  ∴M-1=.

  ∴=M-1==,

  即方程组的解为

  (3)Sutherland_dodman算法,产生一个退化的边界。即裁剪结果,多边形的一部分与窗口边界成和,蜕变边界往返连词,将裁剪结果中多边形中两个彼此相连的部分连在一起。在许多应用中,如“实区域填充”扫描转换,则退化的边界没有影响;但是,对于另一些应用,如“隐藏面消除算法”则需要事先删除这些退化的边界。

  可以采用SutherLand-hodMan提出的“顶点排序的办法”处理问题。

 3. 程序如下

一个问题

时间: 2024-10-26 04:49:33

CGA裁剪算法之Sutherland-Hodgman多边形裁剪算法的相关文章

算法导论——lec 13 贪心算法与图上算法

之前我们介绍了用动态规划的方法来解决一些最优化的问题.但对于有些最优化问题来说,用动态规划就是"高射炮打蚊子",采用一些更加简单有效的方法就可以解决.贪心算法就是其中之一.贪心算法是使所做的选择看起来是当前最佳的,期望通过所做的局部最优选择来产生一个全局最优解. 一. 活动选择问题 [问题]对几个互相竞争的活动进行调度:活动集合S = {a1, a2, ..., an},它们都要求以独占的方式使用某一公共资源(如教室),每个活动ai有一个开始时间si和结束时间fi ,且0 ≤ si &

基本算法研究1-冒泡排序算法测试

基本算法研究1-冒泡排序算法测试 1.经典冒泡排序法基本原理 先看一个动态图,感觉比较形象: 冒泡排序(Bubble Sort)是一种简单的排序算法.默认是从小到大排序,即把最大的数据排在最后,相当于每次把最大数据像气泡一样浮到水面一样.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换. 基本步骤: 1.比较相邻的元素.如果第一个比第二个大,就交换他们两个.        2.对每一对相邻元素作同样的工作,从开始第一对

【机器学习算法-python实现】采样算法的简单实现

1.背景 采样算法是机器学习中比较常用,也比较容易实现的(出去分层采样).常用的采样算法有以下几种(来自百度知道): 一.单纯随机抽样(simple random sampling) 将调查总体全部观察单位编号,再用抽签法或随机数字表随机抽取部分观察单位组成样本. 优点:操作简单,均数.率及相应的标准误计算简单. 缺点:总体较大时,难以一一编号. 二.系统抽样(systematic sampling) 又称机械抽样.等距抽样,即先将总体的观察单位按某一顺序号分成n个部分,再从第一部分随机抽取第k

【JavaScript】【算法】JavaScript版排序算法

JavaScript版排序算法:冒泡排序.快速排序.插入排序.希尔排序(小数据时,希尔排序会比快排快哦) 1 //排序算法 2 window.onload = function(){ 3 var array = [0,1,2,44,4, 4 324,5,65,6,6, 5 34,4,5,6,2, 6 43,5,6,62,43, 7 5,1,4,51,56, 8 76,7,7,2,1, 9 45,4,6,7,8]; 10 //var array = [4,2,5,1,0,3]; 11 array

图灵算法群《啊哈算法》领读

--图灵算法群阅读计划(第一期) 领读人:Zoctopus·Lian 本书特色 一本充满智慧和趣味的算法入门书.没有枯燥的描述,没有难懂的公式,一切以实际应用为出发点. 书中涉及到的数据结构有栈.队列.链表.树.并查集.堆和图等:涉及到的算法有排序.枚举.深度和广度优先搜索.图的遍历,当然还有图论中不可以缺少的四种最短路径算法.两种最小生成树算法.割点与割边算法.二分图的最大匹配算法等. 书中通过幽默的语言配以可爱的插图来讲解算法,使用C语言实现. 适合读者 适合算法零基础入门和喜爱编程的朋友(

《算法之道》精华 算法设计部分

<算法之道>精华 算法设计部分 本书作者邹恒明,作者另有一本书<数据结构之弦>,以及<操作系统之哲学原理>都是非常好的书 这本书能够算得上是深入浅出.文笔非常好,作者加入了非常多自己的思考 本文仅包含算法设计部分,算法分析略去,并没有严格依照章节顺序来记录 附录 算法随想 有人喜欢遍历,希望踏遍千山万水,人生丰富多彩:有人一生贪婪,眼界不宽,及时行乐:有人注定穷搜,辛辛苦苦,收获有限:有人善用时空均衡,用最少的时间办最多的事情.十分精明:有人会分治,再难的问题也能解决.

图的生成树(森林)(克鲁斯卡尔Kruskal算法和普里姆Prim算法)、以及并查集的使用

图的连通性问题:无向图的连通分量和生成树,所有顶点均由边连接在一起,但不存在回路的图. 设图 G=(V, E) 是个连通图,当从图任一顶点出发遍历图G 时,将边集 E(G) 分成两个集合 T(G) 和 B(G).其中 T(G)是遍历图时所经过的边的集合,B(G) 是遍历图时未经过的边的集合.显然,G1(V, T) 是图 G 的极小连通子图,即子图G1 是连通图 G 的生成树. 深度优先生成森林   右边的是深度优先生成森林: 连通图的生成树不一定是唯一的,不同的遍历图的方法得到不同的生成树;从不

【数据分析/挖掘底层算法】原创实现二项分布算法以及应用

7.2 二项分布算法 作者 白宁超 2015年8月15日22:51:38 摘要:本文继统计学几何分布.二项分布.泊松分布研究的深入,基于各种分布基础概念和核心知识介绍之后.就各种分布的实现和真实环境下应用方是目的.在进行一系列相互独立实验,每次既有成功,又有失败的可能,且单次实验成功概率相等.在一系列试验中求成功的次数.这种情况下适用于本算法.本算法中在n次伯努利试验中:试验n次得到r次成功的概率.二项分布的期望.二项分布方差的具体实现. 目录 统计学之离散概率分布的运用 统计学之几何分布.二项

CBA算法---基于关联规则进行分类的算法

更多数据挖掘算法:https://github.com/linyiqun/DataMiningAlgorithm 介绍 CBA算法全称是Classification base of Association,就是基于关联规则进行分类的算法,说到关联规则,我们就会想到Apriori和FP-Tree算法都是关联规则挖掘算法,而CBA算法正是利用了Apriori挖掘出的关联规则,然后做分类判断,所以在某种程度上说,CBA算法也可以说是一种集成挖掘算法. 算法原理 CBA算法作为分类算法,他的分类情况也就