gpt4 book ai didi

c++ - Bresenham 画圆算法的实现有什么问题?

转载 作者:行者123 更新时间:2023-12-02 03:02:17 25 4
gpt4 key购买 nike

我已经实现了 Bresenham 圆算法。但这段代码只输出一个白色窗口。不绘制圆边界的单个像素。

该函数绘制 8 个对称点。

void plot_point(int x, int y, int xc, int yc)
{
glBegin(GL_POINTS);
glVertex2i(xc+x, yc+y);
glVertex2i(xc+x, yc-y);
glVertex2i(xc+y, yc+x);
glVertex2i(xc+y, yc-x);
glVertex2i(xc-x, yc-y);
glVertex2i(xc-y, yc-x);
glVertex2i(xc-x, yc+y);
glVertex2i(xc-y, yc+x);
glEnd();
}

该函数计算 x,y 坐标。

void bresenham_circle(int r)
{
int x = 0, y = r, dx;

plot_point(x, y, 0, 0);
dx = 3 - 2*r;

x += 1;
if(dx >= 0)
y -= 1;

while(x < y)
{
plot_point(x, y, 0, 0);
if(dx < 0)
dx += 4*x + 6;
else
dx += 4*(x-y) + 10;

if(dx >= 0)
y -= 1;
x += 1;
}

glFlush();
}

编辑:这是 main() 和 display() 函数:

void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 0.5, 0.0);

int radius = 8;
bresenham_circle(radius);
}

int main(int argc, char **argv)
{
glutInit(&argc,argv);
glutInitWindowPosition(0, 0);
glutInitWindowSize(640,480);
glutCreateWindow("Bresenham's Circle");
glClearColor(1.0, 1.0, .5, 1.0);
glutDisplayFunc(display);
glutMainLoop();

return 0;
}

我尝试绘制一些单点,即使在空间 [(-1, -1), (1, 1)] 中,但仍然什么也没有出现。

最佳答案

在我这边工作正常:

enter image description here

在放下圆形几何图形之前,请确保设置合理的投影/模型 View 矩阵+圆形半径(以及透明颜色/绘制颜色):

glClearColor( 0, 0, 0, 1 );
glClear(GL_COLOR_BUFFER_BIT);

glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho( -100, 100, -100, 100, -1, 1 );

glMatrixMode( GL_MODELVIEW );
glLoadIdentity();

glColor3ub( 255, 255, 255 );
bresenham_circle( 50 );

一起:

#include <GL/glut.h>

void plot_point( int x, int y, int xc, int yc )
{
glBegin( GL_POINTS );
glVertex2i( xc + x, yc + y );
glVertex2i( xc + x, yc - y );
glVertex2i( xc + y, yc + x );
glVertex2i( xc + y, yc - x );
glVertex2i( xc - x, yc - y );
glVertex2i( xc - y, yc - x );
glVertex2i( xc - x, yc + y );
glVertex2i( xc - y, yc + x );
glEnd();
}

void bresenham_circle( int r )
{
int x = 0, y = r, dx;

plot_point( x, y, 0, 0 );
dx = 3 - 2 * r;

x += 1;
if( dx >= 0 )
y -= 1;

while( x < y )
{
plot_point( x, y, 0, 0 );
if( dx < 0 )
dx += 4 * x + 6;
else
dx += 4 * ( x - y ) + 10;

if( dx >= 0 )
y -= 1;
x += 1;
}
}

void display()
{
glClearColor( 0, 0, 0, 1 );
glClear(GL_COLOR_BUFFER_BIT);

glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho( -100, 100, -100, 100, -1, 1 );

glMatrixMode( GL_MODELVIEW );
glLoadIdentity();

glColor3ub( 255, 255, 255 );
bresenham_circle( 50 );

glutSwapBuffers();
}

int main( int argc, char** argv )
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE );
glutCreateWindow( "GLUT" );
glutDisplayFunc( display );
glutMainLoop();
return 0;
}

关于c++ - Bresenham 画圆算法的实现有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58714138/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com