Dibujar línea paralela

Tengo un conjunto de puntos que representan una línea. Puede ser una forma cerrada o abierta. Necesito dibujar una línea paralela que vaya más allá de la original sin ninguna intersección.

Tengo el siguiente código para devolver la línea generada. Tengo problemas en los angularjs de la forma. Algún punto pasa por encima de la línea original.

Mi código es:

PointF[] GetParrarel(PointF[] lst, double width, float distance) { List final = new List(); width = width + distance; for (int i = 0; i  0) { if (dy == 0) { first.Y += (float)width; second.Y += (float)width; } first.X += (float)width; second.X += (float)width; } else if (dx  0) { first.X -= (float)width; second.X -= (float)width; } else if (dy < 0) { first.X += (float)width; second.X += (float)width; } else { continue; } } final.Add(first); final.Add(second); } return final.ToArray(); } 

Descubrí cómo hacerlo, pero es complejo. Aquí hay una captura de pantalla de un ejemplo que hice. Captura de pantalla

Necesitaba tres clases para esto.

  1. clase Line que describe una línea infinita usando los coeficientes a , b , c para la ecuación a*x+b*y+c=0 . El constructor toma dos PointF y calcula los coeficientes. La línea tiene un “centro” que es el punto más cercano al origen. Cualquier punto a lo largo de la línea se puede describir como una distancia desde el “centro” a lo largo de la dirección de la línea.

  2. clase LineSeg que describe un segmento de línea, especificando una línea, así como una distancia de inicio y final desde el centro de la línea (ver arriba).

  3. clase PolyLine que es solo una colección de LineSeg y puede ser inicializada por una lista de PointF . He agregado una opción para describir una línea de polietileno cerrada al agregar un segmento de línea al punto inicial al final.

El desplazamiento de una línea infinita se calcula tomando un punto en la línea y moviéndolo en una dirección normal a la línea y luego calculando los coeficientes a , b y c través de ese punto con la misma dirección. La línea infinita resultante es “recortada” por sus líneas vecinas al encontrar sus puntos de intersección.

Explicar completamente es complicado, pero puede explorar el código fuente y hacer preguntas. El código fuente del proyecto es accesible aquí .