这是一个我需要使用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行总是点缀,其他行是完美的。
有没有更好的方法(公式或循环)来渲染一条线?
谢谢!
答案 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