Bezierkäyrä

Entropia 15.03.04 22:22

Laskee bezierkäyrän ja dumppaa koordinaatit konsoliin

 Tekstiversio  Arvo: 2 (4 ääntä)  Äänestä: +  -
#include <iostream>
#include <cmath>

using namespace std;

/* Accuracy säätää käyrän tarkkuutta.
   Aseta suurempi tarkkuus suuremmille käyrille.
   CurveX ja CurveY taulukkojen koko on tarkkuus + 1. */


class Bezier {
public:
        Bezier() { Accuracy = 50; CurveX = new double[51]; CurveY = new double[51]; };
        Bezier(int Acc) { Accuracy = Acc; CurveX = new double[Acc + 1]; CurveY = new double[Acc + 1]; };
        ~Bezier() { delete CurveX; delete CurveY; };

        void MakeCurve(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4);
        void DumpCurve();

private:
        int Accuracy;
        double *CurveX;
        double *CurveY;
};

/* Laskee käyrän. (x1, y1) on käyrän alkupiste, (x4, y4) on loppupiste, (x2, y2) sekä (x3, y3) ovat ohjauspisteitä. */

void Bezier::MakeCurve(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) {
        double step = Accuracy / pow(Accuracy, 2);
        double t;

        for(int i = 0; i < Accuracy + 1; i++) {
                t = step * i;
                CurveX[i] = (pow(1 - t, 3) * x1) + (3 * t * pow(1 - t, 2) * x2) + (3 * pow(t, 2) * (1 - t) * x3) + (pow(t, 3) * x4);
                CurveY[i] = (pow(1 - t, 3) * y1) + (3 * t * pow(1 - t, 2) * y2) + (3 * pow(t, 2) * (1 - t) * y3) + (pow(t, 3) * y4);
        }
}

/* Tulostaa käyrän konsoliin. */

void Bezier::DumpCurve() {
        for(int i = 0; i < Accuracy + 1; i++) {
                cout << "Point " << i << endl << "X:" << CurveX[i] << "  Y:" << CurveY[i] << endl << endl;
        }
}

/* Luodaan käyrä ja tulostetaan se. */

int main(void) {
        Bezier kayra;

        kayra.MakeCurve(20, 20, 40, 20, 60, 40, 60, 60);
        kayra.DumpCurve();

        return 0;
}

msdos64 21:50 17.3.04 
Saiskos ton ladattua jostain exenä?
Entropia 12:12 18.3.04 
Voin heittää binäärin nettiin jos se päiväsi kirkastaa. Tosin tämän koodin pitäisi toimi heittämällä missä tahansa ANSI C++ kääntäjässä.
Entropia 16:26 18.3.04 
G++:ssalla ei näköjään kääntynyt :P Mutta tässä on VC++ 6.0:lla käännetty binääri: http://edu.kauhajoki.fi/~mristila/softa/Bezier.exe
ikkah 21:41 18.3.04 
Jos castaat ton powin ensimmäisen argumentin johonkin muuhun kuin inttiin, vaikka floattiin niin sen pitäis toimia.
iluwatar 11:13 4.4.04 
Miksi pisteitä on (accuracy+1) eikä (accuracy) kappaletta?
Entropia 13:20 26.7.07 
iluwatar kirjoitti:
Miksi pisteitä on (accuracy+1) eikä (accuracy) kappaletta?

Kolme vuotta vastausta mietittyäni en vieläkään tiedä. Pahoittelen.
T.M. 10:05 26.8.07 
accuracy+1 sen takia koska tuossa käytetään < vertailua, eikä <= vertailua, eli halutaan käydä accuracy määrän verran läpi noita?
editoitu: 09:16 15.10.07
Ztane 09:15 15.10.07 
No ei... kun [0 .. accuracy +1[-väliin sopii juurikin accuracy + 1... mut miks hemmetissä tässä on "pow(x, 2)" ja "pow(x, 3)"... arvaten noi toteutukset - siis haloo, toinen argumentti on double - niin tämä tuhlaa aivan simona aikaa.

Vois tietenkin toivoa jotain toimivampaa algoritmia ;)