Pregunta

He estado recorriendo Internet durante días, pero no he podido encontrar una buena respuesta (o al menos una que tuviera sentido para mí) a lo que parece que debería ser una pregunta común. ¿Cómo se escala un polígono arbitrario? En particular, polígonos cóncavos. Necesito un algoritmo que pueda manejar polígonos cóncavos (definitivamente) y autointerroncos (si es posible). El algoritmo obvio y simple que he estado usando para manejar polígonos convexos simples es calcular el centroide del polígono, traducir ese centroide al origen, escalar todos los vértices y traducir el polígono a su ubicación original.

Este enfoque no funciona para muchos (o tal vez todos) polígonos cóncavos, ya que el centroide a menudo cae fuera del polígono, por lo que la operación de escala también da como resultado una traducción y necesito poder escalar el polígono "en su lugar" sin el resultado final siendo traducido.

¿Alguien es consciente de un método para escalar polígonos cóncavos? ¿O tal vez una forma de encontrar el "centro visual" que puede usarse como marco de referencia para la operación de escala?

Solo para aclarar, estoy trabajando en el espacio 2D y me gustaría escalar mis polígonos utilizando el "centro visual" como marco de referencia. Entonces, tal vez otra forma de hacer la pregunta sería, ¿cómo encuentro el centro visual de un polígono cóncavo y/o autointerroncio?

¡Gracias!

¿Fue útil?

Solución

La razón por la que no puede encontrar una buena respuesta es porque está siendo impreciso con sus requisitos. Primero, defina explícitamente lo que quiere decir con "en el lugar". ¿Qué se mantiene constante?

Una vez que haya descubierto eso, traducir el punto constante al origen, escalar el polígono como de costumbre y traducir de nuevo.

Otros consejos

No estoy seguro de cuál es tu problema.

¿Estás trabajando en un espacio afinado y estás buscando una transformación afina para escalar tu polígono?

Si tengo razón, simplemente escriba la matriz de transformación:

Y transforma tu polígono con matriz

Puede buscar la matriz de transformación afina.

Espero eso ayude


EDITAR

Si desea mantener el mismo "centro", puede hacer un homotethy de parámetro lambda con centro g = barycenter del polígono:

Verifica:
enter image description here

G no se moverá ya que es el centro del homotethy.

Todavía verificará la relación a continuación, por lo que seguirá siendo el barycenter. (Simplemente multiplica la relación de Lambda)

En su caso G es fácil de determinar: G (x, y): (promedio de x valores de puntos, promedio de valores Y de puntos)

y debería hacer lo que necesitas

Quizás Craig esté buscando un algoritmo de "desplazamiento de polígono", donde cada borde en el polígono se compensa con un valor dado. Por ejemplo, dado un polígono orientado en el sentido de las agujas del reloj, los bordes de compensación hacia la izquierda aumentarán el tamaño del polígono. Si esto es lo que Craig está buscando, esto se ha pedido y respondido antes aquí - Un algoritmo para inflar/desinflar (compensación, amortiguación) polígonos.

Si está buscando una solución lista (OpenSource Freeware), también he creado una biblioteca de recorte (Clíper) Escrito en Delphi, C ++ y C#, que incluye una función de compensación de polígono bastante simple.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top