使用分段 Hermite 样条函数寻找给定角度的垂直点

Finding Perpendicular Points Given An Angle With Piece-wise Hermite Splines

我得到了一个 Hermite 样条,我想从中创建另一个样条,该样条上的每个点都正好 x 距离。

这是我想做的事的一个例子:

.

我可以找到原始样条曲线上的每个导数和点。我也知道每个多项式的所有系数。

这是我想出的代码,它对原始样条曲线的每个控制点执行此操作。其中 controlPath[i] 是构成样条的控制点向量,Point 是表示具有面向角的 2D 点的结构。

double x, y, a;
a = controlPath[i].Angle + 90;
x = x * cosf(a * (PI / 180)) + controlPath[i].X;
y = x * sinf(a * (PI / 180)) + controlPath[i].Y;
Point l(x, y, a - 90);

a = controlPath[i].Angle - 90;
x = x * cosf(a * (PI / 180)) + controlPath[i].X;
y = x * sinf(a * (PI / 180)) + controlPath[i].Y;
Point r(x, y, a + 90);

这种方法在一定程度上奏效,但效果不佳。

此方法使用输入的结果:

不准确不好。我该如何面对这个问题?

如果在 Hermite 样条的每个点上建立给定长度的法线并连接这些法线的端点,则生成的曲线(所谓的 parallel curve)在一般情况下不是 Hermit 样条。贝塞尔曲线和大部分pther曲线也是如此(只有圆弧产生自相似曲线和一些奇异曲线)。

因此,为了生成可靠的结果,值得将曲线细分成小块,在所有中间点建立法线并通过 "parallel points"

生成平滑的分段样条

另请注意,在公式的右侧使用 x 有疑问 - 应该是 distance

另外你不需要计算sin/cos两次

double x, y, a, d, c, s;
a = controlPath[i].Angle + 90;
c = d * cosf(a * (PI / 180));
s = d * sinf(a * (PI / 180))
x = c + controlPath[i].X;
y = s + controlPath[i].Y;
Point l(x, y, controlPath[i].Angle);
x = -c + controlPath[i].X;
y = -s + controlPath[i].Y;
Point l(x, y, controlPath[i].Angle);