计算机图形学课程设计 多边形的裁剪算法
一个任意多边形的裁剪算法

A
2
B
C
1 b
4 c
D
2 内裁剪的裁剪结果:
2、外裁剪:从被裁剪多边形的一个“出”点 开始,碰到“出”点,沿着被裁剪多边形按顺时针 方向搜集顶点序列;而当遇到“入”点时,则沿着 裁剪窗口按逆时针方向搜集顶点序列。
a
A
2 1 b
3
B
C
4 c
D
外裁剪的裁剪结果:
3、并集,从被裁剪多边形的一个顶点开始, 碰到“入”点,沿着裁剪窗口按顺时针方向搜集 顶点序列;而当遇到“出”点时,则沿着被裁剪 多边形按顺时针时针方向搜集顶点序列。
三、算法流程图
以内裁剪为例
将交点分别和被裁剪多边形及 裁剪窗口顶点放入数组3、4中 数组3中有入点 将入点录入到数组Q中 沿数组3取顶点 顶点是出点 沿数组4取顶点 顶点是入点 顶点录入 到Q中 结束
顶点=起始点
输出数组Q
四、 算法的实现及原理
1、界面
由MFC建立一个空文档,然后对界面进行手动操作, 代码由微软MFC提供自动生成,添加一些windows消息 响应函数,生成的主界面如下图:
a A 2 3 B
CHale Waihona Puke 1 b4 cD
并集裁剪结果:
五、难点:
算法在实现中,需要用到六个数组, 分别用来存放:被裁剪多边形,裁剪窗口, 交点数组,插入交点后的被裁剪多边形, 插入交点后的裁剪窗口,输出多边形。 算法的主要难点在入、出点的查寻以 及跨数组搜索上。
总结
通过大学四年的学习,我们学了很多技术方 面的理论知识,但动手能力不强,在多边形裁 剪中,有效地结合了之前所学的科目,如VC++ 编程语言,图形学,数据结构,MFC等。 通过本论文的锻炼,让我第一次在VC的环 境下使用C++实现规模较大,功能较复杂的代码 设计,使我对C++近一步的体会和理解。论文整 体基本功能已经做出,但有些功能模块由于时 间关系没能实现,没有达到预先设想的需求。 还需要我在今后的学习中,不断地研究和完善。
计算机图形学二维图形的裁剪

