在 Julia 中的两个已知点之间绘制等角螺旋

Drawing an equiangular spiral between two known points in Julia

提问人:AaronJPung 提问时间:7/20/2022 最后编辑:AaronJPung 更新时间:7/24/2022 访问量:135

问:

我在 2D 笛卡尔网格中有两个随机点,并且 .我想定义一条 N 点之间的曲线,使该曲线形成一个等角螺旋(类似于本文中所做的(图 8))。我试过把这篇论文转换成一个脚本,但还是有些东西不对劲,所以我试图建立一个“笨拙”的例子。我最接近的尝试是这个(可以在放大时看到,但未显示在脚本的情节中):p1p2p1p2p2

using PyPlot
using LinearAlgebra
p1 = [5,7]
p2 = [1,2]
r = norm(p1-p2)
theta_offset = tan((p1[2]-p2[2])/(p1[1]-p2[1]));
# Number of points
rez = 500
# Number of revolutions
rev = 5
# Radius as spiral decreases
t = range(0,r,rez)
# Angle as spiral decreases
theta = range(0, 2*pi*rev, rez) .+ theta_offset
x = cos.(theta).*exp.(-t).+p2[1];
y = sin.(theta).*exp.(-t).+p2[2];

figure()
plot(x,y)
scatter(p1[1],p1[2],c="red",s=5)
scatter(p2[1],p2[2],c="red",s=10)
show(); gcf()

这会产生以下图:enter image description here

当绘图以(在坐标 [1,2] 处)为中心时,端点不位于/穿过我的指定点。我理想的结果是这样的:p2p1![enter image description here

编辑:使用@PaSTE的建议解决了问题。将我的 、 和 坐标计算更改为:theta_offsetxy

theta_offset = atan((p1[2]-p2[2])/(p1[1]-p2[1]));
x = cos.(theta).*exp.(-t).*r.+p2[1]
y = sin.(theta).*exp.(-t).*r.+p2[2]

产生了以下情节,正是我所希望的。在我的解决方案中,惯用手和循环次数并不重要。enter image description here

数学 Julia Spiral

评论

0赞 Mike 'Pomax' Kamermans 7/20/2022
P1 和 P2 在你的剧本情节中在哪里?(这不是要求评论来回答这个问题:我们知道它们在哪里,所以请更新你的脚本和你的帖子,以便你的图像同时包含它们,而不是一个甚至不能显示 p1 =)
3赞 PaSTE 7/20/2022
在您的实现中,您似乎在定义 .此外,和 值只能从 中获取值。正如 Pomax 所建议的那样,考虑使用 you 计算来缩放您添加的值,您将得到您正在寻找的答案。tanatantheta_offsetxyp2 .- 1p2 .+ 1rp2
0赞 AaronJPung 7/20/2022
@PaSTE,效果很好,谢谢!如果您想正式化或分离您的答案,我很乐意为您提供解决方案。

答:

0赞 Bill 7/24/2022 #1

正如 PaSTE 所说,问题出在代数上:你需要得到 atan 的角度,而不是 tan,然后将指数因子乘以 r 以获得正确的半径。

using LinearAlgebra
using Plots

p1 = [5,7]
p2 = [1,2]
r = norm(p1-p2)
theta_offset = atan((p1[2]-p2[2])/(p1[1]-p2[1]));
# Number of points
rez = 1500
# Number of revolutions
rev = 5
# Radius as spiral decreases
t = range(0,r,rez)
# Angle as spiral decreases
theta = range(0, 2*pi*rev, rez) .+ theta_offset
x = cos.(theta) .* r .* exp.(-t) .+ p2[1]
y = sin.(theta) .* r .* exp.(-t) .+ p2[2]
plot(x, y)
scatter!([p1[1], p2[1]], [p1[2], p2[2]])

评论

0赞 Bill 7/24/2022
只是为了这里的(迟到)记录。