Processing 分形之三 —— Diffusion-Limited Aggregation

2023-10-08 16:30

本文主要是介绍Processing 分形之三 —— Diffusion-Limited Aggregation,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

人类一思考,上帝就发笑。
——米兰·昆德拉 《生命中不能承受之轻》

大自然创造出瑰丽奇特的珊瑚,Witten和Sander共同提出了DLA。唐代冯延巳有诗云:“年少王孙有俊才,登高欢醉夜忘回。歌阑赏尽珊瑚树,情厚重斟琥珀杯。但愿千千岁,金菊年年秋解开。”可世人皆知珊瑚美,哪知DLA也奇妙。

Tree Corals
They look fabulous, like underwater bonsai trees that have been painted by Salvador Dali.

这里写图片描述

3D DLA
For many years now the ultimate inspiration in DLA for me has been Andy Lomas.
More Works: http://www.andylomas.com/aggregationImages.html

这里写图片描述

##8.1 Diffusion-Limited Aggregation
###8.1.1 Basic Idea
时光易逝,容颜易老?且看度娘怎么说

首先置一初始粒子作为种子,在远离种子的任意位置随机产生一个粒子使其做无规行走,直至与种子接触,成为集团的一部分;然后再随机产生一个粒子,重复上述过程,这样就可以得到足够大的DLA团簇(cluster)。

君未尝与吾相知,亦无所怨。你该怎么看

故事发生在一个被小酒馆包围的城市广场上。醉鬼们离开酒馆,开始在广场上游荡。直到他们终于遇到了一个没有任何意义的同伴,而在那时候,他们躺下睡着了,传来平静的打鼾声。你是否想亲眼看看第二天早晨睡觉人群的鸟瞰图?

这里写图片描述

Learn More: 我的博客 DLA - Diffusion Limited Aggregation

In a word, DLA即颗粒通过随机移动接触并粘附到现有固定颗粒而产生支化和珊瑚状的结构
###8.1.2 Real Life Experiments
在电沉积池中加入硫酸铜溶液, you can get results like the following images:

这里写图片描述
###8.1.3 You Should Know
创始人之一Sander曾经总结过DLA 的研究意义:

  1. 模型用极其简单的算法抓住了广泛的自然现象的关键成分却没有明确的物理机制;
  2. 通过简单的运动学和动力学过程就可以产生具有标度不变性的自相似的分形结构,从而建立分形理论和实验观察之间的桥梁,在一定程度上揭示出实际体系中分形生长的机理
  3. 界面具有复杂的形状和不稳定性的性质,生长过程是一个远离平衡的动力学过程,但集团的结构却有稳定且确定的分形维数

##8.2 The Story of the Drunkards
###Story Outlines:
这里写图片描述

① 夜黑风高,在一个被小酒馆包围的城市广场上;

 size(800, 800);//地点background(0);//时间

② “半斤不是酒,一斤扶墙走,斤半墙走我不走。”不知何时,冒出来一个醉鬼,躺卧在广场的中央;

sleepers.add(new Drunkard(width/2, height/2));	//广场中央的醉鬼

③ 接着,四周纷纷又走出许多醉鬼;

