2011-12-09 126 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