- #_*_coding:utf-8
- """
- 制作人:盖房子的猫熊
- 用多条直线去描述一条曲线,采用的算法为二分法,和递归:
- accuracy 为直线的精确度。
- """
- import rhinoscriptsyntax as rs
- def curve_line(curve,accuracy):
- #定义了一个方法去判定曲线是否需要优化,利用的数学原理为两点之间直线最短
- curve_length=rs.CurveLength(curve)
- end_point=rs.CurveEndPoint(curve)
- star_point=rs.CurveStartPoint(curve)
- line=rs.AddLine(end_point,star_point)
- line_length=rs.CurveLength(line)
- if curve_length == 0: #为防止曲线长度为零报错,提前捕获,也可采用try 语法。
- line_curve = 1
- else:
- line_curve=line_length/curve_length
- if line_curve>accuracy:
- return False #不需要优化返回False
- else:
- return True #需要优化返回True
-
- def divide_curve(L,accuracy,line_list):
- #定义了一个递归方法。L为递归的曲线,accuracy为精确度,line_list为返回的直线
- L_curve=[] #定义一个空的列表,用于存放等分的曲线
- bool=True #设定一个布尔值,用于判定是否返回直线,还是进入下一次递归
- for i in range(len(L)):
- if curve_line(L[i],accuracy):
- bool = False
- if rs.IsCurve(L[i]):
- domain = rs.CurveDomain(L[i])
- parameter = (domain[1]-domain[0]) / 2.0+domain[0]
- #求出曲线的中点,此处有陷阱,不可直接使用domain[1]/2
- split_curve=rs.SplitCurve( L[i],parameter)
- L_curve.extend(split_curve) #列表方法将一个列表的内容追加给前一个列表
-
- else:
- end_point=rs.CurveEndPoint(L[i])
- star_point=rs.CurveStartPoint(L[i])
- line=rs.AddLine(end_point,star_point)
- line_list.append(line) #求出精确描述的每一段直线
-
- if bool == True:
- return line_list
- else:
- return divide_curve(L_curve,accuracy,line_list)
-
-
- if __name__ == "__main__":
- if accuracy>0.999:
- accuracy=0.999
- elif accuracy is None:
- accuracy=0.9
- line_list=[]
- lines=divide_curve(curve,accuracy,line_list)
复制代码
|