You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改螺旋点生成代码的s采样以实现点沿螺旋等距分布?

解决螺旋线点等距分布的问题

原代码直接对角度s做线性采样,导致点沿螺旋线的弧长间距不均——因为螺旋的弧长随角度的变化是非线性的。要实现等距分布,需要基于弧长参数化反推对应的角度值,具体步骤如下:

核心原理

螺旋线的参数方程为:
r(s) = initial_radius + b*s
x(s) = r(s)*cos(s)
y(s) = r(s)*sin(s)

推导后得到弧长的微分公式:
dL/ds = √[b² + (initial_radius + b*s)²]

对该式积分可得到从起始角度到任意角度s的弧长L(s)。我们只需生成等间距的弧长值,再反解出对应的s即可。

修改后的代码

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import root_scalar

# 螺旋参数
initial_radius = 0.01
n_turns = 4
final_radius = 0.1
num_points = 300

b = (final_radius - initial_radius) / (2 * np.pi * n_turns)
start_theta = np.pi/2
end_theta = 2 * np.pi * n_turns

# 计算从start_theta到s的相对弧长
def arc_length(s):
    t = initial_radius + b * s
    a = b
    # 弧长积分的解析解
    integral = (t/2)*np.sqrt(a**2 + t**2) + (a**2/2)*np.log(t + np.sqrt(a**2 + t**2))
    # 减去起始点的弧长基准值
    t0 = initial_radius + b * start_theta
    integral0 = (t0/2)*np.sqrt(a**2 + t0**2) + (a**2/2)*np.log(t0 + np.sqrt(a**2 + t0**2))
    return integral - integral0

# 计算螺旋总弧长
total_length = arc_length(end_theta)

# 生成等间距的弧长序列
target_lengths = np.linspace(0, total_length, num_points)

# 反解每个目标弧长对应的角度s
s_values = []
for L in target_lengths:
    def equation(s):
        return arc_length(s) - L
    # 二分法求解角度区间内的根
    res = root_scalar(equation, bracket=[start_theta, end_theta], method='bisect')
    s_values.append(res.root)
s_values = np.array(s_values)

# 计算等距点的坐标
x = (initial_radius + b * s_values) * np.cos(s_values)
y = (initial_radius + b * s_values) * np.sin(s_values)

# 可视化
plt.scatter(x, y, label="等距螺旋")
plt.gca().set_aspect('equal')
plt.legend()
plt.show()

关键说明

  • 弧长解析解:利用积分公式直接计算弧长,避免数值积分的误差
  • 数值反解:用二分法在角度区间内找到对应目标弧长的角度值,保证解的稳定性
  • 等距映射:通过均匀采样弧长再映射到角度,最终实现点沿螺旋线的等距分布

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 23:22:42