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
#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