【问题标题】:Spiral of non-overlapping circles非重叠圆的螺旋
【发布时间】:2019-04-07 02:11:36
【问题描述】:

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

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 的间距必须如何实现标记不重叠的任何想法?

【问题讨论】:

  • 我将继续说明一个明显的说法,即间距不应该是恒定的。但是你需要比我更擅长数学的人来获得正确的间距形式。
  • 同意。这正是我想要找到的间距。谢谢!
  • 您为间距提供的第二个公式与第一个公式完全相同。是不是搞错了?

标签: matlab plot spiral


【解决方案1】:

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

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

我们现在不再需要求解符号方程。我在一个循环中编写了代码。我确信可以对其进行矢量化处理,使整个事情变成两行代码,但我将把它作为练习留给读者。

这是代码:

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

【讨论】:

    【解决方案2】:

    试试这个:

    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。由于它不容易用符号求解,我们使用数值求解器。

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

    我得到以下结果:

    【讨论】:

    • 我使用 Octave Online 来做这件事,因为我的电脑上没有 Matlab。语法和行为应该相同。告诉我它是否有效,是否能解决您的问题。
    猜你喜欢
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多