2015-07-11 81 views
1

我正在繪製一個具有遊動立方體(正方形,因爲它是2d)算法的元球。 一切都很好,但我想把它作爲一個矢量對象。Vectorised遊行立方體(正方形) - 將線條連接成曲線

到目前爲止,我已經從每個活動的方形中得到了一兩條向量線,並將它們保存在列表中。換句話說,我有一組小矢量線,空間上顯示幾個等值線(曲線) - 我的目標是從線重建那些曲線。

現在我堅持快速將它們連接在一起:基本上我需要將所有行一一連接成幾個序列(曲線)。我不知道有多少曲線(序列)會在那裏,線條可能在不同的方向,我需要將線條處理成獨特點的序列。

到目前爲止,我寫的東西顯然是醜陋和半工作(這裏是點作爲屬性,並CHP的列表中選擇一個類的功能檢查,如果點足夠接近,牛逼 definies這個「夠」):

def countur2(lines): 

    '''transform random list of lines into 
    list of grouped sequences''' 
    t = 2 # tolerance 

    sqnss = [[lines[0]]] # sequences 
    kucha = [lines[0]] #list of already used lines 

    for l in lines: 
     for i,el in enumerate(lines): 
      print 'working on el', i 
      ss = sqnss[-1][0] 
      ee = sqnss[-1][-1] 
      if el not in kucha: 
       if chP(el.points[0],ee.points[1],t): 
        sqnss[-1].append(el) 
        kucha.append(el) 
        break 
       elif chP(el.points[1],ee.points[1],t): 
        sqnss[-1].append(el.rvrse()) 
        kucha.append(el) 
        break 

       elif chP(el.points[1],ss.points[0],t): 
        sqnss[-1] = [el] + sqnss[-1] 
        kucha.append(el) 
        break 

       elif chP(el.points[0],ss.points[0],t): 
        sqnss[-1] = [el.rvrse()] + sqnss[-1] 
        kucha.append(el) 
        break 



      print 'new shape added, with el as start' 
      sqnss.append([el]) 
      kucha.append(el) 


    #return sqnse of points 
    ps = [] 
    for x in sqnss: ps.append([el.points[0] for el in x]) 

    return ps 

我知道這是一個大問題,但請給我正確的方向上沒有任何線索來處理這個任務

回答

1

第一個選項是對所有單元格邊進行唯一編號,並將其與每個向量關聯起來。

在字典中輸入所有對,兩種方式:(a,b)(b,a)。然後,從任意一對開始,比如說(a,b),您將通過b找到下一對,如(b,c)。您將從字典中刪除(b,c)(c,b),並從c繼續,直到鏈斷裂到域的一側或循環。

第二種方法是掃描整個域,當找到isocurve交叉的單元時,計算矢量,並移動到共享isocurve交叉邊的相鄰單元,依此類推。爲了避免無限掃描,您將標記已經訪問過的單元格。

與第一種方法相比,不需要字典,因爲鏈條的以下幾乎完全基於局部幾何。

當心有兩個陷阱:具有一個或多個等於所述異級別角值製造麻煩

  • 細胞。一種可能的治療方法是稍微修改角度值;這將創建一些小的向量。

  • 細胞可以通過兩個向量而不是一個雜交,並且需要被訪問兩次。

+0

作爲這些字典中的關鍵字(解決方案1),你是什麼意思? –

+0

@Casy_fill:你瞭解鏈接過程嗎? –

+0

@Casy_fill:那麼如果你理解它,應該清楚字典鍵是邊數。 –