//四周随机冒出醉鬼
PVector randomDrunkard() {float i = random(4);  //4种可能性PVector p = new PVector();float x = random(width);float y = random(height);if (i <= 1) {  //顶部p = new PVector(x, 0);} else if (i <= 2) {  //底部p = new PVector(x, height);} else if (i <= 3) {  //右边缘 p = new PVector(0, y);} else if (i <= 4) {  //左边缘 p = new PVector(width, y);}return p;}

④ 他们在广场四周游荡,毫无目的可言;

void walk() {vel = PVector.random2D();  //毫无目的地游荡pos.add(vel);//只在广场上活动pos.x = constrain(pos.x, 0, width);pos.y = constrain(pos.y, 0, height);}

⑤ 可一旦他们瞧见脚下有睡觉的人,他们自己也会情不自禁地倒下睡觉;

//是否倒下睡觉
boolean checkStuck(Drunkard dr) {float d = dist(pos.x, pos.y, dr.pos.x, dr.pos.y);if (d < sqrt(radius * dr.radius * 2 * 2)) { if (random(1) < 0.1) {return true;}}return false;}

⑥ 第二天清晨,自广场上空飞过的无人机就拍下了这戏剧性的一幕。

//显示操作
void draw() {background(0);//显示移动的醉鬼和睡觉的醉鬼  for (Drunkard m : movers) {m.show();}for (Drunkard s : sleepers) {s.show();//限制醉鬼在广场内if (s.pos.y >= height || s.pos.y <= 0 || s.pos.x >= width || s.pos.x <= 0) {limit = true;}}for (int n = 0; n < iterations; n++) {for (int i = movers.size() - 1; i > 0; i--) {Drunkard m = movers.get(i);m.walk();for (Drunkard s : sleepers) {if (s.checkStuck(m)) {m.stuck = true;sleepers.add(m);          break;}}}}//醉鬼人数的增长while (movers.size() < maxDrunkards && limit == false) {movers.add(new Drunkard());}
}

###Source Code:
Let’s make up this story——

/*** The Story of the Drunkards* @微信公众号:维度模态* @author:Hewes* @date 2017/08/26*///存储移动的醉鬼和睡觉的醉鬼们
ArrayList<Drunkard> movers = new ArrayList<Drunkard>(); 
ArrayList<Drunkard> sleepers = new ArrayList<Drunkard>();int maxDrunkards = 500; //醉鬼的数目
int iterations = 500;	//决定图形生长速度
boolean limit = false;void setup() {size(800, 800);sleepers.add(new Drunkard(width/2, height/2)); //中央的醉鬼  //初始其余的醉鬼for (int i = 0; i < maxDrunkards; i++) {movers.add(new Drunkard());}
}//显示操作
void draw() {background(0);for (Drunkard m : movers) {m.show();}for (Drunkard s : sleepers) {s.show();//限制静止醉鬼在广场内if (s.pos.y >= height || s.pos.y <= 0 || s.pos.x >= width || s.pos.x <= 0) {limit = true;}}for (int n = 0; n < iterations; n++) {for (int i = movers.size() - 1; i > 0; i--) {Drunkard m = movers.get(i);m.walk();for (Drunkard s : sleepers) {if (s.checkStuck(m)) {m.stuck = true;sleepers.add(m);movers.remove(i); break;}}}}//醉鬼人数的增长while (movers.size() < maxDrunkards && limit == false) {movers.add(new Drunkard());}
}//醉鬼类
class Drunkard {PVector pos;PVector vel;boolean stuck;int radius;//移动的醉鬼Drunkard() {pos = randomDrunkard();  //随机初始位置stuck = false;  //初始状态radius = 6;  //粒子半径}//睡觉的醉鬼Drunkard(int x, int y) {pos = new PVector(x, y);stuck = true;radius = 6;}//四周随机出现的醉鬼PVector randomDrunkard() {float i = random(4);  //4种可能性PVector p = new PVector();float x = random(width);float y = random(height);if (i <= 1) {  //顶部p = new PVector(x, 0);} else if (i <= 2) {  //底部p = new PVector(x, height);} else if (i <= 3) {  //右边缘 p = new PVector(0, y);} else if (i <= 4) {  //左边缘 p = new PVector(width, y);}return p;}//醉鬼的移动void walk() {vel = PVector.random2D();  //随机移动速度pos.add(vel);pos.x = constrain(pos.x, 0, width);pos.y = constrain(pos.y, 0, height);}//以圆代表醉鬼void show() {noStroke();if (stuck) {fill(0, 200, 0);} else {fill(300, 100, 100);}ellipse(pos.x, pos.y, radius * 2, radius * 2);}//是否睡觉boolean checkStuck(Drunkard dr) {float d = dist(pos.x, pos.y, dr.pos.x, dr.pos.y);if (d < sqrt(radius * dr.radius * 2 * 2)) { if (random(1) < 0.1) {return true;}}return false;}
}

##8.3 Processing与DLA
以黑色像素点作为醉鬼形象:

这里写图片描述

将屏幕边缘设置为睡觉的醉鬼:

这里写图片描述

以圆周作为目标区域,从广场中央走出醉鬼:

这里写图片描述

嫌像素点太小?试试这个吧:

这里写图片描述

太单调?加点颜色:

这里写图片描述

导入Box2d:

这里写图片描述

See more, try more:

这里写图片描述

这里写图片描述

##8.4 3D DLA
分享几个DLA神级作品:
####Karsten Schmidt’s Works:

这里写图片描述

这里写图片描述

这里写图片描述

####Jason’s Works:

列表内容

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

列表内容

五花马,千金裘,呼儿将出换美酒,与尔同消万古愁。The story of the drunkards
 is over, I will definitely come back!

这篇关于Processing 分形之三 —— Diffusion-Limited Aggregation的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/166585

相关文章

2024年 Biomedical Signal Processing and Control 期刊投稿经验最新分享

期刊介绍 《Biomedical Signal Processing and Control 》期刊旨在为临床医学和生物科学中信号和图像的测量和分析研究提供一个跨学科的国际论坛。重点放在处理在临床诊断,患者监测和管理中使用的方法和设备的实际,应用为主导的研究的贡献。 生物医学信号处理和控制反映了这些方法在工程和临床科学的界面上被使用和发展的主要领域。期刊的范围包括相关的评论论文(review p

使用亚马逊Bedrock的Stable Diffusion XL模型实现文本到图像生成:探索AI的无限创意

引言 什么是Amazon Bedrock? Amazon Bedrock是亚马逊云服务(AWS)推出的一项旗舰服务,旨在推动生成式人工智能(AI)在各行业的广泛应用。它的核心功能是提供由顶尖AI公司(如AI21 Labs、Anthropic、Cohere、Meta、Mistral AI、Stability AI以及亚马逊自身)开发的多种基础模型(Foundation Models,简称FMs)。

Differential Diffusion,赋予每个像素它应有的力量,以及在comfyui中的测试效果

🥽原论文要点 首先是原论文地址:https://differential-diffusion.github.io/paper.pdf 其次是git介绍地址:GitHub - exx8/differential-diffusion 感兴趣的朋友们可以自行阅读。 首先,论文开篇就给了一个例子: 我们的方法根据给定的图片和文本提示,以不同的程度改变图像的不同区域。这种可控性允许我们再现

diffusion model 合集

diffusion model 整理 DDPM: 前向一步到位,从数据集里的图片加噪声,根据随机到的 t t t 决定混合的比例,反向要慢慢迭代,DDPM是用了1000步迭代。模型的输入是带噪声图和 t,t 先生成embedding后,用通道和的方式加到每一层中间去: 训练过程是对每个样本分配一个随机的t,采样一个高斯噪声 ϵ \epsilon ϵ,然后根据 t 对图片和噪声进行混合,将加噪

oracle startup失败,ORA-01078: failure in processing system parameters

SQL> startup ORA-01078: failure in processing system parameters LRM-00109: could not open parameter file '/data/oracle/product/11.2.0/db_1/dbs/initorc1.ora'   出错的原因可能是:文件名字不正确,文件权限不对,文件不存在,文件损坏 下面以文

Fourier TransformHilbert TransformRelated Function's MATLAB Simulation in Signal Processing

Fourier Transform:对于平稳信号有着明确的物理意义,频域反应各频率成分,可用于滤除高频噪声分量Hilbert  Transform:平稳信号分析,在信号分析和贷通信号中,理论和实用价值,SSB Walsh-Hadamand Transform:基于非正弦正交基的信号变换 ---First Of ALL---在数学与

如何在算家云搭建模型Stable-diffusion-webUI(AI绘画)

一、Stable Diffusion WebUI简介 Stable Diffusion WebUI 是一个网页版的 AI 绘画工具,基于强大的绘画模型Stable Diffusion ,可以实现文生图、图生图等。 二、模型搭建流程 1.选择主机和镜像 (1)进入算家云的“应用社区”,点击搜索或者找到"stable-diffusion-webui,进入详情页后,点击“创建应用”

Stable Diffusion【提示词】【居家设计】:AI绘画给你的客厅带来前所未有的视觉盛宴!

前言 参数设置大模型:RealVisXL V4.0 Lightning采样器:DPM++ SDE Karras采样迭代步数:5CFG:2图片宽高:1024*1024反向提示词:(octane render, render, drawing, anime, bad photo, bad photography:1.3),(worst quality, low quality, blurry:1.2

《Efficient Batch Processing for Multiple Keyword Queries on Graph Data》——论文笔记

ABSTRACT 目前的关键词查询只关注单个查询。对于查询系统来说,短时间内会接受大批量的关键词查询,往往不同查询包含相同的关键词。 因此本文研究图数据多关键词查询的批处理。为多查询和单个查询找到最优查询计划都是非常复杂的。我们首先提出两个启发式的方法使关键词的重叠最大并优先处理规模小的关键词。然后设计了一个同时考虑了数据统计信息和搜索语义的基于cardinality的成本估计模型。 1.

StyleGAN和Diffusion结合能擦出什么火花?PreciseControl:实现文本到图像生成中的精确属性控制!

之前给大家介绍过CycleGAN和Diffusion结合的一项优秀的工作,感兴趣的小伙伴可以点击以下链接阅读~ 图像转换新风尚!当CycleGAN遇到Diffusion能擦出什么火花?CycleGAN-Turbo来了! 今天给大家介绍StyleGAN和Diffusion结合的一项工作PreciseControl,通过结合扩散模型和 StyleGAN 实现文本到图像生成中的精确属性控制,该文章已