1

我正在尝试用 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);
}

你能帮我理解我做错了什么吗?

4

0 回答 0