记录用于生成随机形状的matlab代码

时间:2014-04-11 06:41:07

标签: matlab shapes

你能帮我记录下这个应该产生随机形状的Matlab代码吗?形状的晃动应该由可变程度控制......

但是如何产生rho(半径值)......我真的无法得到它......

degree = 5;
numPoints = 1000;
blobWidth = 5;    

theta = 0:(2*pi)/(numPoints-1):2*pi;

coeffs = rand(degree,1);
rho = zeros(size(theta));
for i = 1:degree
    rho = rho + coeffs(i)*sin(i*theta);
end

phase = rand*2*pi;

[x,y] = pol2cart(theta+phase, rho+blobWidth);
plot(x,y)
axis equal 
set(gca,'Visible','off')

2 个答案:

答案 0 :(得分:3)

theta = 0:(2*pi)/(numPoints-1):2*pi;

所以这只是一个革命角度的矢量,如果你将这个theta绘制成一个恒定的rho(在调用pol2cart之后)你会得到一个圆圈:

r = ones(size(theta));
[x,y] = pol2cart(theta, r);
plot(x,y)
axis equal

如果您了解pol2cart的作用,这应该是显而易见的,因为您有一系列圆圈中的所有角度和所有角度的恒定半径。如果您不理解(即极坐标),那么这是一个非常基本的数学概念,您需要在尝试理解此代码之前自行阅读。

好的,现在笛卡尔坐标中的圆圈只是极坐标中的一条线(即曲线(theta,r),注意到水平轴现在代表角度而垂直代表半径)。因此,如果我们想随机搞乱我们的圈子,我们可能会随机搞乱我们的线路。使用sin可以很顺利地完成此操作。添加许多sin波的随机频率会增加越来越少的可预测“抖动”。我认为,如果您在代码中添加以下行,将有助于您理解:

rho = zeros(size(theta));
hold all
for i = 1:degree
    rho = rho + coeffs(i)*sin(i*theta);
    plot(theta, rho)
end

并将其与之对比(确保在运行之前关闭图形窗口)

rho = zeros(size(theta));
hold all
for i = 1:degree
    rho = rho + coeffs(i)*sin(i*theta);
    plot(theta, coeffs(i)*sin(i*theta))
end

第二个显示使用的sin波的不同频率,第一个显示这些总和如何产生不可预测的波浪线。现在想想pol2rect函数将这些线弯曲成一个“圆圈”。如果直线是直线的,你会得到一个完美的圆圈,如果它是波浪状的,你会得到一个“波浪”圆圈。

您的代码中的

degree只控制要加起来的sin个wave。

最后phase = rand*2*pi;只是在创建后随机旋转你的形状。

答案 1 :(得分:2)

嗯,这是一段惊人的代码!但关于rho。所做的是你有一个基本半径为5(blobwidth)的圆,然后你有一个随机偏移coeffs。然后将偏移量添加到rho中的rho = rho + coeffs(i)*sin(i*theta);。这意味着第一个循环偏移量被添加到频率为1Hz的圆圈中。然后,这产生恒定的偏移。下一个循环频率增加到2Hz。然后,偏移将被添加到每个第二点,并且偏移也可以是负的。然后它继续这样下去。最后,坐标转换为极地。

虽然有一些评论。创建theta最可读和最简单的方法是使用linspace。而且,由于rho在循环中被覆盖,您也可以将其定义为rho = 0;