如需源码请通过博客首页上方的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));