Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 矢量化行进立方体(正方形)-将直线连接成曲线_Python_Algorithm - Fatal编程技术网

Python 矢量化行进立方体(正方形)-将直线连接成曲线

Python 矢量化行进立方体(正方形)-将直线连接成曲线,python,algorithm,Python,Algorithm,我正在用行进立方体(二维正方形)算法绘制变形球。 一切都很好,但我想把它作为向量对象 到目前为止,我已经从每个活动方块中得到了一两条向量线,将它们保存在列表行中。换句话说,我有一个小矢量线阵列,在空间上显示几个等值线(曲线)——我的目标是从直线重建这些曲线 现在我不得不快速地将它们连接在一起:基本上,我需要将所有的线一条接一条地连接到几个序列(曲线)中。我不知道会有多少曲线(序列),线可能在不同的方向上,我需要将线处理成独特点的序列 到目前为止,我写了一些明显难看且半途而废的东西(这里,line

我正在用行进立方体(二维正方形)算法绘制变形球。 一切都很好,但我想把它作为向量对象

到目前为止,我已经从每个活动方块中得到了一两条向量线,将它们保存在列表行中。换句话说,我有一个小矢量线阵列,在空间上显示几个等值线(曲线)——我的目标是从直线重建这些曲线

现在我不得不快速地将它们连接在一起:基本上,我需要将所有的线一条接一条地连接到几个序列(曲线)中。我不知道会有多少曲线(序列),线可能在不同的方向上,我需要将线处理成独特点的序列

到目前为止,我写了一些明显难看且半途而废的东西(这里,line是一个类,点列表作为属性points,而chP是一个函数,用于检查点是否足够接近,t定义了“足够”):


我知道这是一个很大的问题,但请给我任何关于正确方向的线索来处理这项任务

第一个选择是对所有单元格边进行唯一编号,并将它连接的边对与每个向量相关联

在字典中输入所有对,双向输入:
(a,b)
(b,a)
。然后,从任意一对开始,比如说
(a,b)
,您将通过
b
,比如
(b,c)
找到下一对。您将从字典中删除
(b,c)
(c,b)
,然后从
c
继续,直到链在域的一侧断开或循环

第二个选项是扫描整个域,当您发现一个单元与等曲线相交时,计算向量,然后移动到共享与等曲线相交的边的相邻单元,依此类推。为了避免无限扫描,您将标记单元格为已访问

与第一种方法相比,不需要字典,因为下面的链完全基于局部几何体

注意有两个陷阱:

  • 具有一个或多个等于iso级别的角点值的单元格正在产生问题。一种可能的解决方法是稍微修改拐角处的值;这将创建一些微小的向量

  • 细胞可以由两个载体而不是一个载体交叉,并且需要访问两次


在那些字典中作为键是什么意思(解决方案1)?@Casy\u fill:你理解链接过程吗?@Casy\u fill:如果你理解,应该很清楚字典键是边数。如果你说它们是键值对a->b和b->a,那就更清楚了。
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