当前位置:网站首页>MATLAB | 一种简易的随机曼陀罗图形生成函数
MATLAB | 一种简易的随机曼陀罗图形生成函数
2022-08-03 15:58:00 【slandarer】
逛Wolfram Alpha
艺术展的时候看到了一个很有趣的随机曼陀罗图像生成函数库,本人尝试仿写了一个简易版本,原始函数大体原理就是生成一系列随机点之后对其进行多次旋转,思想非常简单。
完整代码
function randMandalas(varargin)
% @author : slandarer
% @公众号 : slandarer随笔
pntNum=randi([5,6],[1,1]); % 随机点数量
rotateTimes=randi([5,6],[1,1]); % 旋转次数
randLenth=zeros([1,pntNum]);
disMat=inf.*ones(pntNum);
% 生成距离不太近,半径不太小的随机点
while all(randLenth<0.8)||any(any(disMat<0.5))
randTheta=rand([1,pntNum]).*2.*pi;
randLenth=rand([1,pntNum]);
disMat=abs((randLenth-randLenth').*(randTheta+randTheta')./2);
disMat(eye(pntNum)==1)=inf;
end
randTheta=[randTheta,randTheta(1)];
randLenth=[randLenth,randLenth(1)];
X0=cos(randTheta).*randLenth;
Y0=sin(randTheta).*randLenth;
% 坐标区域修饰
if nargin<2
ax=gca;
else
ax=varargin{
1};
varargin(1)=[];
end
if nargin==0
varargin{
1}='fill';
end
hold on;
ax.XLim=[-1,1];
ax.YLim=[-1,1];
ax.XColor='none';
ax.YColor='none';
ax.PlotBoxAspectRatio=[1,1,1];
% 绘制图像
[tX1,tY1]=rotateData(X0,Y0,2*pi/rotateTimes);
[tX2,tY2]=rotateData(-X0,Y0,2*pi/rotateTimes);
showPnts(ax,tX1,tY1,varargin{
1})
showPnts(ax,tX2,tY2,varargin{
1})
for i=1:rotateTimes-1
[tX1,tY1]=rotateData(tX1,tY1,2*pi/rotateTimes);
[tX2,tY2]=rotateData(tX2,tY2,2*pi/rotateTimes);
showPnts(ax,tX1,tY1,varargin{
1})
showPnts(ax,tX2,tY2,varargin{
1})
end
% 根据方法绘制图像
function showPnts(ax,X,Y,tmethod)
switch tmethod
case 'line'
plot(ax,X,Y,'Color',[0 0 0]);
case 'fill'
fill(ax,X,Y,[0 0 0],'FaceAlpha',.2);
case 'bezier'
XY=bezierCurve([X(:),Y(:)],50);
plot(ax,XY(:,1),XY(:,2),'Color',[0 0 0]);
case 'bfill'
XY=bezierCurve([X(:),Y(:)],80);
fill(ax,XY(:,1),XY(:,2),[0 0 0],'FaceAlpha',.2);
end
end
% 数据旋转角度
function [X,Y]=rotateData(X,Y,theta)
rotateMat=[cos(theta),-sin(theta);sin(theta),cos(theta)];
XY=rotateMat*[X;Y];
X=XY(1,:);Y=XY(2,:);
end
% 贝塞尔函数
function pnts=bezierCurve(pnts,N)
t=linspace(0,1,N);
p=size(pnts,1)-1;
coe1=factorial(p)./factorial(0:p)./factorial(p:-1:0);
coe2=((t).^((0:p)')).*((1-t).^((p:-1:0)'));
pnts=(pnts'*(coe1'.*coe2))';
end
end
使用方法
基本使用:\运行以下代码会随机生成一个贝塞尔曲线插值的随机填充图像。
randMandalas('bfill')
多子图示例:
M=3;N=3;
for m=1:M
for n=1:N
axes(gcf,'Position',[(n-1)/N,(m-1)/M,1/N,1/M])
randMandalas('bfill')
end
end
其他方法:
对于同一组随机数种子,将参数分别变为line
、fill
、bezier
、bfill
的效果对比:
line
fill
bezier
bfill
可以看出还是贝塞尔曲线插值后的图像更顺滑好看!
图像赋色
原理就是读取图片后,使用colormap
函数将灰度映射到颜色:
原图:(图像导出时尽量选择高分辨率)
tpic=imread('test.png');
surf(tpic(:,:,1),'EdgeColor','none');
hold on;axis equal;view(2);
set(gca,'XTick',[],'YTick',[],'XColor','none','YColor','none','Ydir','reverse')
CList=[parula(15);1,1,1];
% CList=[PYCM().cubehelix(15);1,1,1];
colormap(CList)
其他 colormap
当然除了parula
配色,MATLAB自带的其他配色也可用:
pink
bone
PYCM
本人自写的PYCM
函数也可用,使用方式见代码片中的注释。有关PYCM
函数的介绍可点击链接跳转推送:
https://mp.weixin.qq.com/s/fHpCRQxD39_mBcPpLU0xpA
cubehelix
GnBu
magma
PuOr
RdBu
RdYlBu
Spectral
边栏推荐
- 一文看懂推荐系统:召回01:基于物品的协同过滤(ItemCF),item-based Collaboration Filter的核心思想与推荐过程
- 【Unity入门计划】制作RubyAdventure01-玩家的创建&移动
- window.open不显示favicon.icon
- 深度学习GPU最全对比,到底谁才是性价比之王?
- mysql delete 执行报错:You can‘t specify target table ‘doctor_info‘ for update in FROM clause
- 【码蹄集新手村600题】将一个函数定义宏
- Go Go 简单的很,标准库之 fmt 包的一键入门
- leetcode:899. 有序队列【思维题】
- Difference and performance comparison between HAL and LL library of STM32
- JS基础--判断
猜你喜欢
随机推荐
新一代网状网协议T-Mesh无线通信技术优势介绍
【QT】Qt项目demo:数据在ui界面上显示,鼠标双击可弹窗显示具体信息
ECCV 2022 | 基于关系查询的时序动作检测方法
Detailed explanation of ReentrantReadWriteLock
瞌睡检测系统介绍
ReentrantReadWriteLock详解
高可用版 主数据库数据结构改变 备数据库会自动改变吗
为教育插上数字化的翅膀,网易云信发布「互联网+教育」整体解决方案
【QT】Qt 给已经开发好的程序快速封装成动态库
想进阿里?先来搞懂一下分布式事务
基于牛顿方法在直流微电网潮流研究(Matlab代码实现)
posgresql 到 es 报这个错误 ,啥意思
ffplay视频播放原理分析
托尔斯泰:生活中只有两种不幸
spark入门学习-2
DataGrip数据仓库工具
To participate in sweepstakes, incoming new programmers magazine welfare!
红蓝对抗经验分享:CS免杀姿势
请问大家,MySQL全量怎么样可以提高性能呢?我这里瓶颈是在Source上,在不增加并行度的情况下,
不可忽略!户外LED显示屏的特点及优势