用片状赫米特花键寻找给定角的垂直点。

问题描述 投票:0回答:1

我得到一个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);

这个方法在一定程度上是可行的,但其结果是不合格的。

这个方法使用输入的结果。

误差不大 我如何面对这个问题?

c++ math geometry spline cubic-spline
1个回答
0
投票

如果你在Hermite花键的每一点上建立给定长度的法线,并将这些法线的端点连接起来,就会得到一条曲线(所谓的 parallel curve)在一般情况下不是赫米花键。对于 Bezier 曲线和大多数其他曲线也是如此(只有圆弧产生自相似曲线和一些特殊曲线)。

因此,为了产生可靠的结果,值得将曲线细分为小块,在所有中间点建立法线,并通过 "平行点 "产生平滑的片状花键。

也注意到怀疑使用 x 在公式的正确部分--应该是一些 distance.

而且你也不需要计算两次sincos。

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);
© www.soinside.com 2019 - 2024. All rights reserved.