Opengl实现线段的线宽、颜色属性 …

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/CHINAonlyQiu/article/details/10224517

  如需源码请通过博客首页上方的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倍线宽(偶数)的情况:

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

【注】代码如下:

#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));
        

展开阅读全文

没有更多推荐了,返回首页