2010-06-11 25 views
9

Tengo que dibujar una elipse de tamaño arbitrario y orientación píxel por píxel. Parece bastante fácil dibujar una elipse cuyos ejes mayor y menor se alineen con los ejes xey, pero girar la elipse en un ángulo arbitrario parece más complicado. Inicialmente, pensé que podría funcionar dibujar la elipse no girada y aplicar una matriz de rotación a cada punto, pero parece que eso podría causar errores al redondeo, y necesito una precisión bastante alta.¿Cómo se dibuja una elipse con orientación arbitraria píxel por píxel?

¿Mi sospecha sobre este método es correcta? ¿Cómo podría lograr esta tarea más precisamente?

Estoy programando en C++ (aunque eso no debería importar ya que esta es una pregunta más orientada a algoritmos).

Editar: como David señaló, creo que realmente me pregunto cómo hacer la interpolación de píxeles.

Respuesta

9

Uso:

x = X cos(a) - Y sin(a) 
y = Y cos(a) + X sin(a) 

Dónde a es el ángulo de rotación en sentido antihorario, (x, y) son las nuevas coordenadas, y (X, Y) son la edad.

Debe usar flotadores para conservar la precisión. Simplemente revise cada punto, aplique la transformación y voilà.

Editar: después de algunas búsquedas, aquí hay un código de Microsoft: http://research.microsoft.com/en-us/um/people/awf/graphics/bres-ellipse.html que dibuja secciones cónicas rasterizadas.

+1

Creo que esto corre el riesgo de costumbre con "hacia adelante" transformaciones: que el alias provocará que "omita" píxeles en las coordenadas transformadas. – dmckee

+0

Sí, es por eso que he estado buscando un método diferente. ¿Hay alguna buena manera de lidiar con el aliasing? – amc

+0

Sí, quiero decir, todo depende de qué biblioteca use para hacer su dibujo. Pero aliasing arruinará cualquier tipo de rotación. Su pregunta debería ser "¿cómo hago la interpolación de píxeles?" :) –

1

Utilice el método de Bresenham para dibujar elipses alineadas con el eje, pero aplique una cizalladura a la elipse dibujada. También necesitará modificar las longitudes de los ejes. A sheared ellipse is also an ellipse. Este método conserva la ventaja de Bresenham de dibujar elipses rellenas utilizando segmentos de líneas horizontales. Lo que necesita para hacer esto es la función que mapea una especificación de una elipse en términos de ejes y rotación en un conjunto diferente de ejes y un corte. Una solución está disponible en línea en http://scratch.mit.edu/projects/50039326/ con una discusión sobre el método y una description of the math involved en http://scratch.mit.edu/discuss/topic/94194/

El mapeo fue descubierto por Nathan Dinsmore (usuario nXIII en el MIT Scratch site)

+0

Esto es asombroso.Debería ser la respuesta principal, ya que es una solución nueva, mejor, a una vieja pregunta. – tukra

Cuestiones relacionadas