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

[复制链接]
跳转到指定楼层
18906 猫熊 发表于 2016-3-10 14:13:19 楼主
用多条直线去描述一条曲线,采用的算法为二分法,和递归

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

QQ截图20160310140301.png

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

5.32 KB, 下载次数: 45

评分

参与人数 2技术 +1 坛币 +6 收起 理由
Jorin + 4 赞一个!
筑梦NARUTO + 1 + 2 感谢分享

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享
关于大陆地区Rhino原厂培训中心
 楼主| 猫熊 发表于 2016-3-10 14:15:45
2
不知为何直接附源码,显示为非法内容,不让发
筑梦NARUTO 发表于 2016-3-10 14:48:24
3
猫熊 发表于 2016-3-10 14:15
不知为何直接附源码,显示为非法内容,不让发

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

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

QQ截图20160310144753.jpg
筑梦NARUTO 发表于 2016-3-10 18:17:46
5
本帖最后由 筑梦NARUTO 于 2016-3-10 18:20 编辑

不知道是不是你的代码里有敏感词。我圈@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:37
6
  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:12
7

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

本版积分规则