使用分段 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);
我得到了一个 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);