Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: carlmycol en 4 Abril 2013, 17:02 pm



Título: ¿Atan() Siempre devuelve 0? (posible problema con la declaración de las varibles
Publicado por: carlmycol 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


Título: Re: ¿Atan() Siempre devuelve 0? (posible problema con la declaración de las varibles
Publicado por: isseu 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 (http://en.wikipedia.org/wiki/Atan2)
En c++: http://www.cplusplus.com/reference/cmath/atan2/ (http://www.cplusplus.com/reference/cmath/atan2/)