2011-12-09 105 views
1

我有一组点代表一条线。它可能是封闭的形状或开放的形状。 我需要绘制一条平行线,除了原始线之外没有任何交点。绘制平行线

我有以下代码返回生成的行。我在形状的角度有问题。有一点可以超越原来的界限。

我的代码是:

PointF[] GetParrarel(PointF[] lst, double width, float distance) 
{ 
    List<PointF> final = new List<PointF>(); 
    width = width + distance; 

    for (int i = 0; i < lst.Length-1 ; i++) 
    { 
     int index = i; 
     PointF current = lst[index]; 
     PointF next = lst[index + 1]; 
     double dx = next.X - current.X; 
     double dy = next.Y - current.Y; 
     PointF first = current; 
     PointF second = next; 
     if (dx > 0) 
     { 
      if (dy == 0) 
      { 
       first.Y += (float)width; 
       second.Y += (float)width; 
      } 
      first.X += (float)width; 
      second.X += (float)width; 

     } 
     else if (dx < 0) 
     { 
      if (dy == 0) 
      { 
       first.Y -= (float)width; 
       second.Y -= (float)width; 
      } 
      first.X -= (float)width; 
      second.X -= (float)width;      
     } 
     else //// X = 0 
     { 
      if (dy > 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(); 
} 
+0

这是一个偶然的家庭作业.. ?? – MethodMan

+0

'宽度'和'距离'是什么。在我看来,你只需要一个标量'offset'。 – ja72

+0

可能重复http://stackoverflow.com/questions/845254/polyline-offset-with-closed-polygon-and-islands – ja72

回答

4

我想通了,如何做到这一点,但它是复杂的。这是我做的一个例子的截图。 Screenshot

我需要三个类。

  1. Line其描述使用系数abc为方程a*x+b*y+c=0无限线。构造函数需要两个PointF并计算系数。该线具有最接近原点的“中心”。沿线的任何点都可以描述为沿线方向与“中心”的距离。

  2. class LineSeg它通过指定直线,以及从直线中心开始和结束的距离(参见上面)来描述线段。

  3. class PolyLine这只是LineSeg的集合,可以通过PointF列表进行初始化。我添加了一个选项来描述封闭多边形线,在最后在初始点添加一条线段。

的无限线的偏移量是通过取线路上的点和在一个方向上移动它垂直于该行,然后计算系数ab通过与相同的方向这一点计算出,并且c 。生成的无限行通过找到它们的交叉点被其相邻行“修剪”。

要完全解释是复杂的,但您可以自由探索源代码并提出问题。该项目的源代码可以访问here