我想要实现一个 贝塞尔的曲线.我已经做到了这一点在C#前,但是我完全不熟悉的用C++库。我应该如何去关于建立一个二次曲线?

void printQuadCurve(float delta, Vector2f p0, Vector2f p1, Vector2f p2);

显然我们需要用线性插值,但这是否存在的标准数学图书馆?如果没有,我在哪里可以找到它吗?

更新1:

对不起,我忘了说了我的使用Linux。

有帮助吗?

解决方案

你有没有使用C#图书馆前面?

C++,没有标准图书馆功能贝塞尔的曲线提供(yet).当然你也可以滚你自己的(演示 样本),或寻找一种数学图书馆。

博文解释了这个想法很好但是在脚本。翻译不应该太大的问题。

其他提示

最近我遇到了同样的问题,想自己实现。维基百科上的这张图片帮助了我:

http://upload.wikimedia.org/wikipedia/commons/3/35/Bezier_quadratic_anim.gif

以下代码用 C++ 编写,展示了如何计算二次贝塞尔曲线。

int getPt( int n1 , int n2 , float perc )
{
    int diff = n2 - n1;

    return n1 + ( diff * perc );
}    

for( float i = 0 ; i < 1 ; i += 0.01 )
{
    // The Green Line
    xa = getPt( x1 , x2 , i );
    ya = getPt( y1 , y2 , i );
    xb = getPt( x2 , x3 , i );
    yb = getPt( y2 , y3 , i );

    // The Black Dot
    x = getPt( xa , xb , i );
    y = getPt( ya , yb , i );

    drawPixel( x , y , COLOR_RED );
}

其中(x1|y1)、(x2|y2)和(x3|y3)为图像中的P0、P1和P2。只是为了展示基本想法......

对于那些要求三次贝塞尔曲线的人来说,它只是类似的工作(也来自维基百科):

http://upload.wikimedia.org/wikipedia/commons/a/a3/Bezier_cubic_anim.gif

答案提供了它的代码。

下面是用于与任意数量的点的曲线的一般实现。

vec2 getBezierPoint( vec2* points, int numPoints, float t ) {
    vec2* tmp = new vec2[numPoints];
    memcpy(tmp, points, numPoints * sizeof(vec2));
    int i = numPoints - 1;
    while (i > 0) {
        for (int k = 0; k < i; k++)
            tmp[k] = tmp[k] + t * ( tmp[k+1] - tmp[k] );
        i--;
    }
    vec2 answer = tmp[0];
    delete[] tmp;
    return answer;
}

请注意,它使用堆存储器,用于临时数组,其是不是所有的高效。如果你只需要处理一个固定的点数,你可以硬编码的为NumPoints价值和使用堆栈存储器来代替。

当然,上面的假设你有这样的结构VEC2和运营商为它:

struct vec2 {
    float x, y;
    vec2(float x, float y) : x(x), y(y) {}
};

vec2 operator + (vec2 a, vec2 b) {
    return vec2(a.x + b.x, a.y + b.y);
}

vec2 operator - (vec2 a, vec2 b) {
    return vec2(a.x - b.x, a.y - b.y);
}

vec2 operator * (float s, vec2 a) {
    return vec2(s * a.x, s * a.y);
}

您有德应用Casteljau的方法,该方法是,直到在使用线性内插点到达递归地划分控制路径,如上所述,或贝塞尔的方法,该方法是将掺合的控制点之间的选择。

贝塞尔的方法是

 p = (1-t)^3 *P0 + 3*t*(1-t)^2*P1 + 3*t^2*(1-t)*P2 + t^3*P3 

为生成立方体和

 p = (1-t)^2 *P0 + 2*(1-t)*t*P1 + t*t*P2

有二次方程式。

吨通常在0-1是但是这不是必要 - 事实上曲线延伸到无限远。 P0,P1,等是控制点。曲线经过两个端点,但通常不会通过其他的点。

  • 如果你只想显示贝塞尔曲线,你可以使用类似的东西 聚贝塞尔曲线 对于 Windows。

  • 如果您想自己实现例程,您可以找到 线性插值代码 遍布 Intarnetz。

  • 我相信 增强库 对此有支持。线性插值,而不是特指贝塞尔曲线。不过,请不要引用我的话。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top