Punto de rotation alnetworkingedor del punto, pregunta de precisión

Estudio OpenGL ES 2.0. Pero creo que es más una pregunta de C ++ que una OpenGL.

Estoy atascado con la siguiente pregunta de rotation: Se sabe que la transformación de rotation se puede aplicar usando estas ecuaciones (por simplicidad, supongamos que estamos girando alnetworkingedor de (0, 0)):

x'=x*cos(theta)-y*sin(theta) y'=x*sin(theta)+y*cos(theta) 

Pero parece que cuando realizo esta operación de rotation varias veces, se produce el problema de precisión. Supongo que el núcleo de este problema está en los resultados inciertos de la function cos() y las limitaciones del punto flotante. Como resultado, veo que mi object giratorio es cada vez más pequeño y más pequeño. Por cierto, estoy usando C ++.

1.) ¿Qué piensas: este problema está realmente relacionado con el problema de precisión?

2.) Si es así, ¿cómo puedo manejar esto?

Gracias.

Este tipo de error acumulado generalmente se trata al seguir el punto (s) original (es decir, los vértices de una malla) y su transformación (por ejemplo, como una matriz o cuaternión y una escala / vectores de traducción) por separado.

Cuando transforma el object, no modifica los puntos originales. Usted acaba de actualizar los datos de transformación. A continuación, se puede generar un nuevo set de puntos de salida a petición de los originales y la transformación actualizada.

Hacerlo de esta manera le permite controlar los datos de transformación en busca de errores. Si mantiene la invariante de que los datos de transformación están libres de errores dentro de su precisión numérica, todos los puntos de salida que genere se mantendrán precisos dentro de límites similares.

Puede hacer esto de dos maneras:

  1. Genere la transformación desde cero siempre que la necesite, a partir de datos de origen más confiables (como una variable de ángulo).

  2. Actualice la transformación de forma incremental y corrija el error a medida que avanza:

Un ejemplo común es trabajar con una matriz de rotation. Una matriz que representa una rotation sin escala / cizallamiento es necesariamente ortonormal (cada fila o columna de la matriz es un vector unitario, perpendicular a cada fila o columna, respectivamente). Por lo tanto, puede corregir los errores de networkingondeo que se infiltran en la matriz ortormalizándola después de realizar cualquier cambio. (Es decir, tomar una fila, escalarla a la longitud de la unidad. Tomar la siguiente fila, restar su proyección en las filas consideradas hasta ahora, escalarla a la longitud de la unidad. Repita hasta que se quede sin filas)