CG Foundation - MidPoint (OpenGL)

MidPoint Line 中点画线算法


适应任意点的 MidPoint 直线绘制算法(OpenGL实现,用了GLUT工具包)

个人觉得这个算法写得遭透了,但又没想出怎么精简,一看上去就像一大堆垃圾代码集合,虽然效果能实现。


没有什么难点,与各种 “图形学”的书籍所讲的一样,如过对原理不太清楚可以查阅相关书籍,下面仅给出

实现代码。


完整的 MidPoint OpenGL 实现直线绘制算法代码:

#ifndef GLUT_DISABLE_ATEXIT_HACK
#define GLUT_DISABLE_ATEXIT_HACK
#endif

#include <GL/glut.h>
#include <stdio.h>
#include <math.h>

// 颜色
typedef struct _color
{
	float r, g, b;
	float alpha;
}ColorRGBA;

// 2D顶点
typedef struct _point
{
	float x;
	float y;
	ColorRGBA color;
}Point2D;

Point2D gStart;
Point2D gEnd;

void MidPointLine(Point2D* start, Point2D* end)
{
	float x, y;
	float k;
	float a, b;
	float d, d1, d2;

	Point2D* START;		// 起始标记
	Point2D* END;		// 结尾标记

	if(start->x > end->x)
	{
		START = end;
		END	  = start;
	}

	else
	{
		START = start;
		END   = end;
	}

	x = START->x;
	y = START->y;
	a = START->y - END->y;
	b = END->x - START->x;
	k = -a/b;

	::glVertex3d(x, y, 0);

	if( abs(k) < 1 )
	{
		if( k > 0 )
		{
			d	= 2*a + b;
			d1	= 2*a;
			d2	= 2*(a + b);

			while( x < END->x )
			{
				if( d < 0 )
				{
					x++;
					y++;
					d = d + d2;
				}

				else
				{
					x++;
					d = d + d1;
				}

				::glVertex3d(x, y, 0);
			}
		}

		else
		{
			d  = 2*a - b;
			d1 = 2*a;
			d2 = 2*(a - b);

			while( x < END->x )
			{
				if( d > 0 )
				{
					x++;
					y--;
					d = d + d2;
				}

				else
				{
					x++;
					d = d + d1;
				}

				::glVertex3d(x, y, 0);
			}
		}
	}

	if( abs(k) >= 1 )
	{
		if( k > 0 )
		{
			d	= 2*b + a;
			d1	= 2*b;
			d2	= 2*(b + a);

			while( y < END->y )
			{
				if( d > 0 )
				{
					x++;
					y++;
					d = d + d2;
				}

				else
				{
					y++;
					d = d + d1;
				}

				::glVertex3d(x, y, 0);
			}
		}

		else
		{
			d  = a - 2*b;
			d1 = -2*b;
			d2 = 2*(a - b);

			while( y > END->y )
			{
				if( d < 0 )
				{
					y--;
					x++;
					d = d + d2;
				}

				else
				{
					y--;
					d = d + d1;
				}

				::glVertex3d(x, y, 0);
			}
		}
	}
}

void init(void)
{
	glClearColor(0.0, 0.0, 0.0, 0.0);
	glOrtho(0.0, 500.0, 0.0, 500.0, -500.0, 500.0);
}

void display(void) 
{
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(1.0, 1.0, 1.0); 
	glBegin(GL_POINTS);

	::MidPointLine(&gStart, &gEnd);

	glEnd();
	glFlush();
}


int main(int argc, char **argv)
{
	printf("Set start position & end position :");
	scanf("%f%f%f%f", &gStart.x, &gStart.y, &gEnd.x, &gEnd.y);

	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
	glutInitWindowSize(800, 600);
	glutCreateWindow("OpenGL Line Algorithms");
	init();
	glutDisplayFunc(display);
	glutMainLoop();

	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值