gpt4 book ai didi

c - 为什么这条布雷森汉姆线没有出现在它应该出现的地方?

转载 作者:行者123 更新时间:2023-11-30 18:08:03 25 4
gpt4 key购买 nike

我正在编写一个类似 MS 绘画的应用程序(不允许我使用 opengl 原语)。到目前为止,它只绘制线和点。我不明白为什么在单击时渲染单个点时,此代码根据 renderPoint 函数的转换将其打印在应该的位置:

void renderPoint(double x, double y)
{
W = glutGet(GLUT_WINDOW_WIDTH);
H = glutGet(GLUT_WINDOW_HEIGHT);

float X;
float Y;
glBegin (GL_POINTS);
X = (2*x/W) - 1;
Y = (-2*y/H) + 1;
glVertex2f (X, Y);
glEnd ();
glFlush ();

}

在 bresenham 函数内部调用时,它无法正确绘制(我相信这是正确的,因为我从 the article in wikipedia 逐行实现了它)。我在转换过程中做错了什么吗?

#include "GL/glut.h"

#include <stdio.h>
#include <math.h>
int i;

int mainWindow, subWindow;
int X1, Y1, X2, Y2;
int W = 320, H = 320;
void menuApp (int value)
{
if (value == 1) printf("Linea\n");
if (value == 2) printf("Circulo\n");
if (value == 3) printf("Elipsis\n");
if (value == 4) exit(0);

}

void crearMenu()
{
//inicio Creando el menu
int submenu;
submenu = glutCreateMenu(menuApp);
glutAddMenuEntry("Linea", 1);

glutAddMenuEntry("Elipse",3);
glutAddMenuEntry("Salir",4);
glutCreateMenu(menuApp);
glutAddSubMenu("SubMenu", submenu);
glutAttachMenu(GLUT_RIGHT_BUTTON);

//fin Creando el menu
}

void renderPoint(void) /*REVISAR ESTO*/
{
glClear (GL_COLOR_BUFFER_BIT);
glBegin (GL_POINTS);
glVertex2f (-0.98, 0.98);
glEnd ();
glFlush ();
}





void renderPoint(double x, double y)
{
W = glutGet(GLUT_WINDOW_WIDTH);
H = glutGet(GLUT_WINDOW_HEIGHT);

float X;
float Y;
glBegin (GL_POINTS);
X = (2*x/W) - 1;
Y = (-2*y/H) + 1;
glVertex2f (X, Y);
glEnd ();
glFlush ();

}

/*wiki pseudo:

function line(x0, x1, y0, y1) //x1
boolean steep := abs(y1 - y0) > abs(x1 - x0)//x2
if steep then//x3
swap(x0, y0) //x4
swap(x1, y1) //x5
if x0 > x1 then //x6
swap(x0, x1) //x7
swap(y0, y1) //x8
int deltax := x1 - x0 //x9
int deltay := abs(y1 - y0) //x10
int error := deltax / 2 //x11
int ystep //x12
int y := y0 //x13
if y0 < y1 then ystep := 1 else ystep := -1 //x14
for x from x0 to x1 //x15
if steep then plot(y,x) else plot(x,y) //x16
error := error - deltay //x17
if error < 0 then //x18
y := y + ystep //x19
error := error + deltax //x20
*/


void bresenham1(GLint x0, GLint y0, GLint x1, GLint y1) //function line(x0, x1, y0, y1)
{


//double result1 = fabs((double)y1 - y0); //abs(y1 - y0)
//double result2 = fabs((double)x1 - x0); //abs(x1 - x0)


int result1 = abs(y1-y0);
int result2 = abs(x1-x0);

bool steep = (result1 > result2); //boolean steep := abs(y1 - y0) > abs(x1 - x0)

if (steep){ //if steep then

GLint aux1 = x0; //swap(x0, y0)
x0=y0;
y0 = aux1;

GLint aux2 = x1; // swap (x1,y1)
x1=y1;
y1=aux2;

}

if(x0>x1){ // if (x0>x1)
GLint aux3=x0; //swap(x0,x1)
x0=x1;
x1=aux3;

GLint aux4=y0;//swap(y0,y1)
y0=y1;
y1=aux4;

}

int deltax = x1-x0; // deltax = x1-x0
int deltay = abs(y1-y0); // int deltay := abs(y1 - y0) - revisar
int error = (deltax / 2); //int error := deltax / 2
int ystep; // int ystep

int y = y0; //int y := y0

if (y0<y1){ //if y0 < y1 then ystep := 1 else ystep := -1

ystep=1;

}

else {ystep=-1;}

for (int x=x0; x<=x1; x++){ //for x from x0 to x1
if (steep){ // if steep then plot(y,x) else plot(x,y)

renderPoint(y,x);
}
else {

renderPoint(x,y);
}

error = error - deltay; //error := error - deltay

if (error<0) { //if error < 0 then
y = y + ystep; // y := y + ystep
error = error + deltax; //error := error + deltax

} // end if (error<0)


}// end for from x0 to x1


}// end bresenham










void renderAll (void)
{
glutSetWindow(mainWindow);
glutPostRedisplay();
glutSetWindow(subWindow);
glutPostRedisplay();
}

void movimiento(int boton, int estado, int x, int y)
{
if((estado == GLUT_DOWN) && (boton == GLUT_LEFT_BUTTON))//mouse down
{
X1 = x; Y1 = y;
//printf("Down| x:%d, y:%d\n",x,y);

renderPoint(x,y);
}
if((estado == GLUT_UP) && (boton == GLUT_LEFT_BUTTON))//mouse up
{
//printf(" Up|x:%d, y:%d\n",x,y);
X2 = x; Y2 = y;
//renderLine();
bresenham1(X1,X2,Y1,Y2);
//renderPoint(x, y);
}
}

void MouseMove(int x, int y)
{
//printf("x:%d | y:%d\n", x,y);
X2 = x; Y2 = y;
//renderLine();
//bresenham1(X1, Y1, X2, Y2);
}

void teclado(unsigned char key, int x, int y)
{
if(key == 27)exit(0);
}

void especiales(int key, int x, int y)
{
if(key == GLUT_KEY_F1) exit(0);
}

static void
key(unsigned char k, int x, int y)
{
switch (k) {
case 27: /* Escape */
exit(0);
break;
default:
return;
}
glutPostRedisplay();
}

int main (int argc, char *argv [])
{
i = 0;
//inicializa las operaciones de OpenGL/GLUT, db cr antes de usar funciones GLUT
glutInit (&argc, argv);

glutInitDisplayMode (GLUT_SINGLE | GLUT_RGBA);
glutInitWindowPosition (100, 100);
glutInitWindowSize (W, H);
//Crea una ventana de Opengl
glutCreateWindow ("tarea");
glutDisplayFunc (renderPoint);
glutMouseFunc(movimiento);
glutKeyboardFunc(teclado);//teclas ASCII
glutSpecialFunc(especiales);//captura las teclas [f1..f12]

//glutPassiveMotionFunc(pasivo);
glutKeyboardFunc(key);
glutMotionFunc(MouseMove);
crearMenu();
glutMainLoop ();


}

最佳答案

问题在于 bresenham1 被调用错误:

bresenham1(X1,X2,Y1,Y2);

应该是:

bresenham1(X1,Y1,X2,Y2);

关于c - 为什么这条布雷森汉姆线没有出现在它应该出现的地方?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3937735/

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