Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Offset De Poligonos

Iniciado por josette, 16 de Marzo de 2006, 06:35:07 PM

« anterior - próximo »

josette

    Estoy haciendo una aplicacion en donde necesito calcular el offset de un poligono a una distancia dada. El caso en el que el offset es exterior al poligono lo tengo controlado, pero en lcaso en el que el offset es interior al poligono tengo problemas porque se producen bucles y otras cosas raras.


  Alguien sabe donde encontrar informacion u un source code?


Pogacha

 Estaba esperando haber si otro contestaba, pero no entiendo la pregunta.

Estas tratando de calcular la distancia de un punto al plano donde esta el poligono?
Seria tomando 3 vertices del poligono no lineales ( que no esten en una recta ) encontrar la ecuacion del plano con:

cruz  = (v2-v1) x (v3-v1)
normal = c/|c|
distancia = -n . v;

la ecuacion del plano queda  "normal x VECTOR - distancia"

Ahora la distancia al plano la encuentro con:

offset = punto . normal - distancia;

Donde te dará positivo en frente y negaitvo atras.

Notese que x es el ploducto cruz y . el producto punto.

Danos mas datos que puede que esté diciendo otra cosas nada que ver a lo que preguntas.
Saludos

josette

 Perdon por no haberme explicado bien. Lo que quiero hacer es lo siguiente:

  en 2d, por ejemplo tengo un poligono irregular cerrado. Entonces quiero hacer una utilidad en la aplicacion para agrandar ese poligono o encojerlo dada una distancia, de forma que el nuevo poligono será casi igual y con todos sus puntos  a la misma distancia del poligono original.

  El tema de los angulos convexos entre dos aristas del poligono lo tengo contralo ya que creo dos segmentos paralelos a las dos aristas contiguas del poligono y luego uno los extremos de los segmentos paralelos mediante un arco con centro en la union de las dos aristas del poligono original.

  El tema de los angulos concavos en principio es facil, ya que solo hay que crear segmentos paralelos y cortar por su punto de cruce. Pero hay veces que en un conjunto de aristas contiguas con angulos concavos pueden producirse bucles internos y ahi es donde se fastidia la cosa.

  Yo quería saber si hay algun metodo para hacer esto o si hay algun codigo fuente de donde sacarlo.

EDIT:con operacines de escalado se podría solucionar?

marcode

 Yo supongo que lo podrás hacer escalando. Hayas el centro del polígono y guardas su posición, se lo restas a sus vértices para llevarlo a la coordenada 0, los multiplicas para escalarlo, y les vuelves a sumar la posición guardada para llevarlo a su posición original.
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

Pogacha

 La verdad es que es un problema demasiado especifico y no tengo la menor idea de que si existe una solucion patrón, se me ocurre que tendras que usar en compromiso heuristicas como reglas.
Desde ya tendras que descomponer todo en poligonos convexos.
Cuando agrandas es facil: los segmentos sedimentan ( se les suma su normal de lado escalada ) y los vertices se transforman en circulos, la union termina con el resultado de este convexo y la union de los resultantes de los convexos que forman el real forma el resultado final.

Pero para achicar no tengo idea, tendras que hacer un algoritmo bastante complejo que cache todas las excepciones que puedas, pero igual no se me ocurre nada solido.

Saludos.

josette

 Ahora si se me ha entendido. Lo de escalar el poligono puede ser algo facil y seguro. El inconveniente puede ser que puntos muy cercanos en el poligono original queden muy pegdo en el poligono 'encojido' pero se puede solventar eliminando puntos que estan muy cercanos.

Ya os contaré los resultados.

marcode

 Creo que me he dado cuenta de lo que buscas y no sirve el escalarlo por igual.

Tendrías que tomar para cada uno de los puntos los vectores con los puntos anterior y posterior por ejemplo en el sentido de las agujas del reloj, y hallar el promedio, después normalizarlo y multiplicarlo por la distancia que puede ser negativa o positiva dependiendo de si quieres agrandar o encoger. Sumándolo al punto original te da el nuevo punto escalado, si el ángulo entre los dos vectores es mayor de 180 grados hay que invertir el signo de la distancia.

No se si me explicado bien y si es eso lo que quieres.
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

josette

 En este articulo se explica lo que quiero hacer:

http://3map.snu.ac.kr/mskim/ftp/comparing.pdf

pero alguien me puede aydar conlas matemáticas?






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.