¿Atan() Siempre devuelve 0? (posible problema con la declaración de las varibles

Iniciado por carlmycol, 4 Abril 2013, 17:02 PM

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

carlmycol

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 (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <winbgim.h>
#include <math.h>
#include <windows.h>

#define blanco COLOR(255, 255, 255)
#define rojo COLOR(255, 0, 0)
#define radio 40
#define pi 3.1415
#define width 800
#define height 600
struct circulo {
    int x=0;
    int y=0; // Componentes del punto centro del círculo (x,y)
    int a=0; // Aceleración
    long double v=0; // Velocidad
    double ang; // En radianes
    int rad=0; //Radio del círculo

};

void dibujar_circulo(circulo objeto, HDC a);

COORD CursorPosition;

int main()
{

    circulo objeto;
    HDC a;
    float vx, vy;
    POINT mouse;
    bool help=true;
    int frames, i, tiempo, n;

    initwindow (800,600);
    objeto.x = radio;
    objeto.y = getmaxy()-radio;
    objeto.rad = radio;

    while (help)
    {
        cleardevice();
        dibujar_circulo(objeto, a);
        GetCursorPos(&mouse);
        setcolor(rojo);
        line(objeto.x, objeto.y, mouse.x, mouse.y);

        if (ismouseclick(WM_LBUTTONDOWN))
        {
            objeto.ang = atan(
                                (abs(- objeto.y + mouse.y))
                                     /
                                (abs( mouse.x - objeto.x))
                                    ) ;

            objeto.v = sqrt(pow((abs( - objeto.y + mouse.y)),2)+pow((abs(-mouse.x + objeto.x)),2))/1000;

            help=false;
            printf("%lu", objeto.ang);
        }

        delay(50);

    }
    delay(200);

    vy=sin(objeto.ang)*objeto.v;
    vx=cos(objeto.ang)*objeto.v;

    objeto.a=-(10);


    frames = (-vy/objeto.a);
    i=0;
    while(i>=0 && n!=2)
    {

        cleardevice();
        objeto.x=i+objeto.rad;
        objeto.y=tan(objeto.ang)*i - pow(i,2)*(
                                               objeto.a*( 1+pow(tan(objeto.ang),2) )/(2* pow(objeto.v,2))
                                                );
                                                objeto.y=height-objeto.y+objeto.rad;
        dibujar_circulo(objeto, a);
        if (i==0) n++;
        i++;
        delay(30);

    }







    getch();
    closegraph();
    return 0;
}


void dibujar_circulo(circulo objeto, HDC a)
{
    setcolor(blanco);
    setfillstyle(SOLID_FILL, blanco);


    circle(objeto.x, objeto.y, objeto.rad);
    a = GetWindowDC ( GetForegroundWindow () );
    FloodFill(a, objeto.x, objeto.y, blanco);
}


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

isseu

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/