C++OpenGL画直线段的中点算法

void COpenGLView::MidPoint(int x1, int y1, int x2, int y2)
{	
	//先考虑斜率不存在的情况
	if (x1 == x2) {
		if (y1 <= y2) {
			for (int y = y1; y <= y2; y++) {
				glBegin(GL_POINTS);
				glVertex2i(x1, y);
				glEnd();
			}
		}
		else {
			for (int y = y1; y >= y2; y--) {
				glBegin(GL_POINTS);
				glVertex2i(x1, y);
				glEnd();
			}
		}
	}
	else
	{	
		//为了便于思考分类,将右边的点设为(xEnd,yEnd)
		int x, y, xEnd, yEnd;
		if (x1 < x2) {
			x = x1; xEnd = x2; y = y1; yEnd = y2;
		}
		else {
			x = x2; xEnd = x1; y = y2; yEnd = y1;
		}
		int a = y - yEnd, b = xEnd - x;
		
		if (yEnd >= y && (yEnd-y) <= (xEnd-x)) {       //这里判断斜率是不是>=0且<=1,后面的一样
			int d = a + a + b;
			while (x<=xEnd)
			{
				glBegin(GL_POINTS);
				glVertex2i(x, y);
				glEnd();
				if (d >= 0) {
					x++;
					d = d + a + a;
				}
				else {
					x++;
					y++;
					d = d + a + a + b + b;
				}
			}
		}
		else if(yEnd < y && (y - yEnd) <= (xEnd - x))
		{
			int d = a + a - b;
			while (x <= xEnd)
			{
				glBegin(GL_POINTS);
				glVertex2i(x, y);
				glEnd();
				if (d >= 0) {
					x++;
					y--;
					d = d + a + a - b - b;
				}
				else {
					x++;					
					d = d + a + a;
				}
			}
		}
		else if (yEnd >= y && (yEnd - y) > (xEnd - x))
		{
			int d = a + b + b;
			while (y <= yEnd)
			{
				glBegin(GL_POINTS);
				glVertex2i(x, y);
				glEnd();
				if (d >= 0) {
					x++;
					y++;
					d = d + a + a + b + b;
				}
				else {
					y++;
					d = d + b + b;
				}
			}
		}
		else if (yEnd < y && (y - yEnd) > (xEnd - x))
		{
			int d = a - b - b;
			while (y >= yEnd)
			{
				glBegin(GL_POINTS);
				glVertex2i(x, y);
				glEnd();
				if (d >= 0) {
					y--;
					d = d - b - b;
				}
				else {
					y--;
					x++;
					d = d - b - b + a + a;
				}
			}
		}
	}
}

老师的课件:
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述这里的情况只是考虑斜率大于0且小于1的,更多的情况下面d0和增量都不一样。都在代码里面了

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
中点线算法是一种经典的线算法,它可以在OpenGL中被使用。下面是C++实现代码: ```c++ #include <GL/glut.h> #include <iostream> #include <cmath> using namespace std; void init(void) { glClearColor(0.0, 0.0, 0.0, 0.0); glMatrixMode(GL_PROJECTION); gluOrtho2D(-200.0, 200.0, -200.0, 200.0); } void setPixel(int x, int y) { glColor3f(1.0, 1.0, 1.0); glBegin(GL_POINTS); glVertex2i(x, y); glEnd(); } void midpointLine(int x1, int y1, int x2, int y2) { int dx = x2 - x1; int dy = y2 - y1; int d = dy - (dx / 2); int x = x1, y = y1; setPixel(x, y); while (x < x2) { x++; if (d < 0) { d += dy; } else { d += (dy - dx); y++; } setPixel(x, y); } } void display(void) { glClear(GL_COLOR_BUFFER_BIT); midpointLine(-100, -100, 100, 100); glFlush(); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(400, 400); glutInitWindowPosition(100, 100); glutCreateWindow("Midpoint Line Algorithm"); init(); glutDisplayFunc(display); glutMainLoop(); return 0; } ``` 在这个例子中,我们使用OpenGL库来绘制线条。 `setPixel` 函数用于在坐标 `(x, y)` 处绘制一个白色像素点。 `midpointLine` 函数使用中点线算法来绘制一条从 `(x1, y1)` 到 `(x2, y2)` 的直线。在 `display` 函数中,我们调用了 `midpointLine` 函数来绘制直线。 这个例子使用了 GLUT 库来创建窗口和处理事件。如果你不熟悉 GLUT 库,建议先学习一下它的基本用法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值