geometry - 如何改变二维空间中的螺旋运动?
问题描述
正如我们在图中看到的那样,我在 2D 空间中有两个点从蓝点移动到红点,我们可以使用等式 (1)。其中b是一个常数,用来限制对数螺线的形状,l是[−1,1]中的一个随机数,用来控制运动的压痕效果,D表示蓝点到当前的距离观点
我需要另一个可以从蓝点移动到红点的运动,如图所示
解决方案
您可以使用正弦模型。
对于起点(X0, Y0)
和终点,(X1,Y1)
我们有向量 end-start,确定它的长度 - 点之间的距离L
,以及向量的角度Fi
(使用atan2
)。
然后为某些标准情况生成正弦曲线 - 例如,沿 OX 轴,幅度为A
,N
距离为2 * Pi * N
:
带参数的中间点的缩放正弦曲线t
,其中t
在范围内0..1
(t=0 对应于起点(X0,Y0)
)
X(t) = t * L
Y(t) = A * Sin(2 * N * Pi * t)
然后使用上面计算的移动X
和旋转正弦曲线Y
X_result = X0 + X * Cos(Fi) - Y * Sin(Fi)
Y_result = Y0 + X * Sin(Fi) + Y * Cos(Fi)
示例 Python 代码:
import math
x0 = 100
y0 = 100
x1 = 400
y1 = 200
nperiods = 4
amp = 120
nsteps = 20
leng = math.hypot(x1 - x0, y1 - y0)
an = math.atan2(y1 - y0, x1 - x0)
arg = 2 * nperiods* math.pi
points = []
for t in range(1, nsteps + 1):
r = t / nsteps
xx = r * leng
yy = amp * math.sin(arg * r)
rx = x0 + xx * math.cos(an) - yy * math.sin(an)
ry = y0 + xx * math.sin(an) + yy * math.cos(an)
points.append([rx, ry])
print(points)
绘制点:
推荐阅读
- angular - 如何在 Angular 中正确链接依赖的异步管道
- swift - Xcode 11.3.1 与 Firebase
- vb.net - 字符串未被识别为有效的日期时间:MyBase.Text = " / / "
- python - 集成两个函数的乘积
- javascript - 定期刷新的Vue屏幕,安全完成
- javascript - 从字符串中提取分隔的数字组
- python - 由于缺少 dateutil 模块,crontab 未执行 python 文件
- bash - 在 sed 命令中使用双引号和变量
- python - 基于用户输入的查询,返回结果,然后使用新的用户输入运行查询
- firebase - 有没有办法使用 Firebase Auth 将验证电子邮件发送到自定义电子邮件 ID(比如管理员)而不是用户的电子邮件 ID?