精华内容
下载资源
问答
  • MFC框架,实现了绘制直线,填充区域,多边形裁剪功能,全部为C++实现,层次清晰,仅供学习使用~
  • 本资源包含了Cohen-Sutherland算法、Liang-Barsky算法实现直线段裁剪以及自创的多边形裁剪(老师都没查出BUG)的cpp源代码和实验报告。重点是多边形裁剪,400多行代码,最终实现了任意多边形裁剪,下载即可运行
  • 使用C#实现计算机图形学中的多边形裁剪算法,界面友好,功能完善
  • 窗口是固定的,如果需要随意给定的窗口,可以对代码稍作修改,用ButtonDown和ButtonUp实现
  • 计算机图形学多边形裁剪与填充 MFC实现代码,还有其他直线消隐等,需要的留言
  • 提供给要交作业的各位!这是一个关于多边形裁剪的代码,希望能帮到大家!
  • 基于MFC的计算机图形学中点裁剪算法多边形裁剪算法
  • 多边形裁剪 在实际问题中,我们往往需要处理的是用矩形裁剪一个多边形,找到多边形落在屏幕区域内的部分。如下图: 一般有两种算法来处理多边形裁剪问题:Sutherland-Hodgeman算法和Weiler-Atherton算法。 下面...

    多边形裁剪

    在实际问题中,我们往往需要处理的是用矩形裁剪一个多边形,找到多边形落在屏幕区域内的部分。如下图:

    一般有两种算法来处理多边形裁剪问题:Sutherland-Hodgeman算法和Weiler-Atherton算法。

    下面介绍比较高效的Weiler-Atherton算法的主要步骤。

    Weiler-Atherton算法

    假定按顺时针方向处理顶点,且将多边形定义为Ps,窗口矩形为Pw。
    算法从Ps的任一点出发,跟踪检测Ps的每一条边。如下图所示:

    主要步骤:

    (1) 由不可见侧进入可见侧,则输出可见直线段,转(3);
    (2) 由可见侧进入不可见侧,则从当前交点开始,沿窗口边界顺时针检测Pw的边,找到Ps与Pw最靠近
           当前交点的另一交点,输出可见直线段和由当前交点到另一交点之间窗口边界上的线段,然后返回处理的当前交点;
    (3)沿着Ps处理各条边,直到处理完Ps的每一条边,回到起点为止;

    上面的例子,按照算法步骤,输出如下:

    下面的参考链接给出了算法更详细的描述:weiler-atherton-polygon-clipping-algorithm.

    展开全文
  • 基于VC++6.0中MFC的计算机图形学程序,实现了画点画线画多边形多边形裁剪填充消隐,二、三维图形变换(对称,镜像,拉伸,放大缩小,动画等等)
  • //定义两个临时数组,用于每次裁剪后新生成的多边形顶点 UINT m_nA, m_nB; int x, y; long tem1, tem2; int i; //原始多边形顶点个数 //原始多边形顶点数组的第一个顶点和最后一个顶点相同,因此实际顶点个数...

     

    /*
    1、顶点Pi在内侧,前一顶点Pi-1也在内侧,则将Pi纳入新的顶点序列;
    2、顶点Pi在内侧,前一顶点Pi-1在外侧,则先求交点Q,再将Q、Pi依次纳入新的顶点序列;
    3、顶点Pi在外侧,前一顶点Pi-1在内侧,则先求交点Q,再将Q纳入新的顶点序列;
    4、顶点Pi与前一顶点Pi-1均在外侧,则顶点序列中不增加新的顶点。
    */
    
    /*
    函数定义在CPolygon类中;
    数组pt存放原多边形的顶点;
    n为多边形的顶点个数,第一个顶点和最后一个顶点相同,因此实际多边形的顶点个数为n-1。
    */
    void CPolygon::SutherlandHodgman(double wxl, double wyt, double wxr, double wyb)//裁剪边界:左、上、右、下(xmin、ymin、xmax、ymax)
    {
    	CP2 B[100], C[100];   //定义两个临时数组,用于每次裁剪后新生成的多边形顶点
    	UINT m_nA, m_nB;
    	int x, y;
    	long tem1, tem2;
    	int i;
    
    	//原始多边形顶点个数
    	//原始多边形顶点数组的第一个顶点和最后一个顶点相同,因此实际顶点个数为n-1
    	m_nA = n-1;    
    	m_nB = 0;      //新生成多边形顶点个数
    	
    	//左边界---------------------------------------------
    	for (i = 0; i < m_nA; i++) {
    		if (pt[i].x < wxl&&pt[i + 1].x < wxl) { //多边形两个顶点都在外部
    			continue;
    		}
    		else if (pt[i].x >= wxl && pt[i + 1].x >= wxl) { //多边形两个顶点都在内部,保留第一个点
    			/*
    			    因为每个保留的点在数组中只出现一次,且下一次判断时第二个端点一定会要取到
    			因此只保留两个点中的第一个
    			*/
    			B[m_nB].x = pt[i].x;
    			B[m_nB].y = pt[i].y;
    			m_nB++;
    		}
    		else if (pt[i].x < wxl && pt[i + 1].x >= wxl) { //两个端点起点在外部,终点在内部
    			//求交点,然后交点送入临时数组
    			x = wxl; 
    			y = (wxl - pt[i].x) * (pt[i + 1].y - pt[i].y) / (pt[i + 1].x - pt[i].x) + pt[i].y;//y = x*dy/dx+y0
    			
    			B[m_nB].x = x;
    			B[m_nB].y = y;
    			m_nB++;
    		}
    		else if (pt[i].x >= wxl && pt[i + 1].x < wxl) { //两个端点起点在内部,终点在外部
    			//求交点,起点和交点送入临时数组
    
    			//保留起点
    			B[m_nB].x = pt[i].x;
    			B[m_nB].y = pt[i].y;
    			m_nB++;
    
    			//保留交点
    			x = wxl;
    			y = (wxl - pt[i].x) * (pt[i + 1].y - pt[i].y) / (pt[i + 1].x - pt[i].x) + pt[i].y;
    
    			B[m_nB].x = x;
    			B[m_nB].y = y;
    			m_nB++;
    		}
    	}
    
    	//把第一个点的数据拷贝到最后,形成第一次裁剪后的多边形
    	if (i == m_nA) {
    		B[m_nB] = B[0];
    	}
    	
    
    	//上边界-------------------
    	m_nA = 0;
    	for (i = 0; i < m_nB; i++) {
    		if (B[i].y < wyt&&B[i + 1].y < wyt) {  //两个都在边界上方(外部)
    			continue;
    		}
    		else if (B[i].y >= wyt && B[i + 1].y >= wyt) { //都在上边界下方,保留起点
    			C[m_nA].x = B[i].x;
    			C[m_nA].y = B[i].y;
    			m_nA++;
    		}
    		else if (B[i].y < wyt && B[i + 1].y >= wyt) { //起点在上,终点在下,保留交点
    			y = wyt;
    			x = (wyt - B[i].y) * (B[i + 1].x - B[i].x) / (B[i + 1].y - B[i].y) + B[i].x;//x = y*dx/dy+x0;
    
    			C[m_nA].x = x;
    			C[m_nA].y = y;
    			m_nA++;
    		}
    		else if (B[i].y >= wyt && B[i + 1].y < wyt) {起点在下,终点在上,保留起点、交点
    			//保留起点
    			C[m_nA].x = B[i].x;
    			C[m_nA].y = B[i].y;
    			m_nA++;
    
    			//保留交点
    			y = wyt;
    			x = (wyt - B[i].y) * (B[i + 1].x - B[i].x) / (B[i + 1].y - B[i].y) + B[i].x;
    
    			C[m_nA].x = x;
    			C[m_nA].y = y;
    			m_nA++;
    		}
    	}
    	//形成第二次裁剪多边形
    	if (i == m_nB) {
    		C[m_nA] = C[0];
    	}
    
    	//右边界----------------------------------------------
    	m_nB = 0;
    	for (i = 0; i < m_nA; i++) {
    		if (C[i].x > wxr && C[i + 1].x > wxr) {  //都在右边界右方
    			continue;
    		}
    		else if (C[i].x <= wxr && C[i + 1].x <= wxr) {//都在右边界左方,保留起点
    			B[m_nB].x = C[i].x;
    			B[m_nB].y = C[i].y;
    			m_nB++;
    		}
    		else if (C[i].x > wxr && C[i + 1].x <= wxr) { //起点在右方,终点在左方,保留交点
    			x = wxr;
    			y = C[i].y - (C[i].x - wxr) * (C[i + 1].y - C[i].y) / (C[i + 1].x - C[i].x);//y = y0-x*dy/dx;
    
    			B[m_nB].x = x;
    			B[m_nB].y = y;
    			m_nB++;
    		}
    		else if (C[i].x <= wxr && C[i + 1].x > wxr) { //起点在左方,终点在右方,保留起点、交点
    			//保留起点
    			B[m_nB].x = C[i].x;
    			B[m_nB].y = C[i].y;
    			m_nB++;
    
    			//保留交点
    			x = wxr;
    			y = C[i].y - (C[i].x - wxr) * (C[i + 1].y - C[i].y) / (C[i + 1].x - C[i].x);
    			
    			B[m_nB].x = x;
    			B[m_nB].y = y;
    			m_nB++;
    		}
    	}
    	//三次裁剪后的新多边形
    	if (i == m_nA) {
    		B[m_nB] = B[0];
    	}
    
    	//下边界---------------------------------
    	m_nA = 0;
    	for (i = 0; i < m_nB; i++) {
    		if (B[i].y > wyb && B[i + 1].y > wyb) {  //都在下边界下方
    			continue;
    		}
    		else if (B[i].y <= wyb && B[i + 1].y <= wyb) { //都在下边界上方,保留起点
    			C[m_nA].x = B[i].x;
    			C[m_nA].y = B[i].y;
    			m_nA++;
    		}
    		else if (B[i].y > wyb && B[i + 1].y <= wyb) { //起点在下方,终点在上方,保留交点
    			y = wyb;
    			x = B[i].x - (B[i].y - wyb) * (B[i + 1].x - B[i].x) / (B[i + 1].y - B[i].y);//x = x0-y*dx/dy;
    
    			C[m_nA].x = x;
    			C[m_nA].y = y;
    			m_nA++;
    		}
    		else if (B[i].y <= wyb && B[i + 1].y > wyb) { //起点在上方,终点在下方,保留起点、交点
    			//保留起点
    			C[m_nA].x = B[i].x;
    			C[m_nA].y = B[i].y;
    			m_nA++;
    
    			//保留交点
    			y = wyb;
    			x = B[i].x - (B[i].y - wyb) * (B[i + 1].x - B[i].x) / (B[i + 1].y - B[i].y);
    
    			C[m_nA].x = x;
    			C[m_nA].y = y;
    			m_nA++;
    		}
    	}
    	//形成裁剪后的多边形
    	if (i == m_nB) {
    		C[m_nA] = C[0];
    	}
    
    	//把新多边形顶点放回原多边形顶点数组
    	pt = new CP2[m_nA+1];
    	for (int i = 0; i <= m_nA; i++) {
    		pt[i].x = C[i].x;
    		pt[i].y = C[i].y;
    	}
    	n = m_nA+1;
    }

     

    展开全文
  • #include , line(left,top,right,top); line(left,bottom,right,bottom); line(left,top,left,bottom); line(right,top,right,bottom); //绘制边框和裁剪图形
  • 使用Java编写的一款简单的直线、多边形的生成和裁剪软件,符合计算机图形学课程设计要求。采用Java的drawLine()方法模拟OpenGL的绘点过程,从另一个方面验证并实现了中点bresenham算法、逐边裁剪算法等。有需要的...
  • 实验四 编程实现Cohen-Sutherland线段裁剪算法或者Sutherland-Hodgman多边形裁剪算法 对各种情况进行测试,验证算法实现的完整性
  • 计算机图形学(简单多边形裁剪算法)简单多边形裁剪算法摘要:多边形裁剪算法与线性裁剪算法具有更广泛的实用意义,因此它是目前裁剪研究的主要课题。本文主要介绍了一种基于多边形顶点遍历的简单多边形裁剪算法,它...

    计算机图形学(简单多边形裁剪算法)

    简单多边形裁剪算法

    摘要:多边形裁剪算法与线性裁剪算法具有更广泛的实用意义,因此它是目前裁剪研究的主要课题。本文主要介绍了一种基于多边形顶点遍历的简单多边形裁剪算法,它有效降低了任意多边形裁剪复杂度。通过记录交点及其前驱、后继信息,生成结果多边形,该算法简化了交点的数据结构,节省了存储空间,降低了算法的时间复杂度,具有简单、易于编程实现、运行效率高的特点。

    关键词:多边形裁剪;交点;前驱;后继;矢量数组

    一、技术主题的基本原理

    简单多边形裁剪算法综合考虑现有多边形裁剪算法的优缺点,它是一种基于多边形顶点遍历来实现简单多边形裁剪工作的。其主要的原理是遍历多边形并把多边形分解为边界的线段逐段进行裁剪,输出结果多边形。

    二、发展研究现状

    近年来,随着遥感绘图、CAD辅助设计、图象识别处理技术的发展,图形裁剪算法从最初在二维平面上线和图形的裁剪扩展到三维空间里体和场的裁剪,国内外相继提出不少行之有效的算法,但越来越复杂的图形和计算也对算法的速度和适用性提出了越来越高的要求。因此,不断简化算法的实现过程,完善细节处理,满足大量任意多边形的裁剪也就成了当今算法研究的焦点之一。 CrossPointIndex{

    int nPredecessorlndex=0//前驱序号

    int nSuccessorIndex=0//后继序号

    }

    说明:CrossPointIndex用于记录交点在多边形中的前驱与后继的序号信息,以及记录同一交点在两个多边形中顶点序号。即若P为多边形S与多边形C的交点,为了表示P在S和C中为同一点,则可用CrossPointIndex记录用nPredecessorIndex记录P在S中的序号、用nSuccessorIndex记录P在C中序号。

    3)线段的数据结构如下:

    Segment{

    int nStartIndex=0

    int nEndIndex=0

    int* pIndexes;

    int nIndexCount;

    }

    说明:Segment表示多边形在另一个多边形内(外)的线段,nStartaIndex为Segment起始顶点的序号,nEndIndex为Segment终止顶点的序号,pIndexes为起始顶点与终止顶点之间的顶点序号集合,nIndexCount为pIndexes中元素个数。

    3、算法设计

    1)第一阶段:

    采用射线法计算并判断S(或C)在C(或S)内,并修改S(或C)顶点Vertex的IsInPolygon的值。

    由于射线可以任意选取,为了方便可以将射线定为从被测点开始射向X轴坐标正方向的水平射线。由于多边形的一条边与射线的交点最为1个,因此可以循环遍历每条边并判断边与射线有无交点,若有交点,计数器加1,。最后得到的计数器的值即多边形与射线的交点个数。若交点个数为奇数,则被测点在多边形内部,若交点个数为偶数,则被测点在多边形外部。对于多边形的任意一条边,为了尽量避免求交点时用到乘除法,将判断该边与射线有无交点的算法可以包含3步:

    判断边的两个顶点是否均在被测点左方或者下方或者上方,若是则无交点,返回假并退出;

    若不满足第一条原则,且满足两个顶点均在被测点右方,则一定有顶点,返回真并退出;

    若以上两条都不满足,求出边与射线的交点,比较交点的X坐标与被测点的X坐标,若前者大于后者则返回真并退出,否则返回假并退出。

    设边的两个顶点坐标分别为(x1,y1)和(x2,y2),则边的直线方程可写为:

    X=m(y-y1)+x1

    其中,m=(x2-x1)/(y2-y1)为直线斜率的倒数。使用该方程时需要两次乘除法,效率较低。为了尽量避免求交点,第三部可以采用二分法将边分成两段,对其中两个端点分别跨过射线两侧的边段重新进行以上第一步和第二步的判断,若以上两步中还没有推出,再继续二分,直到能够被第一步和第二步判断并退出。采用二分法则避免了乘除法,算法中只有除2运算和一些判断,适合于硬件处理,二分法的循环次数一般较少,当被测点位于边上时,循环次数组最多。

    其具体的算法如下:(Point为被测点变量,point1、point2为一条边的两个端点变量)

    If(piont2.y

    {

    P1=point2;

    p2=point1

    }

    Else

    {

    p1=point1;

    p2=point2;

    }

    if(p1.y>point.y||p2.y

    Return false;//无交点

    Else If(p1.x

    Return false ;无交点

    Else if (p1.x>point.x&&p2.x>point.x)Return

    展开全文
  • 二维图形的裁剪算法研究与改进机械制造及其自动化, 2011, 硕士【摘要】 本文对计算机图形学中的基础裁剪算法进行了研究。针对目前的conhen-sutherland线段裁剪算法不能有效地判断出线段是否完全在窗口外的问题,...

    二维图形的裁剪算法研究与改进

    机械制造及其自动化, 2011, 硕士

    【摘要】 本文对计算机图形学中的基础裁剪算法进行了研究。针对目前的conhen-sutherland线段裁剪算法不能有效地判断出线段是否完全在窗口外的问题,提出了一种改进的conhen-sutherland线段裁剪算法,通过添加一个判断条件,使得所有完全位于窗口外的线段都能快速的过滤出来,从而减少了求交点的次数,提高了运算效率。提出了一种改进的Cyrus—Beck线段裁剪算法。新算法与Cyrus—Beck算法相比,当n较大时,新算法的乘法大约只有Cyrus—Beck算法的1/3。因此,新算法大大地加快运算速度。提出了一种多边形窗口线裁剪算法,该算法利用所提出的一个有效的判定方法很好的减少了求交运算量,极大的提高了算法的效率。针对各种特殊情况处理又做了详尽的研究,最终将被裁剪线段快速、准确输出。实验证明,该算法是目前任意多边形线裁剪中一种较高效的算法。分析了圆形窗口与直线的位置关系及其判定方法,并给出了圆形窗口对直线裁剪的基本算法,将直线用参数表示,直线与圆形窗口交点处的t作参数,推导出简单易行的数学判别模式,经判别后,确定是否可求出参数t及其对应的交点坐标。?更多还原

    【Abstract】 The next are the outcomes of studying the clipping algorithms.Cohen-Sutherland Line Clipping Algorithm can easily deal with the case that the line is completely inside of the view, or off to the side of the view, and other cases are complexly dealt with operations between line and view several times .The key of improving the algorithm is reducing the times of the Intersecting and Clipping operations. The paper proposed a new improved algorithm. This way could reduce algorithm complexity effectiv...?更多还原

    【关键词】 计算机图形学; 凸多边形; 任意多边形; 裁剪; 算法; 【Key words】 computer graphics; convex polygon; arbitrary polygon; clipping; algorithm;

    摘要 3-4

    Abstract 4

    第一章 绪论 7-18

    1.1 计算机图形学的发展历程 7

    1.2 计算机图形学应用 7-11

    1.3 计算机图形学算法的发展 11

    1.4 裁剪操作定义 11-13

    1.5 国内外研究综述 13-15

    1.5.1 点裁剪 13

    1.5.2 矩形窗口的直线段裁剪 13

    1.5.3 多边形窗口的直线段裁剪 13-14

    1.5.4 圆形窗口的直线段裁剪 14-15

    1.5.5 多边形窗口的多边形裁剪 15

    1.6 本课题研究意义 15-16

    1.7 本文所做工作 16-18

    第二章 矩形窗口的线裁剪 18-27

    2.1 Cohen-sutherland 算法描述 18-20

    2.2 中点分割裁剪算法描述 20-21

    2.2.1 算法基本思想 20

    2.2.2 算法步骤 20-21

    2.2.3 算法特点 21

    2.3 Cohen-sutherland 线段裁剪算法改进 21-25

    2.3.1 算法思想 22

    2.3.2 改进算法步骤 22

    2.3.3 算法部分代码 22-23

    2.3.4 裁剪结果 23-25

    2.4 本章小结 25-27

    第三章 凸多边形窗口的线裁剪 27-35

    3.1 Cyrus—Beck 算法 27-29

    3.2 Cyrus—Beck 算法的改进 29-32

    3.2.1 直线对平面的分割 29-30

    3.2.2 算法的改进 30-32

    展开全文
  • 编程实现直线段的裁剪算法(算法任选)正确的程序可以处理各种位置的线段。
  • 接上文 计算机图形学 学习笔记(四):直线裁剪算法:Cohen-Suther land,中点分割法,Liang-Barsky光栅图形学算法3.4 多边形裁剪之前上一篇文章中,我们介绍了直线段的裁剪算法。现在我们要对多边形进行裁剪,如果...
  • 包含多种计算机图像的基本算法:DDA画线,Bresenhen算法,画圆,画多边形,Cohen-Sutherland裁剪算法,Liang-Barsky裁剪算法,扫描线填充算法,三次样条曲线,Bezier曲线,三次B样条曲线,二维图形变换(平移,...
  • 二维图形裁剪算法: 参考博客: https://blog.csdn.net/m0_46359746/article/details/106392352 Liang-Barsky 线段裁剪算法: //Liang-Barsky 线段裁剪算法 class wcPt2D { public: GLfloat x,y; public: /* ...
  • 逐次多边形裁剪算法算法的思想发窗口四条边界单一逐次对多边形进行裁剪,每次用窗口的一条边界(包括延长线)对要裁剪的多边形进行裁剪,裁剪时,顺序地测试多边形各顶点,保留边界内侧的顶点,删除外侧的顶点,同时,...
  • 上述多边形裁剪对于凸多边形适用,但对于部分凹多边形会出现错误如下图,向外凹陷地位置裁剪结果包含了一条本不应该有的线,对于该问题由于时间问题,还没有完成,但已经形成一定可行的改进思路。 首先还是要先求...
  • 计算机图形学简单多边形裁剪程序

    热门讨论 2013-06-03 16:42:08
    计算机图形学简单多边形裁剪程序,开发环境VC++6.0,语言C++
  • 算法原理比较简单,用裁剪区域的四条边分别去分割多边形。 假设边p1,p2,用区域某条边进行裁剪。方向为p1-&amp;amp;amp;gt;p2 1.p1在边外,p2在边外 无操作 2.p1外,p2内 保存交点p和p2 3.p1内,p2内 ...
  • 计算机图形学----直线与多边形裁剪  裁剪算法详解:在使用计算机处理图形信息时,计算机内部存储的图形往往比较大,而屏幕显示的只是图的一部分。因此需要确定图形中哪些部分落在显示区之内,哪些落在显示区之外...
  • 梁友栋-Barskey裁剪算法 直接上代码吧: // ConsoleApplication2.cpp: 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<gl/GLUT.H> #include<cmath> #include<iostream> #include...
  • 裁剪窗口:矩形,凸多边形,任意多边形裁剪类型:二维裁剪、三维裁剪裁剪对象:直线段、多边形、文字等裁剪方法:直线的裁剪方法:Sutherland-Cohen算法 , Cyrus-Beck算法,梁友栋-Barsky算法多边形的裁剪方法:...
  • 其他计算机图形学实验见 链接 文章目录裁剪不包含凹多边形的代码裁剪包含凹多边形的代码 裁剪不包含凹多边形的代码 #include<gl/glut.h> #include<iostream> #include<algorithm> #include<...
  • 能够在TC上实现任意多边形裁剪,并在计算机上运行成功,为方便同学学习,特此给大家下载。
  • 计算机图形学作业,不需修改直接在WINtc下运行

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,257
精华内容 902
关键字:

多边形裁剪计算机图形学