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;
}