Anonimo
Anonimo ha chiesto in Computer e InternetProgrammazione e Design · 1 decennio fa

Curva Bézier?

Salve a tutti,

Sto cercando codice in linguaggio C(possibilmente semplice), che permetta di disegnare una curva Bézier cubica.

Aggiornamento:

Ciao andre,

Ho letto che l'algoritmo di Casteljau utilizza più risorse rispetto ad altri, il mio problema è comunque l' implementazione nel linguaggio C

Aggiornamento 2:

Scusa, non avevo visto il codice...

Cmq ho già provato ad usare quel codice(Wikipedia), ma niente....

1 risposta

Classificazione
  • 1 decennio fa
    Risposta preferita

    Prova a cercare qualcosa relativo all'algoritmo di de Casteljau...

    Aggiungo questo, ma non garantisco... magari ti torna utile.

    /******************************************************

    Codice per generare una curva Bézier cubica

    Attenzione - codice non testato

    *******************************************************/

    typedef struct

    {

    float x;

    float y;

    }

    Point2D;

    /******************************************************

    cp è un array di 4 elementi dove:

    cp[0] è il punto iniziale

    cp[1] è il primo punto di controllo

    cp[2] è il secondo punto di controllo

    cp[3] è il punto finale

    t è il valore del parametro, 0 <= t <= 1

    *******************************************************/

    Point2D PointOnCubicBezier( Point2D* cp, float t )

    {

    float ax, bx, cx;

    float ay, by, cy;

    float tSquared, tCubed;

    Point2D result;

    /* calcolo dei coefficienti del polinomio */

    cx = 3.0 * (cp[1].x - cp[0].x);

    bx = 3.0 * (cp[2].x - cp[1].x) - cx;

    ax = cp[3].x - cp[0].x - cx - bx;

    cy = 3.0 * (cp[1].y - cp[0].y);

    by = 3.0 * (cp[2].y - cp[1].y) - cy;

    ay = cp[3].y - cp[0].y - cy - by;

    /* calcolo del punto della curva in relazione a t */

    tSquared = t * t;

    tCubed = tSquared * t;

    result.x = (ax * tCubed) + (bx * tSquared) + (cx * t) + cp[0].x;

    result.y = (ay * tCubed) + (by * tSquared) + (cy * t) + cp[0].y;

    return result;

    }

    /*****************************************************************************

    ComputeBezier riempe un array di strutture Point2D con i punti della curva

    generati dai punti di controllo cp. Il chiamante deve allocare memoria

    sufficiente per il risultato che è <sizeof(Point2D) * numeroDiPunti>

    ******************************************************************************/

    void ComputeBezier( Point2D* cp, int numberOfPoints, Point2D* curve )

    {

    float dt;

    int i;

    dt = 1.0 / ( numberOfPoints - 1 );

    for( i = 0; i < numberOfPoints; i++)

    curve[i] = PointOnCubicBezier( cp, i*dt );

    }

Altre domande? Fai una domanda e ottieni le risposte che cerchi.