实验1 直线生成

该代码示例使用OpenGL库和lineDDA算法在窗口中绘制直线。通过glut函数初始化窗口,设置显示回调函数myDisplay,其中调用lineDDA函数。lineDDA函数计算直线上的每个点并使用setPixel进行绘制。同时,ChangeSize函数处理窗口大小改变事件,确保图形比例正确。

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

#include<iostream>
#include<windows.h>
#include<math.h>
#include<GL/glut.h>
using namespace std;

void myDisplay(void);//用这个函数来调用lineDDA
void setPixel(int x, int y);//教科书里画点的函数,在0penGL中可以用glVertex来实现
// lint round( const float a)
void ChangeSize(GLsizei w, GLsizei h);
void lineDDA(int xo,int yo,int xEnd,int yEnd);

void myDisplay(void) {
	lineDDA(50, 50, 200, 200);
}

void setPixel(int x, int y) {
	//用opengl实现setPixel函数
	glPointSize(5.0f);
	glBegin(GL_POINTS);
	glVertex2i(x, y);
	glEnd();
	glFlush();
}

void ChangeSize(GLsizei w, GLsizei h) {
	if (h == 0)
		h = 1;
	glViewport(0, 0, w, h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	if (w <= h)
		glOrtho(0.0f, 250.0f, 0.0f, 250.0f * h / w, 1.0, -1.0);
	else
		glOrtho(0.0f, 250.0f * w / h, 0.0f, 250.0f, 1.0, -1.0);
}

void  lineDDA(int x0, int y0, int xEnd, int yEnd) {
	glPointSize(1.0f); //像素点大小
	int dx = xEnd - x0, dy = yEnd - y0, steps, k;
	float	xIncrement, yIncrement, x = x0, y = y0;
	if (abs(dx) > abs(dy))
		steps = abs(dx);
	else
		steps = abs(dy);

	xIncrement = float(dx) / float(steps);
	yIncrement = float(dy) / float(steps);

	setPixel(round(x), round(y));

	for ( k = 0; k < steps; k++)
	{
		x+= xIncrement;
		y += yIncrement;
		setPixel(round(x), round(y));

	}
}


	int main(int argc, char* argv[]) 
{
		glutInit(&argc, argv);
		glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
		glutInitWindowPosition(200, 200);
		glutInitWindowSize(400, 400);
		glutCreateWindow("Daily Practice"); 
		glutDisplayFunc(&myDisplay);
		glutReshapeFunc(ChangeSize);
		glutMainLoop();
		return 0;

}

结果图

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值