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

标题: Rhino.Python雪花分形源码(增加GH文件) [打印本页]

作者: yesmely    时间: 2013-9-18 14:34
标题: Rhino.Python雪花分形源码(增加GH文件)
本帖最后由 yesmely 于 2013-9-22 15:46 编辑

板块冷清,来点小代码,顺便提示下喜欢rhino.python的朋友可以来这个裙交流:253347427
  1. import rhinoscriptsyntax as rs
  2. def lsnow1(line):
  3.     points = rs.DivideCurve(line,3,False,True)
  4.     point3=rs.AddPoint(points[2])
  5.     ptm=rs.RotateObject(point3,points[1],-60.0,None,copy=True)
  6.     points.insert(2,ptm)
  7.     pl=rs.AddPolyline(points)
  8.     rs.DeleteObjects([line,point3,ptm])
  9.     linesID=rs.ExplodeCurves(pl,True)
  10.     return linesID
  11. def lsnows(lines):
  12.     list=[]
  13.     for x in lines:
  14.         for y in lsnow1(x):
  15.             list.append(y)
  16.     return list
  17. def lsnow(line,num):
  18.     if num==0:
  19.         return line
  20.     elif num==1:
  21.         return lsnow1(line)
  22.     else:
  23.         return lsnows(lsnow(line,num-1))
  24. line = rs.GetObject("Select a line:")
  25. degree=rs.GetInteger("Degree(Integer)=?,better <5")
  26. if line and degree:
  27.     lsnow(line,degree)
复制代码
高手见笑,哪位有兴趣做个分形生成器?
GH附件: lsnow.rar (10.59 KB, 下载次数: 382)
作者: yesmely    时间: 2013-9-18 14:35



作者: 深蓝Ansen    时间: 2013-9-18 18:36
感谢yesmely兄分享代码,雪花分形是常见的分形方式。想得到分形几何图案,用递归函数的确是解决之道!

我刚刚查了下相关资料:类似雪花的这种分形曲线叫做Von kock曲线,如果输入端正好是一个正三角形,得到的曲线也称作Koch雪花曲线。

我个人对空间有规律的图形也很感兴趣,所以就用GH写了个,思路和yesmely兄相似,方便之前用过GH也对Rhino Python感兴趣的朋友理解代码的”思路“。当然,这个过程得用到 HoopSnake 这个做数据循环的插件来实现。




作者: yesmely    时间: 2013-9-18 20:46
感谢版主加分!
一直认为GH中的电池是优化后的每一个代码函数,能不自己写就不自己写,所以在GH里可以做一次分形,二次三次或更多就不知道怎么办了,只有不断累电池,虽然也能达到效果,但觉得太低端,所以用python试一下,发现可行。那个递归真的把我绕了一两天,最终觉得一个函数搞不定,所以中间过渡了一下(lsnows函数,并不是必须,只不过可读性好点),很期待有个电池循环或者条件判断累的插件,没想到 HoopSnake就行,看来还是基础不牢,继续努力。
另外,在一楼 最后提到了,分形生成器的问题。如果有了Hoopsnake,那么应该就水到渠成,思路如下,胡乱猜的未验证:
生成器函数应该含有三个自变量:基础形状s、基础动作a、分形的深度d。
以本例来说,原本是个正三角形,对每条边进行一楼中的代码处理就能得到深蓝大版的那个雪花图。但是三角形并不是本例要求的三个自变量中的s,那本例中s是那个图形?
s:是把直线分三段,中间一段取中点拉高成尖角小山(请原谅这个表达);
a:就是拉高,把一条直线变成了四条直线;
d:没什么说的
s、a、d中应该a比较麻烦,希望能看到这个生成器在rhino.python中产生!
作者: 深蓝Ansen    时间: 2013-9-18 22:01
yesmely 发表于 2013-9-18 20:46
感谢版主加分!
一直认为GH中的电池是优化后的每一个代码函数,能不自己写就不自己写,所以在GH里可以做一 ...

S是左边黄色组中的内容,不同的是GH中是并行数据,同时处理了3条线段。
因此,我觉得在rhino.python中,你需要"测量出"线段的数量,变成语言中最高层 嵌套循环的次数,这样问题应该就能解决

坐等Jorin出马了
作者: yesmely    时间: 2013-9-22 15:42
稍稍动一下,grasshopper中可以使用了,附件在1楼
作者: Mirrorman    时间: 2015-2-7 14:34
本帖最后由 Mirrorman 于 2015-2-7 14:45 编辑

多谢 yesmely 兄的script~
看了下思路,总是觉得有点绕~

无意间翻了下《RhinoScript 参数建模》这本书,看到里面的递归,有了点思路~
简化了下代码,如下:

import rhinoscriptsyntax as rs

def fx(lines,num):
    if rs.CurveLength(lines) > num:
        points = rs.DivideCurve (lines,3)
        rs.DeleteObject (lines)
        T_point = rs.AddPoint (points[2])
        N_point = rs.RotateObject (T_point,points[1],-60)
        points.insert(2,N_point)
        for i in range(1,5):
            line = rs.AddLine(points[i-1],points)
            fx(line,num)
        rs.DeleteObject (N_point)
if __name__ =="__main__":
    lines = rs.GetObject ("Enter a line")
    num = rs.GetReal ("Enter a number:")
    fx(lines,num)

断断续续学Grasshopper, script 几年了,某些时候总会迷失方向……

作者: Mirrorman    时间: 2015-3-9 17:52
多谢 yesmely 兄的script~
看了下思路,总是觉得有点绕~

无意间翻了下《RhinoScript 参数建模》这本书,看到里面的递归,有了点思路~
简化了下代码,如下:

import rhinoscriptsyntax as rs

def fx(lines,num):
    if rs.CurveLength(lines) > num:
        points = rs.DivideCurve (lines,3)
        rs.DeleteObject (lines)
        T_point = rs.AddPoint (points[2])
        N_point = rs.RotateObject (T_point,points[1],-60)
        points.insert(2,N_point)
        for i in range(1,5):
            line = rs.AddLine(points[i-1],points[i])
            fx(line,num)
        rs.DeleteObject (N_point)
if __name__ =="__main__":
    lines = rs.GetObject ("Enter a line")
    num = rs.GetReal ("Enter a number:")
    fx(lines,num)

断断续续学Grasshopper, script 几年了,某些时候总会迷失方向……




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