elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema al graficar una función lineal (winbgim)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema al graficar una función lineal (winbgim)  (Leído 3,740 veces)
carlmycol

Desconectado Desconectado

Mensajes: 21



Ver Perfil
Problema al graficar una función lineal (winbgim)
« en: 9 Febrero 2013, 23:10 pm »

Bueno pues, inventando, como siempre, se me ocurrio hacer un programa que grafique una funcion lineal, peero, me llegó un problema extraño, no le veo la lógica, aún.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <winbgim.h>
  4. #include <math.h>
  5.  
  6. #define WIDTH 960
  7. #define HEIGHT 600
  8. #define PI 3.1415
  9.  
  10. int main()
  11. {
  12.    long long x, y, z;
  13.    initwindow(WIDTH, HEIGHT);
  14.  
  15.    setcolor(COLOR(157, 157, 157));
  16.  
  17.    line(WIDTH/2, 0, WIDTH/2, HEIGHT);
  18.    line(0, HEIGHT/2, WIDTH, HEIGHT/2);
  19.  
  20.    for (int i=0; i<=WIDTH; i++)
  21.    {
  22.        x = (i - WIDTH/2);
  23.        if (x!=0) y=x-2;
  24.        if (y<=0)
  25.        {
  26.            z=HEIGHT/2 + abs(y);
  27.        } if (y>0)
  28.        {
  29.            z = abs(HEIGHT/2 - y);
  30.        }
  31.        if (z<=HEIGHT && z>=0) putpixel(i, z, COLOR(255, 255, 255));
  32.        printf("f(%d) = %d\n", i, z); //el printf es para ver que pasa con esos valores o.0
  33.  
  34.    }
  35.  
  36.  
  37.    getch();
  38.    closegraph();
  39.    return 0;
  40. }

El problema es el siguiente:


WTF? Por qué pasa eso? 0.0
Casi parece una funcion de valor absoluto, pero no, en este caso es y=x-2, probé con y=2; y=40, es decir "y" constante y grafica perfectamente. ¿Por qué será? o.0

Hahahaha, si saben algo gracias, se me despejaría una gran duda


Saludos


En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Problema al graficar una función lineal (winbgim)
« Respuesta #1 en: 10 Febrero 2013, 19:31 pm »

¡Buenas!

No dibuja bien la grafica porque le estas dando mal las coordenadas.

Solo deberias de dibujar los puntos que cunplan que tanto i como HEIGHT/2 - y (o lo que es lo mismo HEIGHT/2 - i + WIDTH/2 + 2) esten dentro del area que has establecido para la grafica...

Si pones
Código
  1.            z = abs(HEIGHT/2 - y);
  2.  
e y es mayor que HEIGHT / 2 y la funcion es continua, la grafica evidentemente "rebotara" en la parte superior debido al valor absoluto...

decir que cuando y sea negativo z = HEIGHT/2 + abs(y); es lo mismo que hacer z = HEIGHT/2 - y, por lo tanto distinguir entre valores positivos y negativos te da lo mismo, ya que la formula para calcular la fila donde tienes que dibujar el punto va a ser la misma independientemente de si y es mayor o menor que cero.

Con estas correcciones, como ya te he dicho, solo tienes que asegurarte de que los valores de i y z entren dentro del area de la grafica...

¡Saludos!


En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
carlmycol

Desconectado Desconectado

Mensajes: 21



Ver Perfil
Re: Problema al graficar una función lineal (winbgim)
« Respuesta #2 en: 11 Febrero 2013, 02:37 am »

Hola! Muchas gracias por responder!

La verdad un no entiendo lo que me propones. Y aún no entiendo por qué sucede.

Con la función seno grafico sin problema alguno
Código
  1. ...
  2. ...
  3. #define WIDTH 720
  4. #define HEIGHT 600
  5. #define PI 3.1415
  6.  
  7. int main()
  8. {
  9.    float x, y;
  10.    int z;
  11.    initwindow(WIDTH, HEIGHT);
  12.  
  13.    setcolor(COLOR(157, 157, 157));
  14.  
  15.    line(WIDTH/2, 0, WIDTH/2, HEIGHT);
  16.    line(0, HEIGHT/2, WIDTH, HEIGHT/2);
  17.  
  18.    for (int i=0; i<=WIDTH; i++)
  19.    {
  20.        x = (i - (WIDTH/2));
  21.        y=sin((2*PI*x)/640)*50;
  22.        printf("f(%f) = %f\n", x, y);
  23.        if (y<=0)
  24.        {
  25.            z=HEIGHT/2 - y;
  26.        } if (y>=0)
  27.        {
  28.            z = abs(HEIGHT/2 - y);
  29.        }
  30.        if (z<HEIGHT && z>0 && i<WIDTH && i>0)
  31.        {
  32.            putpixel(i, z, COLOR(255, 255, 255));
  33.        }
  34.    }
  35.    getch();
  36.    closegraph();
  37.    return 0;
  38. }
  39.  

Al igual que con la funcion f(x)=b
Código
  1. ...
  2. ...
  3. #define WIDTH 720
  4. #define HEIGHT 600
  5. #define PI 3.1415
  6.  
  7. int main()
  8. {
  9.    float x, y;
  10.    int z;
  11.    initwindow(WIDTH, HEIGHT);
  12.  
  13.    setcolor(COLOR(157, 157, 157));
  14.  
  15.    line(WIDTH/2, 0, WIDTH/2, HEIGHT);
  16.    line(0, HEIGHT/2, WIDTH, HEIGHT/2);
  17.  
  18.    for (int i=0; i<=WIDTH; i++)
  19.    {
  20.        x = (i - (WIDTH/2));
  21.        //y=sin((2*PI*x)/640)*50;
  22.        y=-20;
  23.        printf("f(%f) = %f\n", x, y);
  24.        if (y<=0)
  25.        {
  26.            z=HEIGHT/2 - y;
  27.        } if (y>=0)
  28.        {
  29.            z = abs(HEIGHT/2 - y);
  30.        }
  31.        if (z<HEIGHT && z>0 && i<WIDTH && i>0)
  32.        {
  33.            putpixel(i, z, COLOR(255, 255, 255));
  34.        }
  35.    }
  36.    getch();
  37.    closegraph();
  38.    return 0;
  39. }
  40.  



Ví que se grafica perfectamente con una ventana de height=width... Pero...
¿Por qué sucede ese "rebote" del f(x)=x-2 que mostré al principio? O.o

Saludos
En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Problema al graficar una función lineal (winbgim)
« Respuesta #3 en: 11 Febrero 2013, 08:40 am »

¡Buenas!

Ya te he dicho que es lo que pasa. Te lo puedo explicar de otra forma.

Si quieres encajar el punto (x,f(x)) en el rectangulo que tienes solo tienes que dibujar el punto (x + WIDTH / 2 , f(x) - HEIGHT / 2), siempre y cuando este dentro del rectangulo.

Por cierto, deberias de dibujar tambien el segmento que une dos puntos consecutivos, ya que de lo contrario, si |f(i+1) - f(i)| > 1, en lugar de una linea obtendras dos puntos separados. Solo tienes que probar con la funcion y = k*x con |k| > 1 o con los puntos de la forma (r * cos(t), r * sen(t)) donde 0 < r < min(WIDTH / 2 , HEIGHT / 2) y los t forman una particion del intervalo [0,2*Pi], y veras que solo obtienes un monton de puntos, no una curva continua que los una.

¡Saludos!
« Última modificación: 11 Febrero 2013, 08:42 am por do-while » En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Busqueda lineal
Programación C/C++
javier210186 2 4,283 Último mensaje 5 Octubre 2011, 06:07 am
por javier210186
Ayuda - Dibujar Poligono Regular con Winbgim
Programación C/C++
alejandrosevenfold 0 1,973 Último mensaje 20 Septiembre 2012, 22:47 pm
por alejandrosevenfold
problema con las clases para graficar arreglos en torta y lineas
PHP
linda_alarcon 6 3,299 Último mensaje 21 Julio 2013, 15:02 pm
por z3nth10n
Ayuda, con problema ecuación lineal 3 incognitas
Programación C/C++
mr.ads 0 1,387 Último mensaje 16 Marzo 2016, 05:56 am
por mr.ads
control para graficar funcion matematica
Programación Visual Basic
horacio_b92 1 2,018 Último mensaje 29 Mayo 2017, 22:34 pm
por horacio_b92
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines