參考之前http://delphi.ktop.com.tw/topic.php?topic_id=59273
裡面的程式 小弟我也Follow做了一個同樣的 只是改成在Image上面把圖畫出來 且可以Save和Open圖,但是想要把此程式再改成,可以定義控制點的移動軌跡,進而改變整個圖的輪廓呢?
發表人 - macgrady 於 2005/09/26 16:57:57
#include
#pragma hdrstop #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int md;
TPoint p[10];
Graphics:: TBitmap *OriginalBitmap1= new Graphics :: TBitmap();
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
struct Vertex
{
int x, y;
void set(int nx, int ny)
{
x=nx;
y=ny;
}
void set(float nx, float ny)
{
x=nx;
y=ny;
}
}; bool getVertex = false;
bool pressing = false;
int upx, upy, dnx, dny; class BSpline
{ protected:
int mPoints;
float t[4], n[4];
Vertex *mVertex;
public:
BSpline() { mVertex = NULL; }
void setLength(int len) { mPoints = len; }
void computeN();
void computeT(float param);
void assign(Vertex * av, int points) { mVertex=av; mPoints=points; }
void draw(TCanvas *canvas);
}; void BSpline::draw(TCanvas *canvas)
{
float s, x, y;
int k, p, c; canvas->Pen->Mode = pmNot;
for (p=0; pMoveTo(x, y);
for (s=0.1; s<=1.05; s+=0.05)
{
computeT(s);
computeN();
x=y=0.0;
for (k=0; k<4; k++)
{ x += n[k]*mVertex[p+k].x;
y += n[k]*mVertex[p+k].y;
}
canvas->LineTo(x, y);
}
}
//--畫圖--//
for (c=0; c<3; c++)
{
x = (mVertex[(p)%mPoints].x+4*mVertex[(p+1)%mPoints].x+mVertex[(p+2)%mPoints].x)/6.;
y = (mVertex[(p)%mPoints].y+4*mVertex[(p+1)%mPoints].y+mVertex[(p+2)%mPoints].y)/6.;
canvas->MoveTo(x, y);
for (s=0.1; s<=1.05; s+=0.05)
{
computeT(s);
computeN();
x=y=0.0;
for (k=0; k<4; k++)
{
x += n[k]*mVertex[(p+k)%mPoints].x;
y += n[k]*mVertex[(p+k)%mPoints].y;
}
canvas->LineTo(x, y);
}
p++;
}
} void BSpline::computeT(float param)
{
t[0] = 1.0;
t[1] = param;
t[2] = param*param;
t[3] = t[2]*param;
}
void BSpline::computeN()
{
n[3] = t[3]/6.;
n[2] = t[3]*(-0.5) + (t[2]+t[1])*0.5 + 1./6.;
n[1] = t[3]*0.5 - t[2] + 4./6.;
n[0] = (-t[3]+3*(t[2]-t[1])+1)/6.;
} const int Points = 10;
BSpline bs;
Vertex vt[Points];
int index=0; //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(!getVertex)
{
getVertex = true;
index = 0;
Button1->Caption = "Stop";
}
else
{
getVertex = false;
Button1->Caption = "get points";
}
} //---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if(getVertex = true)
{
p[md]=Point(X,Y);
Image1->Canvas->Ellipse(X-1,Y-1,X+1,Y+1);
md++;
} if ( getVertex )
{
if ( indexBrush->Style = bsSolid;
Canvas->Pen->Mode = pmNot;
Canvas->Ellipse(X-2, Y-2, X+2, Y+2);
index++;
if ( index >= Points )
{
getVertex = false;
Button1->Caption = "Get points";
return;
}
}
}
} //---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
bs.assign(vt, index);
bs.draw(Image1->Canvas);
} //---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
pressing = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
if (SavePictureDialog1->Execute())
{
Image1->Picture->SaveToFile(SavePictureDialog1->FileName);
}
}
//--------------------------------------------------------------------------- void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
Label3->Caption=X;
Label4->Caption=Y;
}
//--------------------------------------------------------------------------- void __fastcall TForm1::Button5Click(TObject *Sender)
{
if(OpenPictureDialog1->Execute())
{
Image1->AutoSize=true;
Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
}
}
發表人 - macgrady 於 2005/09/26 17:38:52