垂直并指向屏幕里面,即右手坐标系中Z轴的负方向。 反过来,如果P在该边界线的左边(即外侧),这时AB×AP的方向与X-
Y平面垂直并指向屏幕外面,即右手坐标系中Z轴的正方向。 设:点P(x,y)、点A(xA,yA)、点B(xB,yB), 向量AB={(xB-xA),(yB-yA)}, 向量AP={(x-xA),(y-yA)}, 那么AB×AP的方向可由下式的符号来确定:
依次下去,相对于第三条、第四条边界线进行裁剪,最后输出的多边 形顶点序列即为所求的裁剪好了的多边形。如下图所示。
7.3.1 Sutherland-Hodgeman多边形裁剪
新的多边形顶点序列产生规则: 在用窗口一条边界及其延长线裁剪一个多边形时,该边界线把平面分
成两个部分:一部分称为边界内侧;另一部分称为边界外侧。 如下图所示,依序考虑多边形的各条边。假设当前处理的多边形的边为
V=(xB-xA)·(y-yA)-(x-xA)·(yB-yA)
(3-14)
因此,当V≤0时,P在边界线内侧; 而V>0时,P在边界线外侧。
练习
Sutherland-Hodgeman多边形裁剪中,常用向量叉积法来测试当前点P是 否在边界内侧。已知窗口边界A(30,100)、B(40,180),某点P(50, 300),请 问点P在边界内侧吗?
7.3 多边形的裁剪
多边形裁剪的常用算法 1.Sutherland-Hodgeman多边形裁剪 2.Weiler-Atherton任意多边形裁剪
7.3.1 Sutherland-Hodgeman多边形裁剪
Sutherland-Hodgman算法也叫逐边裁剪法,该算法是萨瑟兰德 (I.E.Sutherland)和霍德曼(Hodgman)在1974年提出的。这种算法采用了 分割处理、逐边裁剪的方法。 一、Sutherland-Hodgeman多边形裁剪算法思想:
4.6.3 多边形裁剪_计算机图形学教程(第2版)_[共3页]
![4.6.3 多边形裁剪_计算机图形学教程(第2版)_[共3页]](https://img.taocdn.com/s3/m/a0cbdc0749649b6649d74720.png)
153 作为新的P 1P 2线段从算法的第一步重新开始执行。
反之,则以线段P m P 2为新的线段P 1P 2(如图4.83中的线段c )从算法的第一步重新开始执行。
反复执行上述3步,直至找到离P 1点最远的可见点为止。
这个过程确定了距离P 1点最远的可见点。
然后对调该线段的两个端点,以线段P 2P 1为新的P 1P 2线段,重新开始实施该算法过程,就可以确定出距离P 2点最远的可见点。
这样,位于窗口内可见段的两个可见端点就确定了。
从这个算法我们可以看到,整个裁剪过程总是在执行第一步或第二步时结束。
这种结果表明:被裁剪的线段要么完全处于窗口之外而被排除掉;要么能在窗口内得到一个距对应端点最远的可见点,这个可见点可能是原直线段的一个端点,也可能是线段在被不断地中点再分过程中,最终得到的刚好和窗口边框相重的那个中点。
这里要注意的是:在判断中点和窗口边框相重时,一般不需要坐标值一定相等,也不大可能,只要在精度许可的前提下,给出一个误差允许范围即可。
4.6.3 多边形裁剪前面我们讨论了直线段裁剪,多边形裁剪是以直线段裁剪为基础,但又不同于直线段的裁剪。
多边形裁剪要比一条直线段裁剪复杂得多。
图4.84所示为用一个矩形窗口去裁剪多边形将会遇到各种不同情况,其中图4.84(a )所示为一个完整的多边形被裁剪成两个独立的多边形;图4.84(b )所示为一个凹多边形被裁剪成几个小多边形;图4.84(c )所示为多边形G 经矩形窗口裁剪后出现G 1和G 2两个多边形,究竟是G 1还是G 2呢?裁剪多边形要解决两个问题,一是一个完整的封闭多边形经裁剪后一般不再是封闭的,需要用窗口边界适当部分来封闭它;二是矩形窗口的4个角点在裁剪中是否要与其他交点连线。
由于这两个问题使得我们不能简单地应用直线段裁剪方法,而需要去研究适合多边形裁剪特点的算法。
图4.84 多边形裁剪多边形裁剪方法很多,例如逐边裁剪法、双边裁剪法、分区编码裁剪法等,这里仅介绍逐边裁剪法。
计算机图形学课程设计-Weiler-Atherton多边形裁剪

V[numVertex].y = inY;
idNo = numVertex;
numVertex++;
}
else
idNo = -1;
return idNo;
}
void readPolygon (GenPolygon p)
{ cin >> p.exterior.nVertex;
SEARCH (SubjectPolygon,nextInter,ptr1);
AddToOutputList (ptr1->. . .)
StartPoint = ptr1->. . .
ptr1 = prt1->next;
while (ptr1->. . . != StartPoint)
{ AddToOutputList (ptr1->. . .);
Weiler-Atherton算法适合与任意多边形。裁剪窗口和被裁剪多边形处于完全对等的地位,这里我们称:
1、被裁剪多边形为主多边形,记为A;
2、裁剪窗口为裁剪多边形,记为B。
主多边形A和裁剪多边形B的边界将整个二维平面分成了四个区域:
1、A∩B(交:属于A且属于B);
2、A-B(差:属于A不属于B);
3、B-A(差:属于B不属于A);
4、A∪B(并:属于A或属于B,取反;即:不属于A且不属于B)。
内裁剪即通常意义上的裁剪,取图元位于窗口之内的部分,结果为A∩B。
外裁剪取图元位于窗口之外的部分,结果为A-B。
观察右图不难发现裁剪结果区域的边界由被裁剪多边形的部分边界和裁剪窗口的部分边界两部分构成,并且在交点处边界发生交替,即由被裁剪多边形的边界转至裁剪窗口的边界,或者反之。由于多边形构成一个封闭的区域,所以,如果被裁剪多边形和裁剪窗口有交点,则交点成对出现。这些交点分成两类:
weiler-atherton多边形裁剪算法

weiler-atherton多边形裁剪算法weileratherton多边形裁剪算法,又称为weiler-atherton算法,是一种用于对多边形进行裁剪的算法。
它可以被用于计算机图形学中的裁剪任务,如可视化、图像处理和计算机辅助设计等领域。
本文将详细介绍weileratherton多边形裁剪算法的原理、步骤和实现方法。
1. 算法原理:weileratherton多边形裁剪算法是基于边界点的引入和处理的。
该算法将两个多边形相互之间进行裁剪,并生成裁剪结果。
算法使用四个边界点集合,分别为输入多边形的边界点集合(输入多边形顶点经过一系列处理得到),裁剪多边形的外部边界点集合和内部边界点集合,以及裁剪结果的边界点集合。
2. 算法步骤:weileratherton多边形裁剪算法的具体步骤如下:(1) 初始化:创建输入多边形的边界点集合、裁剪多边形的外部边界点集合和内部边界点集合,并将输入多边形的边界点添加至外部边界点集合中。
(2) 遍历输入多边形的每条边:对于输入多边形的每条边,判断其与裁剪多边形的相交情况。
(3) 相交情况处理:若相交情况为内部相交或外部相交,则根据交点生成新的内部边界点,并添加至相应的边界点集合中。
(4) 构造裁剪结果:根据输入多边形的边界点集合和裁剪多边形的内部边界点集合,生成裁剪结果的边界点集合。
(5) 根据边界点集合构造裁剪结果:根据裁剪结果的边界点集合,绘制裁剪结果多边形。
3. 算法实现:weileratherton多边形裁剪算法的实现可以使用编程语言来完成。
一种常用的实现方法是通过遍历输入多边形的每个边,利用线段与裁剪多边形的边界的相交情况判断是否产生交点,并根据交点生成新的边界点。
具体的实现步骤如下:(1) 初始化输入和裁剪多边形的边界点集合。
(2) 遍历输入多边形的每条边,对于每条边,判断其与裁剪多边形的每条边的相交情况。
(3) 根据相交情况,判断是否生成交点,如果有生成交点,则根据交点生成新的边界点,并添加至相应的边界点集合中。
计算机图形学(简单多边形裁剪算法)

简单多边形裁剪算法摘要:多边形裁剪算法与线性裁剪算法具有更广泛的实用意义,因此它是目前裁剪研究的主要课题。
本文主要介绍了一种基于多边形顶点遍历的简单多边形裁剪算法,它有效降低了任意多边形裁剪复杂度。
通过记录交点及其前驱、后继信息,生成结果多边形,该算法简化了交点的数据结构,节省了存储空间,降低了算法的时间复杂度,具有简单、易于编程实现、运行效率高的特点。
关键词:多边形裁剪;交点;前驱;后继;矢量数组一、技术主题的基本原理简单多边形裁剪算法综合考虑现有多边形裁剪算法的优缺点,它是一种基于多边形顶点遍历来实现简单多边形裁剪工作的。
其主要的原理是遍历多边形并把多边形分解为边界的线段逐段进行裁剪,输出结果多边形。
二、发展研究现状近年来,随着遥感绘图、CAD辅助设计、图象识别处理技术的发展,图形裁剪算法从最初在二维平面上线和图形的裁剪扩展到三维空间里体和场的裁剪,国内外相继提出不少行之有效的算法,但越来越复杂的图形和计算也对算法的速度和适用性提出了越来越高的要求。
因此,不断简化算法的实现过程,完善细节处理,满足大量任意多边形的裁剪也就成了当今算法研究的焦点之一。
以往多边形裁剪算法不是要求剪裁多边形是矩形,就是必须判断多边形顶点的顺时针和逆时针性,即存在不实用或者是增加了多边形裁剪算法的难度。
为了解决现在的问题,我们研究现在的新多边形算法,其中,裁剪多边形和被裁剪多边形都可以是一般多边形,且不需要规定多边形输入方向。
它采用矢量数组结构,只需遍历剪裁多边形和被裁剪多边形顶点即完成多边形的裁剪,具有算法简单、运行效率高的特点。
三、新算法设计1、算法的思想本算法是为了尽量降低任意多边形裁剪算法复杂度而提出的,其主要思想是采用矢量数组结构来遍历裁剪多边形和被裁多边形顶点,记录裁剪多边形和被裁减多边形交点及其前驱、后继信息,并通过记录相邻交点的线段,然后通过射线法选择满足条件的线段,之后进行线段连接,输出对应的裁剪结果。
计算机图形学 5.5裁剪算法PPT课件

例题:
P’’’1
P1’
P1
P1’’
P2
(1) 求左边交点,得P’1P2;
P’1:(-1,1/2); 编码(0000)
判别知非完全可见,且P’1在窗口内,
因此交换P’1P2得新线段P1P2;
P1:(1/2, 3/2);编码 (1000)
P2:(-1, 1/2); 编码 (0000)
P1:(-3/2, 1/6);编码 (0001) P2:(1/2, 3/2);编码 (1000)
线段完全可见,程序结束可编辑 Nhomakorabea件多边形的裁剪
可编辑课件
(2) 求右边交点,得 P’’1(1, 11/6) P2(-1, 1/2); 并编码, 判别之不可见
x=x1+(y-y1)*(x2-x1)/(y2-y1) y=y1+(x-x1)*(y2-y1)/(x2-x1)
(3) 求上边交点,得 P’’’1(-1/4, 1) P2(-1, 1/2); 并编码,
两端点编码全部为0,
如何求窗口边界与线段P1P2的交点?
如何判定线段应该与窗口的哪条边求交呢?
编码中对应位为1的窗口边。
计算线段P1(x1,y1)P2(x2,y2)与窗口边界的交点 Code代表线段某个端点的编码。 if(LEFT&code !=0)
{ x=XL; y=y1+(y2-y1)*(XL-x1)/(x2-x1);} else if(RIGHT&code !=0) { x=XR; y=y1+(y2-y1)*(XR-x1)/(x2-x1);} else if(BOTTOM&code !=0) { y=YB; x=x1+(x2-x1)*(YB-y1)/(y2-y1);} else if(TOP & code !=0) { y=YT; x=x1+(x2-x1)*(YT-y1)/(y2-y1);}
计算机图形学多边形裁剪

}
}
s=p;
}
}
bool CPaintView::inside(CPoint testvertex,CPoint* clipboundary)
{
if(clipboundary[1].x<clipboundary[0].x)
{
p=invertexlist[j];//p为当前要处理的顶点,前面已处理过的顶点为s
if(inside(p,clipboundary))//若p在裁剪边clipboundary的内侧,则inside()返回值为真
{ if(inside(s,clipboundary))//如果s在裁剪边clipboundary的内侧,则inside()返回值为真
if(testvertex.y >=clipboundary[0].y)
return true;
if(clipboundary[1].x>clipboundary[0].x)
if(testvertex.y<=clipboundary[0].y)
return true;
outvertexlist.insert(outvertexlist.begin( )+(*outlength),outvertex);
(*outlength)++;
}
void CPaintView::intersect(CPoint p1,CPoint p2,CPoint *clipboundary,CPoint *intersectpt)
{
if(clipboundary[0].y==clipboundary[1].y)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
河南理工大学万方科技学院课程设计报告2010 — 2011学年第二学期课程名称计算机图形学设计题目多边形裁剪算法学生姓名孙晓芳学号**********专业班级计算机科学与技术10升指导教师侯守明2011 年6 月29 日目录目录目录 (I)第1章程序运行环境................................................................................... 错误!未定义书签。
1.1 程序运行环境的简单介绍................................................................. 错误!未定义书签。
1.2 程序运行环境的安装......................................................................... 错误!未定义书签。
1.3 多边形裁剪算法设计的内容........................................................................... 第2章直线裁剪和多边形裁剪的简单比较 (4)2.1 直线裁剪的介绍 (4)2.1.1 直线裁剪的基本原理………………………………………......................................2.1.2 直线裁剪算法的分类以及和窗口交点参数值的计算……………………………..2.2 多边形裁剪介绍 (9)2.2.1 多边形裁剪的基本思想……………………………………………………………..2.2.2 多边形和窗口相交的判定方法…………………………………………..第3章多边形裁剪方法的详细介绍 (12)3.1 Sutherland-Hodgman算法………………………………………………………………….3.2 多边形裁剪算法的流程图 (12)3.3多边形裁剪算法的实现 (13)第4章代码的实现 (14)第5章总结 (21)参考文献 (22)第1章程序的运行环境1.1 程序运行环境的简单介绍本次设计主要是运用了程序设计语言主要以C/C++语言为主,开发平台为Visual C++。
现在Windows系统的主流编译环境有Visual C++,C++ Builder,Dev-C++等,它们都是支持OpenGL的。
但这次设计主要选择Visual C++ 作为学习OpenGL的实验环境。
Microsoft Visual C++,(简称Visual C++、MSVC、VC++或VC)微软公司的C++开发工具,具有集成开发环境,可提供编辑C语言,C++以及C++/CLI等编程语言。
Microsoft Visual C++是Microsoft公司推出的开发Win32环境程序,面向对象的可视化集成编程系统。
它不但具有程序框架自动生成、灵活方便的类管理、代码编写和界面设计集成交互操作、可开发多种程序等优点,而且通过简单的设置就可使其生成的程序框架支持数据库接口、OLE2,WinSock网络、3D控制界面。
OpenGL作为盖茨设计的主要软件它与其他软件相比主要有以下几个优点1)与C语言紧密结合:2)强大的可移植性:3、高性能的图形渲染:1.2 程序安装及步骤1.选择一个编译环境这里我们选择Visual C++ 作为学习OpenGL的实验环境2.安装GLUT工具包GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装。
Windows 环境下的GLUT下载地址:(大小约为150k)/resources/libraries/glut/glutdlls37beta.zipWindows环境下安装GLUT的步骤:1)将下载的压缩包解开,将得到5个文件2)glut.h放到GL文件夹(VC6中一般是:C:\Program Files\Microsoft Visual Studio\VC98\Include\GL,VC2005中是:C:\Program Files\Microsoft Visual Studio 8\VC\Include,新建GL文件夹,再将glut.h放到GL文件夹中)。
3)glut.lib和glut32.lib放到静态函数库所在文件夹(VC6中一般是:C:\Program Files\Microsoft Visual Studio\VC98\Lib, VC2005中是:C:\Program Files\Microsoft Visual Studio 8\VC\Lib)。
4)把解压得到的glut.dll和glut32.dll放到操作系统目录下面的system32文件夹内。
(其路径为:C:\Windows\System32)3.建立一个OpenGL工程这里以VC为例:首先从开始->所有程序->Microsoft Visual C++ 6.0菜单中打开VC,也可单击文件:C:\Program Files\Microsoft Visual Studio\Visual C++6\Common\MSDev98\Bin\msdev.exe打开VC,在VC中选择File->New->Project,然后选择Win32 Console Application,输入一个工程名,设为A,然后按OK。
在谈出的对话框左边点Application Settings,找到A Simple application并勾上,选择Finish。
然后打开工程代码文件:A.cpp,将其内容替换为实验示范代码.点击运行按钮就可以执行调试程序了。
1.3 多边形裁剪算法设计的内容和要求这次设计的主要内容;1)理解多边形裁剪与直线段裁剪的区别;2)掌握多边形的裁剪过程;3)理解并掌握Sutherland-Hodgman算法的裁剪思想。
第2章直线裁剪和多边形裁剪的比较2.1 直线裁剪的介绍2.1.1直线裁剪的基本原理图1所示的为直线与窗口边界之间可能出现的几种关系。
可以通过检查直线的两个端点是否在窗口之内确定如何对此直线裁剪。
如果一直线的两个端点均在窗口边界之内(如图1中P5到P6的直线),则此直线应保留。
如果一条直线的一个端点在窗口外(如P9)另一个点在窗口内(如P10),则应从直线与边界的交点(P9)处裁剪掉边界之外的线段。
如果直线的两个端点均在边界外,则可分为两种情况:一种情况是该直线全部在窗口之外;另一种情况是直线穿过两个窗口边界。
图中从P3到P4的直线属于前一种情况,应全部裁剪掉;从P7到P8的直线属于后一种情况,应保留P7到P8的线段,其余部分均裁剪掉。
图1直线相对干窗口边界的栽剪直线裁剪算法应首先确定哪些直线全部保留或全部裁剪,剩下的即为部分裁剪的直线。
对于部分裁剪的直线则首先要求出这些直线与窗口边界的交点,把从交点开始在边界外的部分裁剪掉。
一个复杂的画面中可能包含有几千条直线,为了提高算法效率,加快裁剪速度,应当采用计算量较小的算法求直线与窗口边界的交点。
2.1.2直线裁剪算法的分类以及和窗口交点参数值的计算直线段裁剪算法是复杂图形裁剪的基础。
复杂的曲线可以通过折线段来近似,从而裁剪问题也可以化为直线段的裁剪问题。
主要的四种算法直接求交算法Cohen-Sutherland算法中点算法梁友栋-barskey算法Cohen-Sutherland算法的大意是:对于每条线段P1P2,分为3种情况处理。
①若P1P2完全在窗口内,则显示该线段P1P2,简称“取”之。
②若P1P2明显在窗口外,则丢弃该线段,简称“弃”之。
③若线段既不满足“取”的条件,也不满足“弃”的条件,则把线段分为两段。
其中一段完全在窗口外,可弃之。
然后对另一段重复上述处理。
1.区域码及其建立Cohen-Sutherland直线裁剪算法的核心是把所有直线的端点均分配一个表示其相对位置的4位二进制代码。
此代码称为区域码。
区域码按照端点与窗口边界的相对位置编码,即区域码的4位分别代表端点位于窗口的上、下、左、右。
区域码从右到左的各位所代表的坐标区如下所示:位 4 3 2 1坐标区上下右左上述各位中某位为1,则表示点位于此坐标区。
窗口周围各坐标区的区域码如图2所示。
由图2可见,位于窗中内的点,其区域码应为0000,位于窗口左下方的点,其区域码应为0101,其余类推。
区域码各位的值可以通过对端点坐标(x,y)与窗口边界的比较求得。
如果x<x wmin,则区域码的第一位为1,其余各位的确定与此相似。
现在的计算机语言都可以进行位操作,因此,可以通过以下步骤建立区域码:①计算出端点坐标与窗口边界的差。
②按计算出的各个差的符号把区域码的相应位置为0或1,即区域码的第一位置为(x-x wmin)的符号位;区域码的第二位置为(x wmin-x)的符号位;区域码的第三位置为(y-y wmin)的符号位;图2 区域码区域码的第四位置为(y wmin -y )的符号位。
2.区域码裁剪算法对所有直线的端点都建立了区域码之后,就可按区域码判断直线在窗口之内或窗口之外。
这可分为如下几种情况:①若一直线的两个端点的区域码均为0000则此直线在窗口边界之内,应子保留。
②若一直线的两个端点的区域码的同一位同时为1,则此直线全部在窗口边界之外,应子裁剪。
例如,若一直线的一个端点的区域码为1001,另一个端点的区域码为0101,则此两端点的区域码的第一位均为1,说明此两端点均在窗口边界之左,因此,直线在窗口边界之外,应予裁剪。
可用将直线两个端点的区域码进行与操作的方法,判断直线是否在窗口之外,若与操作的结果为0000则两端点的区域码任何位均不同时为1,此直线不一定被裁剪。
③以上两种情况之外的直线,有可能穿过窗口,也有可能不穿过窗口,如图87所示。
图中所示的两条直线都不符合情况②的要求,但一条直线(P 1P 2)穿过窗口,另一直线(P 3P 4)不守过窗口。
对这类直线可以进行如下处理:取窗口外的一个端点与窗口边界比较以确定可排除直线的哪一部分,然后,把直线剩下的部分与其他边界比较,这样一直到直线全部被排除或确定直线的哪一部分在窗口之内为止。
可按“左、右、下、上”的次序建立检查直线端点与窗口边界关系的算法。
下面介绍对图3所示的两条直线进行处理的过程。
从直线P 1P 2的下端点P 1开始,依次检查窗口的左、上、右及下边界,可发现此点在窗口之下(因为区域码的第三位为1)。
然后求得直线与下边界的交点P 1排除线段P 1 P 1这样直线就缩短为P 1 P 2。
因为P 2在边界之外,将此端点与各边界比较,可发现此端点在窗口上面。
计算出交点P 2线段P 1P 2保留下来。