DDA线条绘制算法有错误

问题描述 投票:-2回答:2

为什么我收到一条错误,说这个代码的'setPixel未定义'?

#include <windows.h>    
#include <stdio.h>    
#include <math.h>    
#include <stdlib.h>    
#include<GL/glut.h>

inline int round(const float a)
{
    return int (a+0.5);
}

void init(void)
{
    glClearColor(0.0f,0.0f,1.0f,1.0f);
    gluOrtho2D(0.0,200.0,0.0,200.0);
    glMatrixMode(GL_PROJECTION);
}

void LineSegment(int xa, int ya,int xb,int yb)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0f,0.0f,0.0f);    

    printf("Enter the initial value");
    scanf("%d%d",&xa,&ya);

    printf("Enter the final value");
    scanf("%d%d",&xb,&yb);

    int dx=xb-xa;
    int dy=yb-ya;
    int steps,k;
    float xIncrement,yIncrement,x=xa,y=ya;
    if(fabs(dx)>fabs(dy))
        steps=fabs(dx);
    else
        steps=fabs(dy);

    xIncrement=dx/(float)steps;
    yIncrement=dy/(float)steps;
    setPixel(round(x),round(y));
    for(k=0;k<steps;k++);
    {
        x += xIncrement;
        y += yIncrement;
        setPixel(round(x),round(y));
    }
    glFlush();
}

int main(int argc, char** argv)
{
    glutInit(&argc,argv);

    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGBA);
    glutCreateWindow("DDA Line Algorithm");
    glutDisplayFunc(LineSegment);
    init();
    glutMainLoop();
    return 0;
}
c opengl opengl-3
2个回答
2
投票

因为在OpenGL或GLUT中没有setPixel方法,并且从我的代码中可以看出,你也没有定义。 OpenGL处理​​渲染基元,如点,线,三角形等,但不直接在屏幕上设置单个像素。既然不清楚你想要达到什么建议:

  • 如果你想在OpenGL中绘制一条线,使用适当的方法,如glBegin(GL_LINES), etc.(虽然它们已被弃用,不应再使用了。)或glDrawArrays(GL_LINES, ...
  • 如果目标是实现dda软件光栅化器,那么您可能必须将像素写入纹理然后显示此纹理。

2
投票

因为你还没有在任何地方定义setPixel。这不是一个OpenGL调用。你需要自己编写它,它应该在缓冲区上设置像素(如果你正在使用双缓冲),然后你将其用作glDrawPixels()的参数,或者使用glVertex2i(x,y)调用显示缓冲区。您可以看到两种方法herehere的示例。

此外,你的LineSegment功能被打破。在OpenGL中,您可以调用glutDisplayFunc来指定一个尽可能快地调用的函数来渲染显示。但是,在此函数中,您调用scanf()来提示用户输入数据 - 这已被破坏。您应该在开始时提示它们一次,然后将该数据传递给函数(一旦调用glutMainLoop,它将尽可能频繁地运行)。

© www.soinside.com 2019 - 2024. All rights reserved.