//--------------------------------------------------------------------------- #include #pragma hdrstop #include "Unit1.h" #include //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- TPoint tangent(TPoint p1, TPoint p2) { return TPoint((p1.x - p2.x) / 2, (p1.y - p2.y) / 2); } void Curve(TCanvas *Canvas, TPoint *p, int num, float rez) { int px = 0, py = 0, n=0; float tt, _1_t, _2t, h00, h10, h01, h11; TPoint m0; TPoint m1; TPoint m2; TPoint m3; Canvas->Brush->Color = clRed; for (n=0; nFillRect(TRect(p[n].x-2, p[n].y-2, p[n].x+2, p[n].y+2)); for (float t=0; t<1; t+=rez) { tt = t * t; _1_t = 1 - t; _2t = 2 * t; h00 = (1 + _2t) * (_1_t) * (_1_t); h10 = t * (_1_t) * (_1_t); h01 = tt * (3 - _2t); h11 = tt * (t - 1); if (!n) { m0 = tangent(p[n+1], p[n]); m1 = tangent(p[n+2], p[n]); px = h00 * p[n].x + h10 * m0.x + h01 * p[n+1].x + h11 * m1.x; py = h00 * p[n].y + h10 * m0.y + h01 * p[n+1].y + h11 * m1.y; Canvas->Pixels[px][py] = clBlack; } else if (n < num-2) { m1 = tangent(p[n+1], p[n-1]); m2 = tangent(p[n+2], p[n]); px = h00 * p[n].x + h10 * m1.x + h01 * p[n+1].x + h11 * m2.x; py = h00 * p[n].y + h10 * m1.y + h01 * p[n+1].y + h11 * m2.y; Canvas->Pixels[px][py] = clBlack; } else if (n == num-1) { m2 = tangent(p[n], p[n-2]); m3 = tangent(p[n], p[n-1]); px = h00 * p[n-1].x + h10 * m2.x + h01 * p[n].x + h11 * m3.x; py = h00 * p[n-1].y + h10 * m2.y + h01 * p[n].y + h11 * m3.y; Canvas->Pixels[px][py] = clBlack; } } } } void __fastcall TForm1::Button1Click(TObject *Sender) { TPoint p[7] = {TPoint(100,100), TPoint(120,180), TPoint(220,180), TPoint(250,250), TPoint(300,150), TPoint(350,200), TPoint(400,100)}; Curve(Form1->Canvas, p, 7, 0.005); } //---------------------------------------------------------------------------