Bresenham 线抽屉在渲染任何东西之前在某个循环后崩溃? [关闭]

Posted

技术标签:

【中文标题】Bresenham 线抽屉在渲染任何东西之前在某个循环后崩溃? [关闭]【英文标题】:Bresenham line drawer crashes after certain loop before rendering anything? [closed] 【发布时间】:2019-06-11 08:52:18 【问题描述】:

我正在尝试在 CodeBlocks 中使用 OpenGL 使用 Bresenham 线绘制算法绘制直方图。当 drawLine 的参数更改(手动/硬编码)时,程序崩溃。代码不完整,我只是想尝试一下。为什么程序在渲染任何东西之前在某个循环之后崩溃?

我在 drawHistogram 函数内的 drawLine 函数中尝试了不同的参数。循环本身似乎也存在问题。我不能在那里工作。虽然逻辑对我来说似乎没问题,但结果并不像预期的那样。

#include <iostream>
#include <GL/glut.h>

using namespace std;

void drawLine();
void inputData();
void CoordinateAxes();
void plot(float x, float y);

void drawBar(float );
void drawHistogram();

float x, y, dx, dy, D1, D2, xInc, yInc;

//int frequency[5] = 100, 200, 150, 300, 500 ;

int main(int argc, char** argv)

    //inputData();

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(500,500);

    glutCreateWindow("DDA Algorithm");
    glutDisplayFunc(drawHistogram);

    glutMainLoop();
    return 0;


void drawLine(float x1, float y1, float x2, float y2)

    glClear(GL_COLOR_BUFFER_BIT);
    CoordinateAxes();
    glColor3ub(255 ,255,255);
    glBegin(GL_POINTS);

        dx = x2 - x1;
        dy = y2 - y1;

        float P[int(dx)];

        if (dy >= dx)
        
            D1 = dx;
            D2 = dy;
            xInc = 0;
            yInc = 1;
        
        else
        
            D1 = dy;
            D2 = dx;
            xInc = 1;
            yInc = 0;
        

        P[0] = 2*D1 - D2;


        x = x1;
        y = y1;
        //plot(x, y);
        //cout << "(" << x << "," << y << ") ";
        //cout << D2;



        for(int i = 0; i < D2 ; i++)
        
            if (P[i] <= 0)
            
                plot(x , y);
                P[i+1] = P[i] + 2*D1;
                x += xInc;
                y += yInc;
                //cout << "(" << x << "," << y << ")";
            
            else
            
                plot(x , y );
                P[i+1] = P[i] + 2*D1 - 2*D2;
                x += 1;
                y += 1;
                //cout << "(" << x << "," << y << ")";
            
        
    glEnd();
    glFlush();


//void inputData()
//
//    cout << "Enter frequencies of 5 data: ";
//
//    for (int i = 0; i < 5; i++)
//    
//        cin >> freq[i];
//    
//

void CoordinateAxes()

    glColor3ub(0,0,255);
    glBegin(GL_LINES);
        glVertex2f(0,1);
        glVertex2f(0,-1);
        glVertex2f(-1,0);
        glVertex2f(1,0);
    glEnd();


void plot(float x, float y)

    glVertex2f(x/500, y/500);
    cout << "(" << x << "," << y << ")";


//void drawBar(float freq)
//
//    drawLine(0, 0, 0, freq );
//    drawLine(0, freq, 25, freq);
//    drawLine(25, freq, 25, 0);
//

void drawHistogram()

    drawLine(10, 10, 10, 100 );

我希望在 OpenGL 窗口上呈现一条直线。

【问题讨论】:

在哪一行崩溃?你得到哪个错误?另外:当您使用 OpenGL 时,实现您自己的线条绘制有什么意义? OpenGL已经可以画线了。 当你调用drawLine(10, 10, 10, 100 ) 然后x1=10x2=10 所以dx=0因为dx = x2 - x1; 最后数组P 的大小为0 float P[int(dx)]; 可能它必须是@ 987654329@ 【参考方案1】:

问题从一行开始

drawLine(10, 10, 10, 100 )   

这个调用导致x1=10x2=10,所以dx=0因为dx = x2 - x1; 最后数组P 的大小为0,因为float P[int(dx)];

void drawLine(float x1, float y1, float x2, float y2)

    // [...]

    dx = x2 - x1;
    dy = y2 - y1;

    float P[int(dx)]; 

您必须创建一个数组,其大小的绝对最大差异为x2-x1y2-y1

#include <algorithm>
float P[int(std::max(abs(dx), abs(dy))+0.5)+1];

在 c++ 中我推荐使用std::vector:

#include <vector>
std::vector<float> P(int(std::max(abs(dx), abs(dy))+0.5)+1, 0.0f);

【讨论】:

谢谢。是的,问题出在阵列上。现在它工作正常。

以上是关于Bresenham 线抽屉在渲染任何东西之前在某个循环后崩溃? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Bresenham 线算法错误

用Bresenham线算法绘制线条

Bresenham画线算法

Bresenham 线算法所有情况

用C++如何实现bresenham画线算法?计算机图形学上面有个drawpixel的函数。不知道怎么用。

关于Bresenham算法的求助