Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: m@o_614 en 12 Noviembre 2012, 20:50 PM

Título: Programa de Gráficas
Publicado por: m@o_614 en 12 Noviembre 2012, 20:50 PM
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
Título: Re: Programa de Gráficas
Publicado por: Ferno en 12 Noviembre 2012, 22:59 PM
Tan solo borra el '\n' del scanf que lee "Hasta qué número quieres calcular?"

Salú!
Título: Re: Programa de Gráficas
Publicado por: m@o_614 en 13 Noviembre 2012, 23:14 PM
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);
}
Título: Re: Programa de Gráficas
Publicado por: Ferno en 14 Noviembre 2012, 13:26 PM
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
Título: Re: Programa de Gráficas
Publicado por: m@o_614 en 18 Noviembre 2012, 05:19 AM
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);
}
Título: Re: Programa de Gráficas
Publicado por: Ferno en 18 Noviembre 2012, 19:03 PM
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?