我想创建一个圆形的圆形标记,这些标记不会相互重叠。这是我到目前为止的结果,但是它与第一个标记重叠,而最后一个标记彼此相距太远。
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的间距必须如何实现以确保标记不重叠的任何想法吗?
答案 0 :(得分:4)
您可以估计圆弧长度,从而大大简化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
答案 1 :(得分:3)
尝试一下:
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
。由于无法轻松地用符号求解,因此我们使用数值求解器。
请注意,绘图的比例和纵横比对于使其看起来均匀且不重叠非常重要。这就是为什么我添加了轴/比率定义。由于每个点都是通过数值求解的,因此可能需要花费大量时间进行评估。也许有一种更快的方法,但是至少您有结果。
我得到以下结果: