| 赞 | 87 |
| VIP | |
| 好人卡 | |
| 积分 | 136 |
| 经验 | |
| 最后登录 | 2021-1-24 |
| 在线时间 | 2753 小时 |
- 梦石
- 0
- 星屑
- 13562
- 在线时间
- 2753 小时
- 注册时间
- 2014-10-4
- 回帖
- 705

|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有账号?注册会员
×
本帖最后由 SixRC 于 2017-5-14 00:46 编辑
下午写了这个,然后玩到现在
code- class Line
- include Math
- #起始点 向量
- attr_accessor:xy,:dir
- def initialize(xy,dir)
- @dir=dir
- @xy=xy
- end
- end
- class Factal
- include Math
- #状态数组 分化模式 位置 位图
- #状态数组0为初始态 之后每次进行分化 分化依据分化模式
- #状态 分化模式由Line构成 也可以是其他 暂时由线
- #状态n=状态n-1的每条线和分化模式的运算
- attr_accessor:status,:sim,:xy,:bitmap
- def initialize(xy)
- @xy=xy
- @status=[]
- @sim=[]
- @bitmap=Bitmap.new(4000,2000)
- @bitmap.fill_rect(0,0,4000,2000,Color.new(0,0,0))
- end
- #得到状态n的bitmap
- def get_bitmap(n)
- get_status(n)
- @bitmap.fill_rect(0,0,4000,2000,Color.new(0,0,0))
- @status[n].each{|k|draw_line(k)}
- end
- #画线
- def draw_line(line)
- len=(line.dir[0]**2+line.dir[1]**2)**0.5
- len=geti(len).to_f
- len=1 if len==0
- for i in 0..len
- x=geti(line.xy[0]+line.dir[0]*i/len)
- y=geti(line.xy[1]+line.dir[1]*i/len)
- @bitmap.set_pixel(@xy[0]+x,2000-@xy[1]-y,Color.new(0,255,0))
- end
- end
- #获取status
- def get_status(n)
- return if @status[n]
- get_status(n-1)
- @status[n]=[]
- for i in @status[n-1]
- for j in @sim
- nx=i.dir[0]*j.xy[0]-i.dir[1]*j.xy[1]
- ny=i.dir[0]*j.xy[1]+i.dir[1]*j.xy[0]
- ndx=i.dir[0]*j.dir[0]-i.dir[1]*j.dir[1]
- ndy=i.dir[0]*j.dir[1]+i.dir[1]*j.dir[0]
- @status[n].push(Line.new([nx+i.xy[0],ny+i.xy[1]],[ndx,ndy]))
- end
- end
- end
- #四舍五入
- def geti(k)
- if k-k.to_i > 0.5
- return k=k.to_i+1
- end
- k=k.to_i
- end
- end
复制代码
原理很简单
就是重复线段
然后输入初始线段和分化模式
然后就可以让他算下去
一些解释线由初始位置和向量表示 每一次运算 都是把前一次状态的每一线段转化成分化模式里面的线
分化模式里的线长度为一就是转化的线段长等于原长度
用图片来说话 就是
原线段+分化模式=后线段
如此循环
输入初始状态及分化模式后 用 xxx.get_bitmap(n)获取位图
下面是我生成的一些分形图
分形图
初始状态稍稍不同
结果便很不同
呃
真的很好玩
5.14更新
前几天拓展到了C4D上
不过我的创意和渲染技巧极烂
下为其一
3d分形
|
评分
-
查看全部评分
|