通过点画线-DDA算法

Posted on 2010-03-26 by 印第安小狮 in 1-程序, BLOG, C++, OpenGL, 技术

        计算机图形学, 没想到好多数学内容- – 后来又布置了作业, 昨晚试着做了下, 感觉就在编程- – 真正的把数学和程序给联系了起来了, 呵呵. 通过点来画直线(DDA算法), 这个具体内容就不介绍了, 通过搜索引擎搜进来的朋友应该都了解的吧. 把自己做的程序分享下, 遗憾的是没能解决m<-1的情况, 手上事还比较多, 查得有点烦, 就打算下次课问老师去了- -

        Ps:当然OpenGL有自己画直线的函数, 大不必通过点来画, 这个只是对初学者的, 比如我.

预览图(有好几种直线情况, 程序中有注释):

通过点画线-dda算法

通过点画线-DDA算法

程序如下:


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

Tags: , ,



作者: KJuly

中文昵称,印第安小狮. 从小爱好绘画设计, 04年开始接触媒体领域, 08年步入大学开始学习程序语言. 至此, 掌握众多媒体制作软件和程序设计语言. 熟练于Ps、Dw、Div+CSS、C++、Java.








Fatal error: Call to undefined function wp_related_posts() in /home/ilion19892i0lqiwoang1a9g8s9/wwwroot/MyBlog/wp-content/themes/metamorphosis/single.php on line 63