Programa de Gráficas

Iniciado por m@o_614, 12 Noviembre 2012, 20:50 PM

0 Miembros y 1 Visitante están viendo este tema.

m@o_614

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

Ferno

Tan solo borra el '\n' del scanf que lee "Hasta qué número quieres calcular?"

Salú!

m@o_614

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);
}

Ferno

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

m@o_614

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);
}

Ferno

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?