2010-02-18 43 views
7

Estoy usando rectángulos definidos en términos de sus coordenadas x y su ancho y alto. Descubrí cómo rotarlos en términos de coordenadas (x = cos(deg) * x - sin(deg) * yy = sin(deg) * x + cos(deg) * y), pero estoy atascado en el alto y el ancho. Estoy seguro de que hay una solución obvia que me estoy perdiendo. Si es importante, estoy usando Python.La forma más fácil de rotar un rectángulo

editar Disculpe las molestias de la descripción. Mi intención es hacer que el ancho y la altura se inviertan o se anulen debido a cualquiera que sea el ángulo. Por ejemplo, en una rotación de 90 grados, los valores cambiarían. En una rotación de 180 grados, el ancho sería negativo. Además, solo tengo la intención de usar múltiplos de 90 en mi script. I podría solo usa las declaraciones if, pero asumí que habría un método más "elegante".

+0

¿Qué quiere decir con "pegado en altura y ancho"? ¿Qué hay de la altura y el ancho? ¿Te refieres a las coordenadas mínimas/máximas X e Y? Girar un rectángulo no cambia sus dimensiones, por lo que probablemente no se refiera a eso. –

+1

Tenga cuidado: sigue usando "grados" en sus funciones de seno y coseno, pero el número que pasa debe ser radianes. 180 grados = pi radianes, donde pi = 3.14159 .... – duffymo

+0

@duffymo ... lo que me hace llegar a la conclusión de que la sintaxis familiar y la forma en que los grados se alimentan a las funciones trigonométricas de radianes hacen que parezca que está usando Python . Bien, estaba buscando implementar esto en Python :) – Gustavo6046

Respuesta

1

De la forma en que sólo describen la rotación de 90 grados, y la forma en que parece estar definiendo la anchura y la altura, tal vez están en busca de algo así como

direction = 1  // counter-clockwise degrees 
// or 
direction = -1 // clockwise 90 degrees 

new_height = width * direction 
new_width = -height * direction 
width = new_width 
height = new_height 

No sé por qué usted quiere tener valores negativos para el ancho y la altura, sin embargo ... porque de lo contrario cada rotación de 90 grados simplemente intercambia ancho y alto, independientemente de la forma en que gire.

+0

No hay una razón en particular para los valores negativos, aparte de que parecía más simple y la biblioteca con la que estoy usando esto lo admite. – tankadillo

5

Sólo calcular cuatro esquinas de su rectángulo:

p1 = (x, y) 
p2 = (x + w, y) 
p3 = (x, y + h) 

y rotar cada uno por el ángulo que desea buscar:

p1 = rotate(p1, angle) 
# and so on... 

y transformar de nuevo a su representación rectángulo:

x, y = p1 
w = dist(p1, p2) # the same as before rotation 
h = dist(p1, p3) 

donde dist calcula la distancia entre dos puntos.

Editar: ¿Por qué no pruebas aplicar fórmula Has escrito (width, height) par?

x1 = cos(deg) * x - sin(deg) * y 
y2 = sin(deg) * x + cos(deg) * y 

Es fácil ver que si deg == 90 los valores cambiarán:

x1 = -y 
y2 = x 

y si deg == 180 van a ser negados:

x1 = -x 
y2 = -y 

y así sucesivamente ... creo esto es lo que estás buscando.

Edit2:

Aquí viene función de rotación rápida:

def rotate_left_by_90(times, x, y): 
    return [(x, y), (-y, x), (-x, -y), (y, -x)][times % 4] 
1

La forma correcta sería la de recurrir a matrices de transformación. Además, a juzgar por su pregunta, supongo que quiere rotar con respecto a (x = 0, y = 0), pero si no, tendrá que tener esto en cuenta y traducir primero su rectángulo al centro del plan (y luego tradúzcalo cuando se realice la rotación).

M = Matriz de traducir al centro R = Rotación Matriz

matriz de transformación = M^(- 1) * R * M

Pero para darle una respuesta rápida a su pregunta, apenas toma las otras dos esquinas de tu rectángulo y aplica la misma transformación sobre ellas.

Para obtener más información sobre matrices de transformación: http://en.wikipedia.org/wiki/Transformation_matrix

1

rotación no debe cambiar width y height. Su ecuación es correcta si desea rotar (x, y) aproximadamente (0,0) en deg, pero tenga en cuenta que a menudo las funciones cos y sin esperan argumentos en radianes en lugar de grados, por lo que puede necesitar multiplicar deg por pi/180 (radianes) por grado).

Si necesita encontrar las ubicaciones de otros vértices rectangulares además de (x, y) después de rotar, entonces debe almacenarlos y rotarlos junto con (x, y) o mantener cierta información sobre la orientación del rectángulo (como grados) para que pueda recalcularlos como, por ejemplo x + ancho cos (deg), y + altura sin (deg).

Cuestiones relacionadas