【计算机图形学】实验报告5线段裁剪算法

本文主要介绍了在OpenGL环境下实现Cohen-Sutherland和Liang-Barsky线段裁剪算法的过程。通过编程实践,详细解析了glShadeModel接口的作用,以及glLoadIdentity的正确含义。同时,对比阐述了glutInitWindowPosition、glViewport、glutInitWindowSize和gluOrtho2D等函数在图形窗口管理中的不同职责。最后,讨论了glutPostRedisplay在窗口重绘中的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、编写程序实现Cohen-Sutherland线段裁剪算法。
2、编程实现Liang-Barsky算法。

1、实现Cohen-Sutherland线段裁剪算法。

#include<gl/glut.h>
#include<stdio.h>
#include<stdlib.h>
#define LEFT_EDGE 1
#define RIGHT_EDGE 2
#define BOTTOM_EDGE 4
#define TOP_EDGE 8
void LineGL(int x0, int y0, int x1, int y1) {
   
	glBegin(GL_LINES);
	glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(x0, y0);
	glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(x1, y1);
	glEnd();
}
void Liney(int x3, int y3, int x4, int y4) {
   
	glBegin(GL_LINES);
	glColor3f(0.0f, 0.0f, 0.0f); glVertex2f(x3, y3);
	glColor3f(0.0f, 0.0f, 0.0f); glVertex2f(x4, y4);
	glEnd();
}
void Linex(int x5, int y5, int x6, int y6) {
   
	glBegin(GL_LINES);
	glColor3f(0.0f, 0.0f, 0.0f); glVertex2f(x5, y5);
	glColor3f(0.0f, 0.0f, 0.0f); glVertex2f(x6, y6);
	glEnd();
}
struct Rectangle {
   
	float xmin, xmax, ymin, ymax;
};
Rectangle rect;
int x0, y0, x1, y1, x3, y3, x4, y4, x5, y5, x6, y6;
int CompCode(int x, int y, Rectangle rect) {
   
	int code = 0x00;
	if (y < rect.ymin)
		code = code | 4;
	if (y > rect.ymax)
		code = code | 8;
	if (x > rect.xmax)
		code = code | 2;
	if (x < rect.xmin)
		code = code | 1;
	return code;
}
int cohensutherlandlineclip(Rectangle rect, int &x0, int &y0, int &x1, int &y1)
{
   
	int accept, done;
	float x, y;
	accept = 0;
	done = 0;
	int code0, code1, codeout;
	code0 = CompCode(x0, y0, rect);
	code1 = CompCode(x1, y1, rect);
	do {
   
		if (!(code0 | code1)) {
   //整条线段在窗口内
			accept = 1;//取之
			done = 1;
		}
		else if (code0 & code1)//两个端点同在窗口一侧,弃之
			done = 1;
		else {
   //线段与窗口存在交点
			if (code0 != 0)
				codeout = code0;
			else
				codeout = code1;
1) 如果整条直线完全在窗口之内。此时,不需剪裁,显示整条直线,简称“取”之。 2) 如果整条直线明显在窗口之外,此时,不需剪裁,不显示直线。简称“弃”之。 3) 如果部分直线在窗口之内,部分在窗口之外。此时,需要求出直线与窗框之交点,并将窗口外的直线部分剪裁掉,显示窗口内的部分。 图2-1多边形裁剪区域编码 图2-2线段裁剪 为使计算机能够快速判断条直线段与窗口属何种关系,采用如下编码方法。延长窗口的边,把未经裁剪的图形区域分成九个区,如图2-1所示。每个区具有个四位代码,即四位进制数,从左到右各位依次表示上、下、右、左。裁剪线段(如图2-2)时,先求出端点P1P2所在的区号code1和code2。若code1=0, 且code2=0,则说明线段P1P2均在窗口内,那么整条线段也必在窗口内,应取之。 若code1和code2经按位与运算后的结果code1&code2≠ 0,则说明两个端点同在窗口的上方、下方、左方或右方。在这种情况下,可判断线段完全在窗口外,可弃之。 如果上述两种条件均不成立,则按第三种情况处理。求出线段与窗口某边的交点,在交点处把线段分为,其中必有完全在窗口外,可弃之。再对另重复上述处理。 在实现本算法时,不必把线段与每条窗口边界依次求交,只要按顺序检测到端点的编码不为0,才把线段与对应的窗口边界求交。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值