能否以类似正方形螺旋的方式参数化任意矩形螺旋的位置?
当然可以!不过得先理清矩形螺旋和正方形螺旋的核心差异——正方形每一圈的边长增量是固定的,而矩形因为宽高不等,每一圈的“边长步长”会跟着宽高调整,但本质上还是可以用类似的分段角度累加思路来实现,和你提到的正方形螺旋参数化逻辑是相通的。
先回顾下你提到的正方形螺旋参数化
你给出的正方形螺旋公式是通过计算每一步的转角,累加正弦和余弦值得到坐标:
$$
k(n) = \frac{\pi}{2}\left \lfloor \sqrt{4n-3} \right \rfloor
$$
$$
x(n) = \sum_{k=1}^{n} \sin(k(n))
$$
$$
y(n) = \sum_{k=1}^{n} \cos(k(n))
$$
这里的核心是正方形螺旋每走固定步数就转90度,所以角度k(n)是按固定间隔跳变的。而矩形螺旋的角度跳变间隔会跟着宽高变化,我们只需要把这个固定间隔改成动态的就行。
先看你给出的矩形螺旋例子
先明确下例子里的坐标规则(中心0对应(0,0)):
5x3矩形螺旋:
12 4 3 2 11 13 5 0 1 10 14 6 7 8 9对应的x(n)序列(n从0到14):
0, 1, 1, 0, -1, -1, -1, 0, 1, 2, 2, 2, -2, -2, -2
对应的y(n)序列:0, 0, -1,-1, -1, 0, 1, 1, 1, 1, 0, -1, -1, 0, 14x5矩形螺旋:
23 22 21 20 15 14 13 12 4 3 2 11 5 0 1 10 6 7 8 9 16 17 18 19
矩形螺旋的参数化思路
和正方形螺旋一样,我们还是用累加方向向量的分量来生成坐标,只不过方向切换的节点需要根据矩形的宽w和高h动态计算:
定义方向与角度的对应关系
沿用你正方形公式里的角度规则:- 向右走:角度为$\frac{\pi}{2}$,此时$\sin(\theta)=1$,$\cos(\theta)=0$(x增加1,y不变)
- 向下走:角度为$\pi$,此时$\sin(\theta)=0$,$\cos(\theta)=-1$(x不变,y减少1)
- 向左走:角度为$\frac{3\pi}{2}$,此时$\sin(\theta)=-1$,$\cos(\theta)=0$(x减少1,y不变)
- 向上走:角度为$0$,此时$\sin(\theta)=0$,$\cos(\theta)=1$(x不变,y增加1)
动态划分每段的步数
矩形螺旋的每一圈,四个方向的步数是不一样的:- 先计算矩形的半宽$a = \lfloor \frac{w-1}{2} \rfloor$,半高$b = \lfloor \frac{h-1}{2} \rfloor$(这是从中心到边界的最大距离)
- 从中心(n=0,坐标(0,0))开始,按「右→下→左→上」的顺序循环走,每完成一圈,横向和纵向的可走长度会分别增加2(因为向外扩了一层),但要受限于宽高的最大值。
写出通用参数化公式
我们只需要把原来的固定角度函数k(n)替换成分段角度函数$\theta(n)$,然后沿用累加逻辑:
$$
x(n) = \sum_{i=1}^{n} \sin(\theta(i))
$$
$$
y(n) = \sum_{i=1}^{n} \cos(\theta(i))
$$
这里的$\theta(i)$根据i所在的边段取对应的角度值,而边段的起始/结束位置由w和h动态计算得出。
举个例子,对应5x3的n=7到9(向右走的段),$\theta(i)$都取$\frac{\pi}{2}$,所以$\sin(\theta(i))=1$,累加后x从-1依次变成0、1、2,和你给出的序列完全一致。
总结
简单来说,矩形螺旋的参数化和正方形螺旋的核心逻辑是一样的——都是通过累加每一步的方向分量得到坐标,唯一的区别是矩形螺旋需要根据宽高动态调整每段的步数,而不是像正方形那样用固定的平方根规则来计算角度跳变点。只要你先根据w和h确定每一圈四个边的长度,划分好n的分段区间,就能写出类似的参数化公式。
备注:内容来源于stack exchange,提问作者alexa griffin

