原创 --- 用多条直线去描述一条曲线

[复制链接]
Jorin 发表于 2016-3-13 11:38:37
楼主
  1. #_*_coding:utf-8
  2. """
  3. 制作人:盖房子的猫熊
  4. 用多条直线去描述一条曲线,采用的算法为二分法,和递归:
  5. accuracy 为直线的精确度。
  6. """

  7. import rhinoscriptsyntax as rs


  8. def curve_line(curve,accuracy):
  9.     #定义了一个方法去判定曲线是否需要优化,利用的数学原理为两点之间直线最短
  10.     curve_length=rs.CurveLength(curve)
  11.     end_point=rs.CurveEndPoint(curve)
  12.     star_point=rs.CurveStartPoint(curve)
  13.     line=rs.AddLine(end_point,star_point)
  14.     line_length=rs.CurveLength(line)
  15.     if curve_length == 0:     #为防止曲线长度为零报错,提前捕获,也可采用try 语法。
  16.         line_curve = 1
  17.     else:
  18.         line_curve=line_length/curve_length
  19.     if line_curve>accuracy:
  20.         return False          #不需要优化返回False
  21.     else:
  22.         return True          #需要优化返回True
  23.    

  24. def divide_curve(L,accuracy,line_list):
  25.     #定义了一个递归方法。L为递归的曲线,accuracy为精确度,line_list为返回的直线

  26.     L_curve=[]  #定义一个空的列表,用于存放等分的曲线
  27.     bool=True  #设定一个布尔值,用于判定是否返回直线,还是进入下一次递归
  28.     for i in range(len(L)):
  29.         if curve_line(L[i],accuracy):
  30.             bool = False
  31.             if rs.IsCurve(L[i]):   
  32.                 domain = rs.CurveDomain(L[i])
  33.                 parameter = (domain[1]-domain[0]) / 2.0+domain[0]
  34.                 #求出曲线的中点,此处有陷阱,不可直接使用domain[1]/2
  35.                 split_curve=rs.SplitCurve( L[i],parameter)
  36.                 L_curve.extend(split_curve) #列表方法将一个列表的内容追加给前一个列表
  37.                
  38.         else:
  39.             end_point=rs.CurveEndPoint(L[i])
  40.             star_point=rs.CurveStartPoint(L[i])
  41.             line=rs.AddLine(end_point,star_point)
  42.             line_list.append(line)  #求出精确描述的每一段直线
  43.             
  44.     if bool == True:
  45.        return line_list
  46.     else:
  47.         return divide_curve(L_curve,accuracy,line_list)
  48.         
  49.         
  50. if __name__ == "__main__":
  51.     if accuracy>0.999:
  52.         accuracy=0.999
  53.     elif accuracy is None:
  54.         accuracy=0.9
  55.     line_list=[]
  56.     lines=divide_curve(curve,accuracy,line_list)
复制代码


关于大陆地区Rhino原厂培训中心
Jorin 发表于 2016-3-13 11:39:12
2

找到原因了,问题已修正,感谢反馈。
您需要登录后才可以回帖 登录 | 注册成为会员

本版积分规则