我一直在尝试使用Bresenham算法生成一条线(是的,我知道在内置函数中存在,但这是我已被要求实现的),使用以下代码。 但由于某种原因,我无法在窗口看到这条线。我只是得到一个空窗口。
我最初尝试使用SetPixel()绘制点,但除了X和Y坐标之外,我缺少2个参数(HDC和COLORREF)。我不知道其他两个论点是做什么的,所以我不得不尝试别的东西。
所以我使用了我在StackOverflow上找到的解决方案来生成点。虽然我没有收到任何编译错误或警告,但代码似乎不起作用。你试着寻找问题怎么样:
#include<iostream>
#include<GL/glut.h>
#include<stdlib.h>
#include<math.h>
using namespace std;
int x00;
int y00;
int xEnd;
int yEnd;
void init(){
glClearColor(1,0,0,0);
glMatrixMode( GL_PROJECTION );
gluOrtho2D(0,500,0,500);
}
void bres()
{
int dx = fabs(xEnd - x00), dy = fabs(yEnd - y00);
int p = 2*dy-dx;
int x, y;
if(x00>xEnd){
x=xEnd;
y=yEnd;
xEnd=x00;
}
else{
x=x00;
y=y00;
}
//Stack Overflow Solution to generate a point:
glBegin(GL_POINTS);
glColor3f(0,0,0);
glVertex2i(x,y);
glEnd();
while(x<xEnd){
x++;
if(p<0){
p = p + 2*dy;
}
else{
y++;
p= p + 2*dy - 2*dx;
}
glBegin(GL_POINTS);
glColor3f(0,0,0);
glVertex2i(x,y);
glEnd();
}
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
bres();
glFlush();
}
int main(int argc, char* argv[])
{
cout<<"Enter the co ordinates for 2 points: ";
cin>>x00>>y00>>xEnd>>yEnd;
glutInit(&argc, argv);
glutInitWindowSize(600,600);
glutInitWindowPosition(10,10);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("Bresenham's Algo");
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
答案 0 :(得分:0)
由于您使用的是双缓冲窗口
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
您必须拨打glutSwapBuffers
而不是glFlush
。
如果您使用单个缓冲窗口
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH);
然后glFlush
就可以了。
以某种方式改变你的代码:
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
bres();
//glFlush();
glutSwapBuffers();
}