2010-08-10 19 views
7

Hola, estoy usando este código C# para rotar polígonos en mi aplicación; rotan pero también se tuercen en el camino, que no es lo que quiero que ocurra. Todos los polígonos son rectángulos con cuatro esquinas definidas como vectores 2D,¿Cómo hacer la rotación correcta del polígono? (en C# aunque se aplica a cualquier cosa)

public Polygon GetRotated(float radians) 
    { 

     Vector origin = this.Center; 
     Polygon ret = new Polygon(); 
     for (int i = 0; i < points.Count; i++) 
     { 
      ret.Points.Add(RotatePoint(points[i], origin, radians)); 
     } 
     return ret; 
    } 

    public Vector RotatePoint(Vector point, Vector origin, float angle) 
    { 
     Vector ret = new Vector(); 
     ret.X = (float)(origin.X + ((point.X - origin.X) * Math.Cos((float)angle)) - ((point.Y - origin.Y) * Math.Sin((float)angle))); 
     ret.Y = (float)(origin.Y + ((point.X - origin.X) * Math.Sin((float)angle)) - ((point.Y - origin.Y) * Math.Cos((float)angle))); 
     return ret; 
    } 
+0

Se ve bien para mí, en una rápida lectura. ¿Qué tipo de sesgo estás viendo? ¿Y hay alguna razón por la que estás usando 'float' en lugar de' double'? –

+0

Dysaster lo tenía, simplemente agregando el término y en lugar de restarlo lo solucionó. gracias a jonskeet también por el código mucho mejor :) – bharling

Respuesta

7

Parece que la transformación de rotación es incorrecta. Deberá utilizar:

x' = x*Cos(angle) - y*Sin(angle) 
y' = x*Sin(angle) + y*Cos(angle) 

Para obtener más información, consulte various sources en Internet. :)

6

no tengo ninguna respuesta a por qué está sesgando todavía, pero hacer tienen una sugerencia para hacer el código más claro:

public Vector RotatePoint(Vector point, Vector origin, float angle) 
{ 
    Vector translated = point - origin; 
    Vector rotated = new Vector 
    { 
     X = translated.X * Math.Cos(angle) - translated.Y * Math.Sin(angle), 
     Y = translated.X * Math.Sin(angle) + translated.Y * Math.Cos(angle) 
    }; 
    return rotated + origin; 
} 

(Eso suponiendo Vector tiene +/- operadores adecuados definidos.)

Es posible que aún necesite un par de moldes a float, pero todavía se va a terminar con un menor número de soportes de ofuscación t Hings. Ah, y usted definitivamente no necesita para emitir angle a float, dado que ya está declarado como float.

EDIT: una nota sobre las matrices de rotación involucradas - depende de si se toma el ángulo en sentido horario o antihorario. No me sorprendería en absoluto descubrir que la matriz es realmente lo que está yendo mal (traté de verificarlo, pero aparentemente se equivocó) ... pero "diferente" no significa significa "incorrecto". Esperemos que la matriz es lo que es incorrecto, es cierto :)

+0

+1 por sugerir mejoras de legibilidad. Necesitamos más personas que codifiquen para el próximo programador que mantendrá el código. – vhallac

0

Simplemente una conjetura salvaje: ¿está seguro de que la relación de aspecto de la resolución de su escritorio es la misma que la de la pantalla física? Es decir, ¿son los píxeles cuadrados? De lo contrario, rotar los rectángulos en un ángulo arbitrario puede hacer que se vean sesgados.

+0

No he tenido una pantalla con píxeles anisotrópicos desde tiempos EGA (640x400) - ¡Pensé que esas bestias se habían quedado en el camino del dinosaurio! – Niki

+0

@nikie: no necesariamente el píxel físico.Puede elegir una resolución diferente a la resolución de pantalla nativa. De esta forma, puede obtener píxeles "lógicos" rectangulares cuando su computadora de escritorio se estira para llenar el área de la pantalla física. – ysap

3

Creo que su matriz de rotación es incorrecta. Debe haber un + en lugar de - en la segunda ecuación:

+cos -sin 
+sin +cos 
1

Suponiendo que origen es 0,0. De su fórmula obtendría: X '= (X + ((X - 0) * Cos (ángulo)) - ((Y - 0) * Sin (ángulo))); X '= X + (X * Cos (ángulo)) - (Y * Sin (ángulo));

que difiere de la fórmula inicial x'= x * cos ángulo - y * ángulo de cos

Así que creo que la respuesta de Jon Skeet es correcta y clara.

+0

corrección, excepto el valor y '. el - debería ser +. – Txugo

Cuestiones relacionadas