| Uutiset | Koodikirjasto | Wiki | Keskustelut | FAQ | Info |
BezierkäyräEntropia 15.03.04 22:22 Laskee bezierkäyrän ja dumppaa koordinaatit konsoliin
#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 ;) |
![]() Haku
|