Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Rotacion con radianes

Estas en el tema de Rotacion con radianes en el foro de C/C++ en Foros del Web. hola quisiera saber como puedo rotar un cuadrado en dev c++ graphics ya hice que el angulo se transformara a radianes pero las formulas no ...
  #1 (permalink)  
Antiguo 04/05/2015, 21:21
 
Fecha de Ingreso: mayo-2015
Mensajes: 3
Antigüedad: 8 años, 11 meses
Puntos: 0
Rotacion con radianes

hola quisiera saber como puedo rotar un cuadrado en dev c++ graphics ya hice que el angulo se transformara a radianes pero las formulas no me salen para rotar todos los puntos si me hecharan la mano se los agradeceria esto es lo que llevo hasta ahora

#include<math.h>
#include<iostream>
#include<winbgim.h>
using namespace std;
int main(){
int gd = DETECT, gm;
initgraph(&gd, &gm, "C:\\TC\\BGI");
int linea=50;
line(50,250,550,250);
line(300,0,300,500);
for(int contador=0;contador<=50;contador++){
line(linea,240,linea,260);
linea+=10;
}
linea=0;
for(int contador=0;contador<=50;contador++){
line(290,linea,310,linea);
linea+=10;
}
int prueba;
float x,y,angulo;
float pi=3.1416;
const float conv=pi/180;
cout<<"Introduce la coordenada x:";
cin>>x;
cout<<"Introduce la coordenada y:";
cin>>y;
cout<<"introduce el angulo:";
cin>>angulo;
//cuadrado frontal
line(int(x+25) + int(50*cos((angulo+67.5)*conv)),y+25,x+25,(y-75)+ int(50*sin((angulo)*conv)));
line(x-25,y+25,x-25,y-25);
line(x+25,y+25,x-25,y+25);
line(x+25,y-25,x-25,y-25);
//cuadrado trasero
line(x,y,x+50,y);
line(x,y,x,y-50);
line(x+50,y-50,x,y-50);
line(x+50,y-50,x+50,y);
//diagonales
line(x,y,x-25,y+25);
line(x+50,y,x+25,y+25);
line(x-25,y-25,x,y-50);
line(x+25,y-25,x+50,y-50);
prueba=(y-75)+ int(50*sin((angulo+67.5)*conv));
cout<<prueba;
getch();
return 0;
}
  #2 (permalink)  
Antiguo 05/05/2015, 11:29
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 10 meses
Puntos: 73
Respuesta: Rotacion con radianes

La cosa es tan sencilla como trabajar en coordenadas polares.

En coordenadas cartesianas, como ya sabes, la posición de un punto viene dada por su distancia a un eje vertical (abscisa, X) y su distancia a un eje horizontal (ordenada, Y).

En coordenadas polares, la posición de un punto viene dada por su distancia al origen de coordenadas, y por el ángulo que forma con el eje horizontal el segmento que une el origen de coordenadas con el punto.

Es decir, en coordenadas cartesianas el punto viene dado por un par (x,y), y en polares por un par (r,A) (siendo A el ángulo).

El paso de una a otra es simple:

r = sqrt(x^2 + y^2)
A = arctan (y/x)

x = r * cos(A)
y = r * sin(A)

Para la rotación, es mucho más cómodo el empleo de las coordenadas polares: Basta con cambiar el ángulo y recalcular X e Y.

En tu caso, para el cuadrado, el proceso sería:
1. Guardar las posiciones de los vértices
2. Borrar el cuadrado actual
3. Recalcular las nuevas posiciones de los vértices
4. Dibujar de nuevo el cuadrado

Tendrás que tener en cuenta que:
- El origen de coordenadas no va a estar en la posición (0,0) de la pantalla.
- La posición (0,0) corresponde a la esquina superior izquierda de la pantalla. La horizontal crece de izquierda a derecha (normal), pero la vertical crece de arriba hacia abajo (al contrario de lo que es normal).

Debes tener en cuenta en dónde queda el ángulo real, en función de los valores de X e Y.
  #3 (permalink)  
Antiguo 07/05/2015, 09:39
 
Fecha de Ingreso: mayo-2015
Mensajes: 3
Antigüedad: 8 años, 11 meses
Puntos: 0
Respuesta: Rotacion con radianes

Vaya, eres genial, muchas gracias :D
  #4 (permalink)  
Antiguo 18/05/2015, 02:13
 
Fecha de Ingreso: mayo-2015
Mensajes: 3
Antigüedad: 8 años, 11 meses
Puntos: 0
Respuesta: Rotacion con radianes

He intentado hacer lo que me dices pero no me ha dado resultado puedes darme un ejemplo de las coordenadas polares y como aplicarlas en mi codigo? xD me seria de gran ayuda
  #5 (permalink)  
Antiguo 20/05/2015, 10:05
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 10 meses
Puntos: 73
Respuesta: Rotacion con radianes

Supongamos que tengo un punto P en las coordenadas (6,3), es decir, P(6,3).
Para sus coordenadas polares (pongo los ángulos en grados), tenemos:

r = sqrt(x^2+y^2) = sqrt(6^2+3^2) = sqrt(36+9) = sqrt(45) = 6.708
A = atan(y/x) = atan(3/6) = atan(0.5) = 26.565

es decir, las coordenadas polares de ese punto son un segmento de longitud 6.708 y un ángulo respecto del eje horizontal de 26.565 grados, o sea, P(6.708,26.565).

Supongamos que quiero girarlo un ángulo de 30 grados en sentido contrario a las agujas del reloj (por convenio, este es el sentido positivo de giro). El nuevo ángulo será:

B = A+30 = 56.565

Las nuevas coordenadas polares de P serán P(6.708, 56.565).
Pasando a cartesianas:

x = r*cos(B) = 6.708*cos(56.565) = 3.696
y = r*sin(B) = 6.708*sin(56.565) = 5.598

En coordenadas cartesianas, tenemos P(3.696, 5.598).

Estos cálculos están hechos, lógicamente, con números en coma flotante. Para pasar a coordenadas en la pantalla, tienes que pasarlos a entero con el redondeo que corresponda. También, como ya te dije, tienes que tener en cuenta que el punto (0,0) de la pantalla es la esquina superior izquierda, con lo que las coordenadas horizontales crecen de izquierda a derecha (normal), pero las verticales crecen de arriba hacia abajo (al contrario de lo normal), con lo que tendrás que recalcular las coordenadas verticales de lo que vayas a trazar. También debes tener en cuenta la traslación del origen de coordenadas, si no lo vas a tener en la esquina superior izquierda (o inferior izquierda si aplicas la inversión del eje vertical). Haz todos los cálculos en coma flotante (float o double), a las constantes que utilices añádeles un punto decimal para forzar a que te las evalúe como números en coma flotante (si no, en alguna ocasión podría aplivcar aritmética entera y trastocarte por completo el resultado).

Etiquetas: char, int, rotacion
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:06.