# 算法与适用范围

## 模型与符号

平面盘形凸轮、直动滚子从动件、外接触和恒定正角速度。基圆半径 Rb，滚轮半径 Rr，偏置 e，升程 s(θ)。x 向右、y 向上；参数 θ 从 y 正轴顺时针增加。SVG 将显示 y 翻转。

要求 |e| < Rb+Rr。程序从零升程开始、每段末尾非负、一圈后返回零；三种运动规律段内单调。角度总和与升程闭合使用 1e-9 绝对容差。

## 运动规律与导数

单段角度 β、有符号升程 h，归一化 u=(θ−θ0)/β。位移 s0+h·f(u)，对角度的前三阶导数分别为 h·f′/β、h·f″/β²、h·f‴/β³。

- 摆线：f=u−sin(2πu)/(2π)。
- 3-4-5：f=10u³−15u⁴+6u⁵。
- 4-5-6-7：f=35u⁴−84u⁵+70u⁶−20u⁷。

三种规律在端点的一阶、二阶导数均为零。摆线和 3-4-5 与停歇连接时通常存在有限跃度跳变；4-5-6-7 的端点跃度为零。报告检查两侧极限，包含首尾接缝。

恒角速度 ω 下，时间导数分别乘 ω、ω²、ω³。变角速度情况下需要额外链式求导项，当前不适用。

## 中心轨迹与实际轮廓

令 q0=sqrt((Rb+Rr)²−e²)，q=q0+s。滚轮中心轨迹为：

```text
P(θ) = (q sinθ + e cosθ, q cosθ − e sinθ)
```

解析切向量 P′=(dx,dy)，外法线 N=(-dy,dx)/|P′|。实际轮廓：

```text
C(θ) = P(θ) − Rr·N(θ)
```

沿法线偏置，与直接将极径减去滚轮半径不同。测试检查接触距离等于滚轮半径、法线与中心轨迹及实际包络切线正交。零升程情况下，带偏置与无偏置结果均退化为半径 Rb 的圆。

## 压力角与局部曲率

有符号压力角为 atan2(s′−e,q)，约束使用绝对值。阈值由使用者给定；默认 30°是算例参数，不是通用合格标准。

顺时针参数的有符号节曲线曲率：

```text
k = (dy·ddx − dx·ddy) / |P′|³
```

凸圆为正、凹段为负。局部偏置因子 1−Rr·k，要求采样最小值大于 1e-6，排除对应位置的偏置尖点或反转风险。不能将凹曲率取绝对值后套用凸曲率条件。

## 采样、搜索与交叉检查

网格按各段角度分配采样密度，保留每段起点和最终闭合点。较短段至少一个区间；resolution 是名义每圈密度，返回点数可能稍多。

基圆搜索从下界开始遍历有限等距网格，先检查局部约束，再用双倍角度分辨率复核。没有假定曲率可行性随半径单调。找不到候选不证明连续参数空间不存在解，首个候选不代表全局最优。

`crossing_report` 检查非相邻折线边，正常相邻公共端点除外，回折重叠不会被忽略。方向符号采用局部坐标归一化与浮点误差界，不使用随世界坐标绝对值放大的全局容差。严格交叉单独计数；相切、重叠、近退化而无法可靠确定符号时计入不确定项。`profile_crossings` 只有在不存在不确定项时返回完整计数，否则返回错误。局部通过不等于综合通过。

尺寸搜索先使用不保留坐标的标量路径筛选，再在细网格生成轮廓并完成检查；确定的交叉使搜索继续，不确定几何或检查失败则明确中止。没有覆盖连续采样点之间的回环和非局部滚轮干涉。

## 数值与工程边界

输入拒绝 NaN、无穷值、零滚轮半径、不闭合程序和非法偏置。JSON 限制输入大小、段数和采样数；公开计算接口检查溢出。接近压力角阈值或偏置奇异、窄角度快速升程时需要加密采样。

不包含强度、载荷、动力学稳定性、接触保持、润滑、磨损、公差和刀具补偿。当前输出用于运动学和几何初选，离散 DXF 不能视为制造合格证明。

## 0.2 批量计算实现

Program 缓存每段起始角与起始升程。任意角度查询使用二分定位；采样循环直接使用已知段号，以 O(N+S) 构建运动网格。几何尺寸与转速在公开批量入口校验一次，点内保留数值溢出检查。角导数直接换算时间导数，不重复调用 evaluate。

搜索复用粗、细两份与几何无关的运动网格。标量路径使用旋转坐标系中的解析压力角和曲率，不计算点坐标、不保留 CamPoint 数组；只有通过局部筛选的候选才生成完整轮廓。

交叉检测选择 x/y 中跨度较大的方向，按边数增加桶数（最多 2048）。线段覆盖其包围盒跨越的全部桶；线段对由首个公共桶唯一处理。大量长包围盒重叠时仍可能退化；400 万次桶内对访问预算会返回未完成检查，避免无限放大成本。二次遍历的整数坐标参考算法只保留在测试中。
