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=10
和x2=10
所以dx=0
因为dx = x2 - x1;
最后数组P
的大小为0 float P[int(dx)];
可能它必须是@ 987654329@
【参考方案1】:
问题从一行开始
drawLine(10, 10, 10, 100 )
这个调用导致x1=10
和x2=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-x1
和y2-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 线抽屉在渲染任何东西之前在某个循环后崩溃? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章