Principal | Gráficos 3D | Gráficos 2D | Fractales | Math | Códigos | Tutoriales | Links
Primero un poco de trigonometria básica
![]() |
donde tenemos las siguientes relaciones:
x = r cos a
y = r sin a
r = sqrt(x*x + y*y) (hipotenusa)
algunas relaciones trigonometricas utiles
sin(a-b) | sin a cos b - cos a sin b |
sin(a+b) | sin a cos b + cos a sin b |
cos(a-b) | cos a cos b + sin a sin b |
cos(a+b) | cos a cos b - sin a sin b |
Rotación de un punto P(x,y), en torno al origen y en sentido antihorario, donde c es el ángulo de rotación y P'(x',y'), es el punto despues de aplicarle la rotación.
![]() |
x = r cos a
y = r sin a
x' = r cos b
y' = r sin b
b = a + c
x' = r cos(a+c)
y' = r sin(a+c)
sustituyendo cos(a+c) y sin(a+c)
x' = r (cos a cos c - sin a sin c)
y' = r (sin a cos c + cos a sin c)
x' = r cos a cos c - r sin a sin c
y' = r sin a cos c + r cos a sin c
reemplazando por r cos a = x y r sin a = y, obtenemos finalmente las ecuaciones de rotación de un punto en el plano.
x' = x cos c - y sin c
y' = y cos c + x sin c
Codificación en C, esta función toma los siguientes parametros:
void rotacion(float x, float y, float *rx, float *ry, float angulo) { angulo = (PI*angulo)/180.0; *rx = x*cos(angulo) - y*sin(angulo); *ry = x*sin(angulo) + y*cos(angulo); } |
tambien se puede expresar todo esto en forma de una matriz de 2x2 Rot(c):
| cos(c) sin(c) | | -sin(c) cos(c) |
aplicando Rot(c) a un punto |x, y|, se obtiene el punto transformado |x', y'|
|x', y'| = |x, y| * | cos(c) sin(c) | | -sin(c) cos(c) | |x', y'| = |x*cos(c) - y*sin(c), x*sin(c) + y*cos(c)| donde x' = x*cos(c) - y*sin(c) y' = x*sin(c) + y*cos(c)
Salida del programa a 640x480, en blanco el objeto original, en amarillo luego de aplicarle una rotación de 45 grados.
![]() |
El código lo compile con BorlandC++ 3.1, utilizando las librerias BGI.
#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <math.h> #define PI 3.141592654 struct punto_f { float x; float y; }; struct punto_d { int x; int y; }; float xmin = -2.0, ymin=-2.0, xmax=2.0, ymax=2.0; int MaxX, MaxY, right, left; void escala(float x, float y, int *px, int*py) { float deltax, deltay; deltax = MaxY/(xmax - xmin); deltay = MaxY/(ymax - ymin); *px = (int)(deltax*(x-xmin) + right); *py = MaxY - (int)(deltay*(y-ymin)); } void rotacion(float x, float y, float *rx, float *ry, float angulo) { angulo = (PI*angulo)/180.0; *rx = x*cos(angulo) - y*sin(angulo); *ry = x*sin(angulo) + y*cos(angulo); } void dibujar_ejes(void) { int sx1, sy1, sx2, sy2; setcolor(GREEN); escala(xmin, 0.0, &sx1, &sy1); escala(xmax, 0.0, &sx2, &sy2); line(sx1, sy1, sx2, sy2); escala(0.0, ymin, &sx1, &sy1); escala(0.0, ymax, &sx2, &sy2); line(sx1, sy1, sx2, sy2); } int main(void) { punto_f pts[4], rot_pts[4]; punto_d tmp_pts[4]; int i; /* request auto detection */ int gdriver = DETECT, gmode, errorcode; /* inicializa el modo grafico */ initgraph(&gdriver, &gmode, ""); /* lee el resultado de la inicializacion */ errorcode = graphresult(); if (errorcode != grOk) /* si ocurrio un error */ { printf("Graphics error: %s\n", grapherrormsg(errorcode)); printf("Press any key to halt:"); getch(); exit(1); /* retorna el codigo de error */ }; MaxX=getmaxx(); MaxY=getmaxy(); right=(MaxX-MaxY)/2; left=MaxX-right; dibujar_ejes(); //puntos originales del poligono pts[0].x=-1.0; pts[0].y=-1.0; pts[1].x= 0.0; pts[1].y= 1.4142; pts[2].x= 1.0; pts[2].y=-1.0; pts[3].x=-1.0; pts[3].y=-1.0; setcolor(WHITE); //dibujo un poligono de tres lados for (i=0; i<4; i++) escala(pts[i].x, pts[i].y, &tmp_pts[i].x, &tmp_pts[i].y); moveto(tmp_pts[0].x, tmp_pts[0].y); lineto(tmp_pts[1].x, tmp_pts[1].y); lineto(tmp_pts[2].x, tmp_pts[2].y); lineto(tmp_pts[3].x, tmp_pts[3].y); setcolor(YELLOW); //lo roto 45 grados for (i=0; i<4; i++) { rotacion(pts[i].x, pts[i].y, &rot_pts[i].x, &rot_pts[i].y, 45 .0); escala(rot_pts[i].x, rot_pts[i].y, &tmp_pts[i].x, &tmp_pts[i].y); } moveto(tmp_pts[0].x, tmp_pts[0].y); lineto(tmp_pts[1].x, tmp_pts[1].y); lineto(tmp_pts[2].x, tmp_pts[2].y); lineto(tmp_pts[3].x, tmp_pts[3].y); getch(); closegraph(); return 0; } |
valcoey@hotmail.com
Ramiro Alcocer, 2001
Principal | Gráficos 3D | Gráficos 2D | Fractales | Math | Códigos | Tutoriales | Links