Saludos
Estoy haciendo un programa de gráficas que me tiene que dar las coordenadas de una recta, un circulo y un elipse, aún no lo he terminado porque el programa compila pero cuando entra al ciclo do-while se congela y no hace nada, no se por qué
#include <stdio.h>
#include <stdlib.h>
void dibujar_recta();
int main()
{
int opcion;
printf("Graficas por Computadora\n");
printf("Dibujo primitivas 2D\n");
printf("Que desea hacer?\n");
printf("1)Linea\n");
printf("2)Circulo\n");
printf("3)Elipse\n");
scanf("%d",&opcion);
switch(opcion)
{
case 1:
dibujar_recta();
break;
case 2://todavia me falta esta parte
break;
case 3://todavia me falta esta parte
break;
default:
printf("Opcion no valida\n");
}
return 0;
}
void dibujar_recta()
{
int pi_x,pf_x,pi_y,pf_y,m,inc_x,inc_y,Pk=0,inc_y2,inc_x2,k,num,Xk,Yk;
printf("Dame el punto inicial(x,y):\n");
scanf("%d%d",&pi_x,&pi_y);
printf("Dame el punto final(x,y):\n");
scanf("%d%d",&pf_x,&pf_y);
system("cls");
m = (pf_y-pi_y)/(pf_x-pi_x);
printf("pixel inicial = (%d,%d)\n",pi_x,pi_y);
inc_x = pf_x-pi_x;
inc_y = pf_y-pi_y;
inc_y2 = 2*inc_y;
inc_x2 = 2*inc_x;
printf("%cx = %d\n",30,inc_x);
printf("%cy = %d\n",30,inc_y);
printf("2%cy = %d\n",30,inc_y2);
printf("2%cy - 2%cx = %d - %d = %d\n",30,30,inc_y2,inc_x2,inc_y2-inc_x2);
Pk = 2*inc_y-inc_x;
printf("Pk = 2%cy - %cx = %d - %d = %d\n\n",30,30,inc_y2,inc_x,Pk);
Xk = pi_x;
Yk = pi_y;
printf("Hasta que numero quieres calcular?\n");
scanf("%d\n",&num);
printf("K\tPk\t(Xk+1,Yk+1)\n");
k=0;
do
{
printf("%d\t%d",k,Pk);
if(Pk>=0)
{
Pk = Pk+inc_y2-inc_x2;
Xk++;
Yk++;
}
else
{
Pk = Pk+inc_y2;
Xk++;
}
printf("(%d,%d)\n",Xk,Yk);
k++;
}while(k<=num);
}
de antemano gracias
Tan solo borra el '\n' del scanf que lee "Hasta qué número quieres calcular?"
Salú!
Muchas gracias Ferno por tu respuesta
una última duda ya estoy empezando con la función para sacar las coordenadas del círculo pero tengo un problema a la hora de calcular Po, que en vez de iterar de positivo a negativo siempre me da números negativos y no entiendo por qué
void dibujar_circulo()
{
int r,xc,yc,Po,k,x0,y0;
printf("Dame el radio:\n");
scanf("%d",&r);
printf("Dame las coordenadas de centro:\n");
scanf("%d%d",&xc,&yc);
Po = 1-r;
x0 = 0;
y0 = r;
printf("\n(Xo,Yo) = (%d,%d)\n",x0,y0);
printf("\nPo = 1 - %d = %d\n\n",r,Po);
printf("K\tPk\t(Xk+1,Yk+1)\t2Xk+1\t2Yk+1\n");
k=0;
do
{
printf("%d\t%d\t",k,Po);
if(Po>=0)
{
Po = Po+(2*x0)+1;
x0++;
y0--;
}
else
{
Po = Po+(2*x0)+1-(2*y0);
x0++;
}
printf("(%d,%d)\t\t%d\t%d\n",x0,y0,2*x0,2*y0);
k++;
}while(y0>=x0);
}
El problema es meramente de análisis matemático. No creo que haya problemas en el code. Primero corroborá que las fórmulas en el code estén bien escritas.
La verdad no entiendo bien a qué hacer referencia Po ni las fórmulas que escribiste para dibujar las coordenadas.
Yo creo que con la fórmula original de la circunferencia (x^2 + y^2 = R, con R = Radio) sale más sencillo :P
saludos
ya se en que estaba mal es que tenia las fórmulas al reves cuando Po>=0 o es menor ;D pero ahora que estoy empezando la función de dibujar_elipse me aparece el siguiente error:
called object is not a function en la última línea
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void dibujar_recta();
void dibujar_circulo();
void dibujar_elipse();
int main()
{
int opcion;
printf("Graficas por Computadora\n");
printf("Dibujo primitivas 2D\n");
printf("Que desea dibujar?\n");
printf("1)Linea\n");
printf("2)Circulo\n");
printf("3)Elipse\n");
scanf("%d",&opcion);
switch(opcion)
{
case 1:
dibujar_recta();
break;
case 2:
dibujar_circulo();
break;
case 3:
dibujar_elipse();
break;
default:
printf("Opcion no valida\n");
}
return 0;
}
void dibujar_recta()
{
int pi_x,pf_x,pi_y,pf_y,m,inc_x,inc_y,Pk=0,inc_y2,inc_x2,k,num,Xk,Yk;
printf("***Metodo de Bresenham***\n");
printf("Dame el punto inicial(x,y):\n");
scanf("%d%d",&pi_x,&pi_y);
printf("Dame el punto final(x,y):\n");
scanf("%d%d",&pf_x,&pf_y);
system("cls");
m = (pf_y-pi_y)/(pf_x-pi_x);
printf("pixel inicial = (%d,%d)\n",pi_x,pi_y);
inc_x = pf_x-pi_x;
inc_y = pf_y-pi_y;
inc_y2 = 2*inc_y;
inc_x2 = 2*inc_x;
printf("%cx = %d\n",30,inc_x);
printf("%cy = %d\n",30,inc_y);
printf("2%cy = %d\n",30,inc_y2);
printf("2%cy - 2%cx = %d - %d = %d\n",30,30,inc_y2,inc_x2,inc_y2-inc_x2);
Pk = 2*inc_y-inc_x;
printf("Pk = 2%cy - %cx = %d - %d = %d\n\n",30,30,inc_y2,inc_x,Pk);
Xk = pi_x;
Yk = pi_y;
printf("Hasta que numero quieres calcular?\n");
scanf("%d",&num);
printf("K\tPk\t(Xk+1,Yk+1)\n");
k=0;
do
{
printf("%d\t%d\t",k,Pk);
if(Pk>=0)
{
Pk = Pk+inc_y2-inc_x2;
Xk++;
Yk++;
}
else
{
Pk = Pk+inc_y2;
Xk++;
}
printf("(%d,%d)\n",Xk,Yk);
k++;
}while(k<=num);
}
void dibujar_circulo()
{
int r,xc,yc,Po,k,x0,y0;
printf("Dame el radio:\n");
scanf("%d",&r);
printf("Dame las coordenadas de centro:\n");
scanf("%d%d",&xc,&yc);
Po = 1-r;
x0 = 0;
y0 = r;
printf("\n(Xo,Yo) = (%d,%d)\n",x0,y0);
printf("\nPo = 1 - %d = %d\n\n",r,Po);
printf("K\tPk\t(Xk+1,Yk+1)\t2Xk+1\t2Yk+1\n");
k=0;
do
{
printf("%d\t%d\t",k,Po);
if(Po>=0)
{
x0++;
y0--;
Po = Po+((2*x0)+1)-(2*y0);
}
else
{
x0++;
Po = Po+(2*x0)+1;
}
printf("(%d,%d)\t\t%d\t%d\n",x0,y0,2*x0,2*y0);
k++;
}while(y0>=x0);
}
void dibujar_elipse()
{
int x0,y0,rx,ry,P1o,ry_pot,rx_pot;
printf("***Metodo del punto medio***\n");
printf("Dame las coordenadas del centro:\n");
scanf("%d%d",&x0,&y0);
printf("Dame los radios rx, ry:\n");
scanf("%d%d",&rx,&ry);
printf("\n(Xo,Yo) = (0,Ry) = (0,%d)\n\n",ry);
ry_pot = pow(ry,2);
rx_pot = pow(rx,2);
P1o = (ry_pot)-(rx_pot)(ry)+rx_pot/4;
printf("P1o = %d\n",P1o);
}
No estoy seguro a qué hace referencia, pero lo que si estoy seguro es que tenés que agregar el comando "-lm" al FINAL del comando para poder compilar correctamente, en este caso, la función "pow".
¿Compilás por consola o desde algún IDE?