非重叠圆的螺旋

Spiral of non-overlapping circles

我想创建一个永远不会相互重叠的螺旋形圆形标记。这是我目前得到的结果,但它与第一​​个标记重叠,而最后一个标记彼此相距太远。

t = pi : pi/20 : 20*pi;
t = asind(1./t);
r = t;
x = r .* cos(t);
y = r .* sin(t);
plot(x,y,'o-');
axis equal; hold on 

不将 t 重新定义为 asinf(1/t) 的绘图如下所示,如第二个绘图所示。

t = pi : pi/20 : 20*pi;
r = t;
x = r .* cos(t);
y = r .* sin(t);
plot(x,y,'o-');

关于角度 t 的间距必须如何才能使标记不重叠,有什么想法吗?

试试这个:

syms s;
scale = 10;
l = scale/2 : scale/2 : 40*scale;
t = double(arrayfun(@(y) vpasolve((0.5*(s*sqrt(1+s^2)+asinh(s)))==y,s), l));
x = t .* cos(t);
y = t .* sin(t);
plot(x,y,'o-');
pbaspect([1 1 1]);
axis(scale*[-5 5 -5 5])

想法是使用曲线的弧长进行参数化。该螺旋的弧长为 l=1/2*(t*sqrt(1+t*t)+asinh(t))(可以使用 Matlab 符号积分找到)。为了均匀放置点,我们对弧长进行均匀采样,通过求解方程找到对应的t。由于它不能简单地用符号求解,所以我们使用数值求解器。

请注意,绘图的比例和纵横比对于它看起来均匀且不重叠非常重要。这就是我添加 axis/ratio 定义的原因。由于每个点都是用数值求解的,因此可能需要相当长的时间来进行评估。可能有更快的方法,但至少你有一个结果。

我得到以下结果:

你可以近似弧长,大大简化。这是一种简化,这意味着标记之间的距离并非处处相同。然而,距离相当一致,尤其是更远的地方。

这里的近似是假设螺旋在局部是一个圆。弧长 r*dt 在螺旋线中距离原点 r 的位置,角度变化 dt 弧度。

我们现在不再需要求解符号方程。我写了一个循环的代码。我确信可以对其进行矢量化,使整个事情成为两行代码,但我会将其作为练习留给 reader.

这是代码:

d = 1; % step size
q = 1/(2*pi); % spiral constant -- radius grows by q every 1 radian turn
N = 300; % number of points

t = 0; % initial angle
r = d; % initial radius
p = zeros(100,2);
p(1,:) = [r*cos(t),r*sin(t)]; % first point
for ii=2:N
   dt = d/r;
   t = t+dt;
   r = r+dt*q;
   p(ii,:) = [r*cos(t),r*sin(t)];
end

clf
plot(p(:,1),p(:,2),'o-') 
axis equal