OpenGL:仅使用GL_POINTS渲染一条线

时间:2016-09-29 03:15:23

标签: c++ opengl line

这是一个我需要使用OpenGL渲染一行但只使用 GL_POINTS 的作业。

我用水平线 P1(-1,-1)测试它到 P2(1,-1)

我的函数使用行函数y = mx + c:

void line2(double x1, double y1, double x2, double y2, double precision, int r, int g, int b){


double m = 0.0;             // slope
double c = (y1 - m*x1);     // constant
double j = y1;              // starting y value

// check division by 0
if (x2-x1 == 0)
    m = 0;
else 
    m = (y2-y1)/(x2-x1);

glColor3f(r,g,b);

glBegin(GL_POINTS);
    for (double i = x1; i < x2; i+=precision){
        j = m*i + c;        // result of y from line function
        glVertex2f(i,j);
    }
glEnd();

}

用以下方式调用:

line2(-1,-1,1,-1,0.000001, 102, 102, 255);

给我一​​条水平虚线。这不是连续的。如果我添加更多精度,我的程序可能会因内存而挂起。

更新:我现在注意到的是渲染多行,第一行是点缀!因此,如果我多次调用line(),无论参数如何,第1行总是点缀,其他行是完美的。

有没有更好的方法(公式或循环)来渲染一条线?

谢谢!

1 个答案:

答案 0 :(得分:1)

double m = 0.0;             // slope
double c = (y1 - m*x1);     // constant
double j = y1;              // starting y value

// check division by 0
if (x2-x1 == 0)
    m = 0;
else 
    m = (y2-y1)/(x2-x1);

您正在使用c计算m==0,因此c始终等于j。尝试在c计算后将m的计算移动到一行。

此外,当x2-x1 == 0时,斜率应为正或负无穷大,而不是0.由于inf难以使用,您可能需要特殊情况来绘制垂直线。

至于从像素中绘制线条的其他方法,您可以使用Bresenham线条出错:https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm