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

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ¿Atan() Siempre devuelve 0? (posible problema con la declaración de las varibles
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ¿Atan() Siempre devuelve 0? (posible problema con la declaración de las varibles  (Leído 2,131 veces)
carlmycol

Desconectado Desconectado

Mensajes: 21



Ver Perfil
¿Atan() Siempre devuelve 0? (posible problema con la declaración de las varibles
« en: 4 Abril 2013, 17:02 pm »

Buenos tardes,

Desde hace algunos días en mi tiempo libre me he puesto a programar un simulador (excesivamente simple) de movimiento parabólico, les cuento, yo dibujo un círculo y una linea, desde el centro del círculo hasta las coordenadas del mouse, para así cuando se reciba un click obtener la pendiente de la recta y aplicando la tangente inversa, el ángulo, sin embargo no he podido obtener el ángulo, he revisado mi código por esos lares y he investigado, el cociente es perfecto (al menos eso asumo, por lo menos congruente es), no veo la razón por la que atan() me devuelve un ángulo 0, si tengo entendido que si la tangente es 0 <==> el angulo es 0. (por qué 466/399 devolvería cero?)

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <winbgim.h>
  4. #include <math.h>
  5. #include <windows.h>
  6.  
  7. #define blanco COLOR(255, 255, 255)
  8. #define rojo COLOR(255, 0, 0)
  9. #define radio 40
  10. #define pi 3.1415
  11. #define width 800
  12. #define height 600
  13. struct circulo {
  14.    int x=0;
  15.    int y=0; // Componentes del punto centro del círculo (x,y)
  16.    int a=0; // Aceleración
  17.    long double v=0; // Velocidad
  18.    double ang; // En radianes
  19.    int rad=0; //Radio del círculo
  20.  
  21. };
  22.  
  23. void dibujar_circulo(circulo objeto, HDC a);
  24.  
  25. COORD CursorPosition;
  26.  
  27. int main()
  28. {
  29.  
  30.    circulo objeto;
  31.    HDC a;
  32.    float vx, vy;
  33.    POINT mouse;
  34.    bool help=true;
  35.    int frames, i, tiempo, n;
  36.  
  37.    initwindow (800,600);
  38.    objeto.x = radio;
  39.    objeto.y = getmaxy()-radio;
  40.    objeto.rad = radio;
  41.  
  42.    while (help)
  43.    {
  44.        cleardevice();
  45.        dibujar_circulo(objeto, a);
  46.        GetCursorPos(&mouse);
  47.        setcolor(rojo);
  48.        line(objeto.x, objeto.y, mouse.x, mouse.y);
  49.  
  50.        if (ismouseclick(WM_LBUTTONDOWN))
  51.        {
  52.            objeto.ang = atan(
  53.                                (abs(- objeto.y + mouse.y))
  54.                                     /
  55.                                (abs( mouse.x - objeto.x))
  56.                                    ) ;
  57.  
  58.            objeto.v = sqrt(pow((abs( - objeto.y + mouse.y)),2)+pow((abs(-mouse.x + objeto.x)),2))/1000;
  59.  
  60.            help=false;
  61.            printf("%lu", objeto.ang);
  62.        }
  63.  
  64.        delay(50);
  65.  
  66.    }
  67.    delay(200);
  68.  
  69.    vy=sin(objeto.ang)*objeto.v;
  70.    vx=cos(objeto.ang)*objeto.v;
  71.  
  72.    objeto.a=-(10);
  73.  
  74.  
  75.    frames = (-vy/objeto.a);
  76.    i=0;
  77.    while(i>=0 && n!=2)
  78.    {
  79.  
  80.        cleardevice();
  81.        objeto.x=i+objeto.rad;
  82.        objeto.y=tan(objeto.ang)*i - pow(i,2)*(
  83.                                               objeto.a*( 1+pow(tan(objeto.ang),2) )/(2* pow(objeto.v,2))
  84.                                                );
  85.                                                objeto.y=height-objeto.y+objeto.rad;
  86.        dibujar_circulo(objeto, a);
  87.        if (i==0) n++;
  88.        i++;
  89.        delay(30);
  90.  
  91.    }
  92.  
  93.  
  94.  
  95.  
  96.  
  97.  
  98.  
  99.    getch();
  100.    closegraph();
  101.    return 0;
  102. }
  103.  
  104.  
  105. void dibujar_circulo(circulo objeto, HDC a)
  106. {
  107.    setcolor(blanco);
  108.    setfillstyle(SOLID_FILL, blanco);
  109.  
  110.  
  111.    circle(objeto.x, objeto.y, objeto.rad);
  112.    a = GetWindowDC ( GetForegroundWindow () );
  113.    FloodFill(a, objeto.x, objeto.y, blanco);
  114. }
  115.  

No presten atención al código basura que hay debajo, estaba probando si era algun error del algoritmo de la animación, pero no, luego de revisar me di cuenta que objeto.ang siempre es igual a 0

Sospecho que es en la declaración "double ang", quizás debería ser long, he probado pero no encuentro solución

Muchas gracias de antemano!

Saludos


En línea

isseu


Desconectado Desconectado

Mensajes: 325


°º¤ø,¸¸,El conocimiento es poder°º¤ø,¸¸,ø¤º°`°º¤ø,


Ver Perfil WWW
Re: ¿Atan() Siempre devuelve 0? (posible problema con la declaración de las varibles
« Respuesta #1 en: 4 Abril 2013, 17:49 pm »

No revise mucho el código, no tengo mucho tiempo pero te respondo por el tweet que me mandaste.
Creo que el problema es que usas tan(), deberías usar tan2():

Wikipeda: http://en.wikipedia.org/wiki/Atan2
En c++: http://www.cplusplus.com/reference/cmath/atan2/


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines