通过点画线-DDA算法
Posted on 2010-03-26 by 印第安小狮 in 1-程序, BLOG, C++, OpenGL, 技术
计算机图形学, 没想到好多数学内容- – 后来又布置了作业, 昨晚试着做了下, 感觉就在编程- – 真正的把数学和程序给联系了起来了, 呵呵. 通过点来画直线(DDA算法), 这个具体内容就不介绍了, 通过搜索引擎搜进来的朋友应该都了解的吧. 把自己做的程序分享下, 遗憾的是没能解决m<-1的情况, 手上事还比较多, 查得有点烦, 就打算下次课问老师去了- -
Ps:当然OpenGL有自己画直线的函数, 大不必通过点来画, 这个只是对初学者的, 比如我.
预览图(有好几种直线情况, 程序中有注释):
程序如下:
/*
* Draw Line By Points;
* --KJuly.
*/
#include
//DDA算法;
void line( float x0, float y0, float x1, float y1 ) {
if( x0 == x1 || y0 == y1 ) {
int t, t1;
if( x0 == x1 ) {
t = y0;
t1 = y1;
}
else {
t = x0;
t1 = x1;
}
for( ; t<=t1; t++ ){
glColor3f( 255.0, 255.0, 255.0 );
glBegin( GL_POINTS );
if( x0 == x1 ) {
glVertex2i( (int)x0, (int)t );
}
else {
glVertex2i( (int)t, (int)y0 );
}
glEnd();
glFlush();
}
}
else {
// 假定 x01的情况下, y递增;
if( m<-1 || m>1 ) {
m = dx / dy;
Max = y1; //Max值替换;
x = y0; //将x和y角色互换;
y = x0;
change = true;
}
for( ; x<=Max; x++ ){
glColor3f( 255.0, 255.0, 255.0 );
glBegin( GL_POINTS );
if( change==true ) {
glVertex2f( y, x );
}
else {
glVertex2f( x, y );
}
glEnd();
glFlush();
y += m;
}
}
}
// 画线;
void drawLine() {
line( 0, 100, 350, 120 ); //-1<=m<=1的情况;
line( 100, 0, 300, 500 ); //m>1的情况;
line( -250, 500, 250, 0 ); //m=-1的情况;
//m<-1的情况未能解决;
line( 50, 0, 50, 500 ); //垂直线, 即x0和x1相同的情况;
line( 0, 150, 350, 150 ); //水平线, 即y0和y1相同的情况;
}
//main函数;
int main(int argc, char * * argv)
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_SINGLE|GLUT_RGB );
glutInitWindowSize( 500, 500 );
glutInitWindowPosition( 220, 220 );
glutCreateWindow( "DrawLine By Points -- KJuly/印第安小狮." );
glClearColor( 0.0, 0.0, 0.0, 0.0 );
gluOrtho2D( 0.0, 400.0, 0.0, 300.0 );
glutDisplayFunc( drawLine );
glutMainLoop();
return 0;
}
