Hola:
Probablemente ya conozcas esta página, la
efg's, allí puedes encontrar toda clase de rutinas gráficas, ejemplos, programas de descarga ..., suelen ser de propósito general, aunque no será muy difícil adaptarlo a DirectX, hay secciones donde explica lo de las rotaciones y demás.
En castellano no me suena ninguna.
Bueno, esta función rota un punto el ángulo que se le pasa (ángulo en radianes):
Código:
funcion RotatePoint (APoint: TPoint; angle: single) : TPoint;
begin
result.x := APoint.x * Cos(Angle) - APoint.y * Sin(Angle);
result.y := APoint.x * Sin(Angle) + APoint.y * Cos(Angle);
end;
Aplicada a los cuatro vértices de un cuadrado, ya lo tienes rotado. Por cierto, este ejemplo llama dos veces a la función
Cos y dos veces a
Sin que están en la unit
math.pas. Puesto que se les pasa el mismo ángulo (Angle), es más rápido utilizar la funcion
SinCos que calcula seno y coseno de golpe y más rápido, le tendrías que pasar dos variables por referencia donde obtendrías esos valores. En el ejemplo te lo he puesto así, sin optimizar, pero no es muy complicado hacer el cambio.
Una vez optimizado, podrías también crearte una función donde le pasaras un
array of TPoint y te lo devolviera ya rotado, sólo harías el cálculo de los senos y cosenos 1 vez, y te serviría para pasarle triángulos, cuadrados ...
¡Ah! Se me olvidaba, la función que te he puesto arriba rota un punto respecto al origen (punto (0, 0)); para rotar respecto de cualquier punto -muchas veces querrás rotar respecto al centro de la figura-, sería así:
Código:
funcion RotatePoint (APoint, FromPoint: TPoint; angle: single) : TPoint;
var
dx, dy: Integer;
begin
dx := APoint.x - FromPoint.x;
dy := APoint.y - FromPoint.y;
result.x := (dx * Cos(Angle) - dy * Sin(Angle)) + FromPoint.x;
result.y := (dx * Sin(Angle) + dy * Cos(Angle)) + FromPoint.y;
end;
A ver si te sirve.