我正在尝试用 B 样条曲线绘制曲线。我对什么是 B 样条以及如何在程序算法中使用它进行了研究。经过所有这些之后,我终于在 Stack Overflow 中找到了一个正确的代码。我对此代码进行了一些更改并尝试在我的程序中使用。它有效,但我有两个问题。
首先,曲线形状正确,但位置不正确。它与应有的不同 20-40 像素。
其次,在我的函数最后一部分中,我将 x 和 y 的两个结果除以一个数字,但它(除数)似乎必须针对所有情况进行更改。
最后,如您所见,它适用于 6 个坐标。
如何绑定坐标数以除数并修复样条线处的翻转?
PS:我需要用 C 编写代码
这是我的代码的功能:
1-这是我的 B 样条计算函数:
void BSplineCurve(const Dot& point1,
const Dot& point2,
const Dot& point3,
const Dot& point4,
Dot& result,
const double t)
{
const double t2 = t * t;
const double t3 = t2 * t;
const double mt = 1.0 - t;
const double mt3 = mt * mt * mt;
const double bi3 = mt3;
const double bi2 = 3 * t3 - 6 * t2 + 4;
const double bi1 = -3 * t3 + 3 * t2 + 3 * t + 1;
const double bi = t3;
result.x = point1.x * bi3 + point2.x * bi2 + point3.x * bi1 + point4.x * bi;
result.x /= 4;
result.y = point1.y * bi3 + point2.y * bi2 + point3.y * bi1 + point4.y * bi;
result.y /= 4;
}
2-这是我的绘图功能:
Dot points[6] = {ControlPoint1, ControlPoint2, ControlPoint3, ControlPoint4, ControlPoint5,
ControlPoint6};
for(double t = 5.9999;t > 2.0; t -= 0.001)
{
const int start = static_cast<int>(t)+1;
BSplineCurve(points[start -3 ],
points[start - 2],
points[start - 1],
points[start ],
DrawCurve,
start - t);
Draw1Dot(DrawCurve,points[0],distanceToEdges);}
3-最后是我的绘制像素功能:
void Draw1Dot(Dot Koor, Dot mesafe, int ortala)
{
putpixel(mesafe.x + Koor.x + ortala, mesafe.y + Koor.y + ortala, 3);
}
你能帮我理解我做错了什么吗?