提问人:AaronJPung 提问时间:7/20/2022 最后编辑:AaronJPung 更新时间:7/24/2022 访问量:135
在 Julia 中的两个已知点之间绘制等角螺旋
Drawing an equiangular spiral between two known points in Julia
问:
我在 2D 笛卡尔网格中有两个随机点,并且 .我想定义一条 N 点之间的曲线,使该曲线形成一个等角螺旋(类似于本文中所做的(图 8))。我试过把这篇论文转换成一个脚本,但还是有些东西不对劲,所以我试图建立一个“笨拙”的例子。我最接近的尝试是这个(可以在放大时看到,但未显示在脚本的情节中):p1
p2
p1
p2
p2
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()
当绘图以(在坐标 [1,2] 处)为中心时,端点不位于/穿过我的指定点。我理想的结果是这样的:p2
p1
编辑:使用@PaSTE的建议解决了问题。将我的 、 和 坐标计算更改为:theta_offset
x
y
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]
答:
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
只是为了这里的(迟到)记录。
上一个:螺旋矩阵 java
评论
tan
atan
theta_offset
x
y
p2 .- 1
p2 .+ 1
r
p2