Rhino(犀牛)中国技术支持与推广中心

标题: 用多条直线去描述一条曲线 [打印本页]

作者: 猫熊    时间: 2016-3-10 14:13
标题: 用多条直线去描述一条曲线
用多条直线去描述一条曲线,采用的算法为二分法,和递归

QQ截图20160310140301.png (136.54 KB, 下载次数: 20)

QQ截图20160310140301.png

递归练习,用直线描述曲线.rar

5.32 KB, 下载次数: 45


作者: 猫熊    时间: 2016-3-10 14:15
不知为何直接附源码,显示为非法内容,不让发
作者: 筑梦NARUTO    时间: 2016-3-10 14:48
猫熊 发表于 2016-3-10 14:15
不知为何直接附源码,显示为非法内容,不让发

用这个可以直接贴出代码的啊。

QQ截图20160310144753.jpg (27.46 KB, 下载次数: 31)

QQ截图20160310144753.jpg

作者: 猫熊    时间: 2016-3-10 16:10
你看,是吧.

QQ截图20160310160940.png (66.8 KB, 下载次数: 30)

QQ截图20160310160940.png

作者: 筑梦NARUTO    时间: 2016-3-10 18:17
本帖最后由 筑梦NARUTO 于 2016-3-10 18:20 编辑
猫熊 发表于 2016-3-10 16:10
你看,是吧.

不知道是不是你的代码里有敏感词。我圈@Jorin大大给你看下,我测试了下这个功能是可以用的。顺便给你说下ghpython中用中文可以不标coding=utf-8,可以直接用中文。
  1. import rhinoscriptsyntax as rs
  2. import Rhino.Geometry as rg
  3. import scriptcontext as sc
复制代码


作者: Jorin    时间: 2016-3-13 11:38
  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)
复制代码



作者: Jorin    时间: 2016-3-13 11:39
猫熊 发表于 2016-3-10 16:10
你看,是吧.

找到原因了,问题已修正,感谢反馈。




欢迎光临 Rhino(犀牛)中国技术支持与推广中心 (http://bbs.rhino3d.asia/) Powered by Discuz! X3.2