[c++] Krzywa Beziera. Gdzie mam błąd?


(pasquali) #1

Mam do zrobienia program z krzywą Beziera. Chodzi o to by poprostu taka krzywą pokazać i z tego co mi sie wydaję móc nią poruszać. Niestety nie wiem jak sie za to zabrać. Tzn. jak to zaimplementować. Szperałem po necie i znalazłem jakieś programiki stworzone w OpenGl. Czy to dobry kierunek? Jak tak to z czym to sie je? :stuck_out_tongue:


(Fiołek) #2

Ja bym się nie bawił w OpenGL tylko napisał algorytm wyliczający mi punkty i "wpisywał" by je na wcześniej przygotowaną bitmapę, a wyświetlanie jej w GDI+ albo czymś równie prostym(SDL). Poruszanie to tylko zmiana kolejnych punktów na krzywej(do algorytmu).


(pasquali) #3

Dobra początek mam za sobą. Mam coś takiego:

int Ax=StrToInt(Edit1->Text);

   int Ay=StrToInt(Edit2->Text);

   int Bx=StrToInt(Edit3->Text);

   int By=StrToInt(Edit4->Text);

   int Cx=StrToInt(Edit5->Text);

   int Cy=StrToInt(Edit6->Text);

   int Dx=StrToInt(Edit7->Text);

   int Dy=StrToInt(Edit8->Text);


   PaintBox1->Canvas->Pen->Color = clBlue;

   PaintBox1->Canvas->Pen->Style = psSolid;

   PaintBox1->Canvas->Pen->Width=3;

   PaintBox1->Canvas->MoveTo(Ax,Ay);


   for (float t=0.00; t <= 1; t=t+0.01)

	{

		float Px=Ax*pow((1-t),3)+3*Bx*t*pow((1-t),2)+3*Cx*t*pow(t,2)*(t-1)+Dx*pow(t,3);

		float Py=Ay*pow((1-t),3)+3*By*t*pow((1-t),2)+3*Cy*t*pow(t,2)*(t-1)+Dy*pow(t,3);

		PaintBox1->Canvas->LineTo(Px,Py);

	}

Ale zamiast wyświetlać coś podobnego do tego. Mam cos takiego:123119035289.JPGTu jest cos na temat krzywej Beziera: polskie wiki: http://pl.wikipedia.org/wiki/Krzywa_B%C3%A9zieraangielskie wiki: http://en.wikipedia.org/wiki/B%C3%A9zier_curveChyba coś źle zrozumiałem :? edit! Powinno być tak:

int Ax=StrToInt(Edit1-Text);

   int Ay=StrToInt(Edit2-Text);

   int Bx=StrToInt(Edit3-Text);

   int By=StrToInt(Edit4-Text);

   int Cx=StrToInt(Edit5-Text);

   int Cy=StrToInt(Edit6-Text);

   int Dx=StrToInt(Edit7-Text);

   int Dy=StrToInt(Edit8-Text);


   PaintBox1-Canvas-Pen-Color = clBlue;

   PaintBox1-Canvas-Pen-Style = psSolid;

   PaintBox1-Canvas-Pen-Width=3;

   PaintBox1-Canvas-MoveTo(Ax,Ay);


   for (float t=0.00; t = 1; t=t+0.01)

	{

		float Px=Ax*pow(1-t,3)+3*Bx*t*pow(1-t,2)+3*Cx*pow(t,2)*(1-t)+Dx*pow(t,3);

		float Py=Ay*pow(1-t,3)+3*By*t*pow(1-t,2)+3*Cy*pow(t,2)*(1-t)+Dy*pow(t,3);

		PaintBox1-Canvas-LineTo(Px,Py);

	}

Poradziłem sobie:P