【问题标题】:OpenGL: Rendering a line using only GL_POINTSOpenGL:仅使用 GL_POINTS 渲染一条线
【发布时间】:2016-09-29 23:03:07
【问题描述】:

这是一个我需要使用 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(),不管参数如何,第一行总是虚线,其他都是完美的。

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

谢谢!

【问题讨论】:

  • 尝试使用多个绘图调用(但保持较小,例如
  • 您应该先创建一个值向量,然后将它们作为顶点属性传递
  • 也许你也可以避免每次都计算j,因为 j 的增量也是恒定的:double jInc = m * precision 并改变你的循环:for (double i = x1, j = y1; i &lt; x2; i+=precision, j += jInc){

标签: c++ opengl line


【解决方案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);

您正在用m==0 计算c,所以c 总是等于j。尝试将c 的计算移到计算m 之后的一行。

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

至于其他从像素画线的方法,Bresenham 线不会出错:https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm

【讨论】:

  • 哦,你太早计算 c 是对的。我们了解到 Bresenham 在绘制水平/垂直直线时效率不高。因此尝试使用普通的旧线功能来做到这一点。我现在注意到的是,如果我画了 2 条线,那么第一条是点线的!所以如果我多次调用line(),不管参数如何,第一行总是虚线,其他都是完美的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-02
  • 1970-01-01
相关资源
最近更新 更多