闪电动画模拟(Dielectric Breakdown Model)附源码
当两个物体之间存在较大的电势差时会出现放电现象,比如生活中常见的闪电现象,闪电形成的条件就是云层积累了大量负电荷之后与地面之间形成了强大的电势差。目前关于闪电建模的方法比较少,下面介绍一种利用电介击穿模型来模拟闪电的方法,电介击穿模型可以模拟自然界许多现象,该方法通过迭代求解Laplace方程得到放电过程的中间状态。
初始电位结构如下图所示,首先在2维栅格正中心的单元放置一个负电荷Ф = 0(灰色),然后在其周围放置一圈正电荷Ф = 1(黑色),而其他栅格单元可以通过求解Laplace方程得到:
Laplace方程求解完之后,我们构建一个列表记录负电荷(Ф = 0)周围的栅格单元,并随机选取其中一个单元作为下一个被击穿的单元,被选中的栅格单元设置Ф = 0,同时把它作为下一步迭代计算时的边界条件。
相邻栅格单元被击穿的概率与其计算得到的电势相关,其概率如下:
式中i代表第i个与负电荷相邻的栅格单元,n代表与负电荷相邻的栅格单元个数,而η是一个用户设定的参数,通过实验表明η值可以控制电弧的分叉密度,当η = 1时,分叉密集,当η逐渐增大时,分叉密度慢慢减小。
图:不同结构的初始电位,其中灰色点代表负电荷Ф = 0,黑色点代表正电荷Ф = 1
图:初始电位为(b)结构时的模拟结果
左:η = 1,中:η = 2,右:η = 3
% Laplacian Growth Model
clc
clear all
close all w = ; % width
h = ; % height
eta = ; % 指定正负电荷
ni = floor(w/)*h + (:)'; % negative charge
pi = ((:w)' - 1)*h + h; % positive charge % 构建laplace矩阵
S1 = bsxfun(@plus, ((:(w-)) - )*h, (:h)');
D1 = bsxfun(@plus, ((:w) - )*h, (:h)');
S2 = bsxfun(@plus, ((:w) - )*h, (:(h-))');
D2 = bsxfun(@plus, ((:w) - )*h, (:h)'); S = [S1(:); S2(:)];
D = [D1(:); D2(:)];
A = sparse([S D], [D S], );
n = size(A,);
% Lp = speye(h*w) - bsxfun(@rdivide, A, sum(A,));
Lp = spdiags(sum(A,), , n, n) - A;
rhs = zeros(n, ); % 循环计算下一步状态
[X0, Y0] = ind2sub([h,w], (:h*w)');
im = zeros(h,w);
iter = ;
i = ;
while ~any(ismember(ni, pi))
phi = solve_equation(Lp, rhs, [ni;pi], [zeros(size(ni));ones(size(pi))]); [~, adj] = find(A(ni,:));
adj = unique(adj);
adj = adj(~ismember(adj, ni)); k = randsample(adj, , true, phi(adj).^eta/sum(phi(adj).^eta));
ni = [ni; k]; if mod(iter,) ==
[X, Y] = ind2sub([h,w], ni);
[~, dis] = knnsearch([X,Y], [X0,Y0]);
im = reshape(-dis/, [h,w]); imshow(im, 'Border','tight');
drawnow; Frame(i) = getframe(gcf);
i = i + ;
end
fprintf('iteration: %d ...\n', iter);
iter = iter + ;
end
本文为原创,转载请注明出处:http://www.cnblogs.com/shushen。
参考文献:
[1] Theodore Kim and Ming C. Lin. 2007. Fast Animation of Lightning Using an Adaptive Mesh. IEEE Transactions on Visualization and Computer Graphics 13, 2 (March 2007), 390-402.
最新文章
- 自定义控件设置属性并实时展现并预览在xib中
- UIColletionView 的属性与常用方法介绍
- python成长之路【第二篇】:列表和元组
- NBU恢复报:ORA-19554 ORA-27211
- aspx控件属性
- MySQL	存储过程学习笔记
- libevent入门教程
- lightoj 1013 dp
- C程序设计语言练习题1-18
- euctb
- CSS技巧!像table一样布局div
- python从入门到实践-5章if语句
- JS 无限长form表单提交
- tensorboard基础使用
- 卷积神经网络CNN的原理(三)---代码解析
- N!分解质因子p的个数_快速求组合数C(n,m)
- egrep 实用参数
- 自然语言处理工具hanlp关键词提取图解TextRank算法
- ORACLE grant权限
- 事件分发机制 事件拦截 滑动冲突 MD
热门文章
- C# MVC绑定 List<;DapperRow>;到bootstrap-table列表
- Debian 7 安装配置总结
- Oracle账户解锁/锁定
- 原生JS:delete、in、typeof、instanceof、void详解
- 纯CSS3魔方的制作
- window搭建webpack,react,babel傻瓜教程
- iOS中延时执行的几种方式的比较和汇总
- SharePoint 2013 Excel Services ECMAScript 示例之明日限行
- 深入浅出React Native 2: 我的第一个应用
- Android客户端与Eclipse服务器端的Socket通信