You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

求以A为起点的两点A、B间conical helix轨迹的绘制方程

连接A、B两点的圆锥螺旋线(Conical Helix)方程推导与示例

嘿,我明白你想要的是连接A、B两点的圆锥螺旋线轨迹方程,不用慌,我尽量用直白的方式给你讲清楚,不用太纠结复杂的数学术语~

核心思路

圆锥螺旋线的本质是:沿着一条直线(A到B的轴线)做直线运动的同时,绕着这条轴线做圆周运动,并且圆周的半径随运动距离线性变化(这也是它和圆柱螺旋线的核心区别——圆柱螺旋线半径始终不变)。

关键参数设定

先给两个点定个坐标,方便后续推导:

  • A点坐标:$(x_1, y_1, z_1)$
  • B点坐标:$(x_2, y_2, z_2)$
  • 螺旋圈数:$n$(你可以自己设定,比如3圈、5圈,数值越大螺旋越密集)
  • 半径变化:设A点处的螺旋半径为$r_0$,B点处为$r_1$(如果A是圆锥顶点,那$r_0=0$;如果想要两端半径一致,那$r_0=r_1$,但这其实更接近圆柱螺旋线)
  • 参数$t$:范围从0到1,$t=0$对应A点,$t=1$对应B点

完整参数方程

首先计算几个基础向量:

  1. AB的方向向量:$\vec{v} = (x_2-x_1,\ y_2-y_1,\ z_2-z_1)$
  2. 找两个垂直于$\vec{v}$且互相垂直的单位向量$\vec{u}1=(u{1x},u_{1y},u_{1z})$和$\vec{u}2=(u{2x},u_{2y},u_{2z})$(具体生成方法见下文)
  3. 随t变化的半径:$r(t) = r_0 + (r_1 - r_0)t$

最终的参数方程为:
$$
\begin{align*}
x(t) &= x_1 + t(x_2-x_1) + r(t) \cdot \left( \cos(2\pi n t) \cdot u_{1x} + \sin(2\pi n t) \cdot u_{2x} \right) \
y(t) &= y_1 + t(y_2-y_1) + r(t) \cdot \left( \cos(2\pi n t) \cdot u_{1y} + \sin(2\pi n t) \cdot u_{2y} \right) \
z(t) &= z_1 + t(z_2-z_1) + r(t) \cdot \left( \cos(2\pi n t) \cdot u_{1z} + \sin(2\pi n t) \cdot u_{2z} \right)
\end{align*}
$$

如何生成垂直单位向量$\vec{u}_1$和$\vec{u}_2$?

如果AB的方向向量$\vec{v}=(a,b,c)$不是零向量(显然A、B不重合),可以这样操作:

  • 先找一个和$\vec{v}$不共线的向量,比如如果$\vec{v}$不是沿着z轴,就取$(1,0,0)$;如果$\vec{v}$是$(0,0,c)$,直接取$(1,0,0)$即可
  • 计算叉乘:$\vec{w} = \vec{v} \times (1,0,0)$,然后归一化得到$\vec{u}_1 = \frac{\vec{w}}{|\vec{w}|}$
  • 再计算叉乘:$\vec{u}_2 = \frac{\vec{v} \times \vec{u}_1}{|\vec{v} \times \vec{u}_1|}$,这样$\vec{u}_1$和$\vec{u}_2$就满足垂直于轴线且互相垂直的要求了

简单示例(适合绘图测试)

假设:

  • A点:$(0,0,0)$(圆锥顶点)
  • B点:$(0,0,10)$(沿着z轴的底面中心)
  • 圈数$n=3$
  • B点半径$r_1=2$(所以$r(t)=2t$)
  • $\vec{u}_1=(1,0,0)$,$\vec{u}_2=(0,1,0)$

代入方程后得到可直接用于绘图的代码:

# t的范围是0到1,取1000个点足够平滑
import numpy as np
t = np.linspace(0, 1, 1000)
x = 2*t * np.cos(2*np.pi*3*t)
y = 2*t * np.sin(2*np.pi*3*t)
z = 10*t

用Matplotlib绘制的话,就是一条从原点绕z轴转3圈,半径从0增加到2,最终到达(0,0,10)的标准圆锥螺旋线。

小提示

  • 如果A、B不在坐标轴上,只需要按照上面的方法计算$\vec{u}_1$和$\vec{u}_2$就行,代入方程的逻辑完全一样
  • 调整$n$可以改变螺旋的圈数,调整$r_0$和$r_1$可以控制两端的半径大小

内容的提问来源于stack exchange,提问作者Shdotcom

火山引擎 最新活动