加载中…
个人资料
沧海森林
沧海森林
  • 博客等级:
  • 博客积分:0
  • 博客访问:2,535
  • 关注人气:47
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Opengl实现线段的线宽、颜色属性 计算机图形学

(2011-11-18 20:12:57)
标签:

opengl

实现线段

的线宽、

颜色属性

计算机

图形学

it

分类: 计算机图形学OpenGL

  如需源码请通过博客首页上方的QQ之一联系。

   熟悉OpenGL的点、线属性函数,在之前的基本直线绘制(Bresenham,DDA算法中的一种)基础上,实现用颜色,宽度函数生成不同颜色,粗细和线型的直线,实现用属性函数绘制不同颜色,大小的点。但是线型实现不做要求,所以要完成实现线的颜色的设置和线宽的设置。void lineWidthByDDA(int x0,int y0,int xEnd,int yEnd,int width,float red,float green,float blue)其中前两个参数为开始的坐标值,紧接着两个参数是结束的坐标值,int width是需设置的线宽的值,后面三个参数是设置线的颜色的RGB三基色的值。 下面的两幅图分别表示了3倍线宽(奇数)和6倍线宽(偶数)的情况:

http://s3/small/5e94b1034b2016c8df1e2&690计算机图形学" TITLE="Opengl实现线段的线宽、颜色属性 计算机图形学" />

【注】代码如下:

#include<windows.h>

#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif

#include<stdio.h>
#include<stdlib.h>
#include<math.h>


void init (void)
{
    glClearColor (1.0, 1.0, 1.0, 0.0);  // Set display-window color to white.
    glMatrixMode (GL_PROJECTION);       // Set projection parameters.
    gluOrtho2D (0.0, 200.0, 0.0, 150.0);
}

int round(const float a)
{
 return (int)(a+0.5);
}
//使用DDA算法实现线宽和线的颜色的设置,其中前四个参数为起点和终点坐标,中间的一个参数为线宽,后面的三个参数为线的颜色的设置,分别表示红,绿,蓝
void lineWidthByDDA(int x0,int y0,int xEnd,int yEnd,int width,float red,float green,float blue)
{
    glColor3f(red,green,blue);
 int dx = xEnd - x0;
 int dy = yEnd - y0;
 int steps,k;
 float xIncrement,yIncrement,x = x0,y = y0;
    glEnable(GL_POINT_SMOOTH);
    width -= 1;
    int minWidth,maxWidth;
    if (width%2==0){
        minWidth = -width/2;
        maxWidth = width/2;
    }
    else{
        minWidth = -width/2 - 1;
        maxWidth = width/2;
    }
 if(fabs (dx) > fabs(dy)){
  steps = fabs(dy);
        xIncrement = (float)(dx)/(float)(steps);
        yIncrement = (float)(dy)/(float)(steps);
        for (k=0;k<steps;k++)
        {
            glBegin(GL_POINTS);
            for (int i = minWidth;i<=maxWidth;i++){
                glVertex2i(round(x),round(y+i));
            }
            glEnd();
            x += xIncrement;
            y += yIncrement;
        }
 }
 else{
  steps = fabs(dx);
        xIncrement = (float)(dx)/(float)(steps);
        yIncrement = (float)(dy)/(float)(steps);
        for (k=0;k<steps;k++)
        {
            glBegin(GL_POINTS);
            for (int i = minWidth;i<=maxWidth;i++)
                glVertex2i(round(x+i),round(y));
            glEnd();
            x += xIncrement;
            y += yIncrement;
        }
 }
glFlush();
}

void pointFun()
{
 int x0 = 0,y0 = 0,xEnd = 100,yEnd = 100;
 float red = 1.0,green = 0.5,blue = 0.5;
 glClear (GL_COLOR_BUFFER_BIT);
 lineWidthByDDA(x0,y0+1,xEnd,yEnd,5,red,green,blue);
 glFlush();
}

int main (int argc, char** argv)
{

    glutInit (&argc, argv);                         // Initialize GLUT.
    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);   // Set display mode.
    glutInitWindowPosition (50, 100);   // Set top-left display-window position.
    glutInitWindowSize (400, 300);      // Set display-window width and height.
    //glutFullScreen();
    glutCreateWindow ("An Example OpenGL Program By Qiu"); // Create display window.
 init();                           // Execute initialization procedure.
    glutDisplayFunc (pointFun);       // Send graphics to display window.
    glutMainLoop ( );// Send graphics to display window.                  // Display everything and wait.
 return 0;
}

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有