你能帮我记录下这个应该产生随机形状的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')
答案 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;