全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2102
推到 Plurk!
推到 Facebook!

關於小畫家(Bezier)曲線

尚未結案
howard15230
一般會員


發表:3
回覆:0
積分:0
註冊:2010-09-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-11-22 17:29:26 IP:140.120.xxx.xxx 訂閱
不好意思~請問一下各位

我參考了書上畫出bezier的方法

有畫出來了~~

但是因為是動態的點,是把畫筆改成白色,來清除殘影

可是這樣一來再畫一次的線,如果經過上一條的曲線

會把曲線給擦掉

請問有沒有清除線段的不是用白色取代的方法

附上程式

[code cpp]
//---------------------------------------------------------------------------
#include
#pragma hdrstop
#include "e11_1gu.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int md,mm;
int mu; //MouseUp
int xo,yo; //x_old,y_old
TPoint p[10];

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
// 貝茲曲線
void __fastcall TForm1::btnarcClick(TObject *Sender)
{
md=0;
mm=0;
mu=0;
Form1->Caption="貝茲曲線";

}
//---------------------------------------------------------------------------
void __fastcall TForm1::imgMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
md ; //MouseDown
if (md==1)
{
p[0]=Point(X,Y);
p[1]=Point(X,Y);
img->Canvas->TextOut(X-20,Y-20,"(x0,y0)");
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnendClick(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::imgMouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{


if (md==0) //未按左鍵而移動滑鼠,則離開。
return;

switch (mu)
{
case 0: //直線的貝茲曲線
if (mm==0)
{
//繪第一個曲線
p[2]=Point(X,Y);
p[3]=Point(X,Y);
img->Canvas->PolyBezier(p,3);
xo=X; //x_old
yo=Y; //y_old
mm=1;
}
if (mm==1)
{
//再移動時,先刪除剛剛的曲線,再劃新的曲線
img->Canvas->Pen->Color=clWhite;
p[2]=Point(xo,yo);
p[3]=Point(xo,yo);
img->Canvas->PolyBezier(p,3);

img->Canvas->Pen->Color=clBlue;
p[2]=Point(X,Y);
p[3]=Point(X,Y);
img->Canvas->PolyBezier(p,3);
xo=X;
yo=Y;
}
break;
case 1: //一個折點的貝茲曲線
if (md==2)
{
//再移動時,先刪除剛剛的圖形,再劃新的圖形
img->Canvas->Pen->Color=clWhite;
p[2]=Point(xo,yo);
img->Canvas->PolyBezier(p,3);

img->Canvas->Pen->Color=clBlue;
p[2]=Point(X,Y);
img->Canvas->PolyBezier(p,3);
xo=X;
yo=Y;
}
break;
case 2: //兩個折點的曲線
if ( mm==0)
{
//先擦 Case 1 的單一折點曲線
p[2]=Point(xo,yo);
img->Canvas->Pen->Color=clWhite;
img->Canvas->PolyBezier(p,3);

//畫 case 2 的第一條曲線
p[1]=Point(X,Y);
img->Canvas->Pen->Color=clBlue;
img->Canvas->PolyBezier(p,3);
xo=X; //x_old
yo=Y; //y_old
mm=1;
}
if (md==3 && mm==1)
{
//再移動時,先刪除剛剛的曲線,再劃新的曲線
img->Canvas->Pen->Color=clWhite;
p[1]=Point(xo,yo);
img->Canvas->PolyBezier(p,3);

img->Canvas->Pen->Color=clBlue;
p[1]=Point(X,Y);
img->Canvas->PolyBezier(p,3);
xo=X;
yo=Y;

}
break;
}


}
//---------------------------------------------------------------------------
//MouseUp
void __fastcall TForm1::imgMouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
mu ;
switch (mu)
{
case 1:
p[3]=Point(X,Y);
mm=0 ;
img->Canvas->TextOut(X,Y,"(x3,y3)");
xo=X;
yo=Y;
break;
case 2:
p[2]=Point(X,Y);
mm=0 ;
img->Canvas->TextOut(X,Y,"(x2,y2)");
img->Canvas->Pixels[X][Y]=clRed;
xo=X;
yo=Y;
break;
case 3:
p[1]=Point(X,Y);
mm=0 ;
img->Canvas->TextOut(X,Y,"(x1,y1)");
img->Canvas->Pixels[X][Y]=clRed;
break;
}
}
//---------------------------------------------------------------------------



void __fastcall TForm1::Button1Click(TObject *Sender)
{
img->Picture=0;
}
//---------------------------------------------------------------------------

[/code]




系統時間:2024-04-25 8:58:24
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!