查看: 2766|回复: 5

[随意闲聊] 分形乐趣

[复制链接]
梦石
0
星屑
13562
在线时间
2753 小时
注册时间
2014-10-4
回帖
705

R考场第七期纪念奖

发表于 2017-5-11 01:08:38 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 SixRC 于 2017-5-14 00:46 编辑

下午写了这个,然后玩到现在
code
  1. class Line
  2.   include Math
  3.   #起始点  向量
  4.   attr_accessor:xy,:dir
  5.   def initialize(xy,dir)
  6.     @dir=dir
  7.     @xy=xy
  8.   end
  9. end
  10. class Factal
  11.   include Math
  12.   #状态数组 分化模式 位置 位图
  13.   #状态数组0为初始态 之后每次进行分化 分化依据分化模式
  14.   #状态 分化模式由Line构成 也可以是其他 暂时由线
  15.   #状态n=状态n-1的每条线和分化模式的运算
  16.   attr_accessor:status,:sim,:xy,:bitmap
  17.   def initialize(xy)
  18.     @xy=xy
  19.     @status=[]
  20.     @sim=[]
  21.     @bitmap=Bitmap.new(4000,2000)
  22.     @bitmap.fill_rect(0,0,4000,2000,Color.new(0,0,0))
  23.   end
  24.   #得到状态n的bitmap
  25.   def get_bitmap(n)
  26.     get_status(n)
  27.     @bitmap.fill_rect(0,0,4000,2000,Color.new(0,0,0))
  28.     @status[n].each{|k|draw_line(k)}
  29.   end
  30.   #画线
  31.   def draw_line(line)
  32.     len=(line.dir[0]**2+line.dir[1]**2)**0.5
  33.     len=geti(len).to_f
  34.     len=1 if len==0
  35.     for i in 0..len
  36.       x=geti(line.xy[0]+line.dir[0]*i/len)
  37.       y=geti(line.xy[1]+line.dir[1]*i/len)
  38.       @bitmap.set_pixel(@xy[0]+x,2000-@xy[1]-y,Color.new(0,255,0))
  39.     end
  40.   end
  41.   #获取status
  42.   def get_status(n)
  43.     return if @status[n]
  44.     get_status(n-1)
  45.     @status[n]=[]
  46.     for i in @status[n-1]
  47.       for j in @sim
  48.         nx=i.dir[0]*j.xy[0]-i.dir[1]*j.xy[1]
  49.         ny=i.dir[0]*j.xy[1]+i.dir[1]*j.xy[0]
  50.         ndx=i.dir[0]*j.dir[0]-i.dir[1]*j.dir[1]
  51.         ndy=i.dir[0]*j.dir[1]+i.dir[1]*j.dir[0]
  52.         @status[n].push(Line.new([nx+i.xy[0],ny+i.xy[1]],[ndx,ndy]))
  53.       end
  54.     end
  55.   end
  56.   #四舍五入
  57.   def geti(k)
  58.     if k-k.to_i > 0.5
  59.       return k=k.to_i+1
  60.     end
  61.     k=k.to_i
  62.   end
  63. end
复制代码

原理很简单
就是重复线段
然后输入初始线段和分化模式
然后就可以让他算下去
一些解释线由初始位置和向量表示 每一次运算 都是把前一次状态的每一线段转化成分化模式里面的线
分化模式里的线长度为一就是转化的线段长等于原长度
用图片来说话 就是
1.png
原线段+分化模式=后线段
如此循环
输入初始状态及分化模式后 用 xxx.get_bitmap(n)获取位图


下面是我生成的一些分形图
分形图 y.png
kkk.gif
6.png
a7.png
5.png
7.png
4.gif
2.gif
1.png
3.png

初始状态稍稍不同
结果便很不同
呃
真的很好玩

5.14更新
前几天拓展到了C4D上
不过我的创意和渲染技巧极烂
下为其一
3d分形 k.gif
p2_0107.png
pp2_i3_0107.png

评分

参与人数 1星屑 +166 收起 理由
cinderelmini + 166 黑……黑科技!

查看全部评分

高冷水

梦石
0
星屑
1069
在线时间
1520 小时
注册时间
2012-7-9
回帖
4542

开拓者

发表于 2017-5-12 12:47:10 | 显示全部楼层
可以试试 processing

点评

感谢告知 :)  发表于 2017-5-12 19:13
正在做游戏...
回复

使用道具 举报

梦石
8
星屑
4809
在线时间
1568 小时
注册时间
2014-1-9
回帖
373

开拓者

发表于 2017-5-12 22:51:07 来自手机 | 显示全部楼层
被黑科技吓到了…
回复

使用道具 举报

老黄鸡

梦石
4
星屑
45705
在线时间
7948 小时
注册时间
2009-7-6
回帖
13338

MZ评测员RM创作大赛01组委会开拓者贵宾

发表于 2017-5-13 09:27:57 | 显示全部楼层
这个相当有意思啊,允许改造这个脚本吗?

点评

请随意啦 昨天把他移植到了C4D 不过发现缺乏创意是一个硬伤  发表于 2017-5-13 12:23
RGDirect - DirectX驱动的RGSS,点我了解.
(排满,暂停)RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部