2015-07-11 30 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:那么如果你理解它,应该清楚字典键是边数。 –