我得到一个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
)在一般情况下不是赫米花键。对于 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);