一個畫圓弧的小函式 (模仿Java) |
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
Java畫圓弧的函式感覺比較符合人性,所以試著改寫提供大家使用。
< src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=16853498&CC=376922">
//--------------------------------------------------------------------------- // (x,y):圓心位置; r:半徑 // startDeg:起始角度 // degree:掃描角度,順時針為負,逆時針為正。 const float Deg2Rad=3.141592653/180.; void drawArc(TCanvas *canvas, int x, int y, float r, int startDeg, int degree, TColor color=NULL) { float x3, y3, x4, y4, angle; TColor clr; if ( degree==0.0 ) return; if ( color!=NULL ) { clr=canvas->Pen->Color; canvas->Pen->Color=color; } angle= startDeg*Deg2Rad; x3= x + r*cos(angle); y3= y - r*sin(angle); angle= (startDeg+degree)*Deg2Rad; x4= x + r*cos(angle); y4= y - r*sin(angle); if ( degree>0.0 ) canvas->Arc(x-r, y-r, x+r, y+r, x3, y3, x4, y4); else if ( degree<0.0 ) canvas->Arc(x-r, y-r, x+r, y+r, x4, y4, x3, y3); if ( color!=NULL ) canvas->Pen->Color=clr; // restore the original pen color } void __fastcall TForm1::Button1Click(TObject *Sender) { drawArc(Form1->Canvas,100,100,50, 0, 135, clRed); drawArc(Form1->Canvas,100,100,50, -90, -45, clBlue); } //---------------------------------------------------------------------------RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====##### |
Chance36
版主 發表:31 回覆:1033 積分:792 註冊:2002-12-31 發送簡訊給我 |
Hi! richtop 不介意的話,我來幫忙推!(改成Delphi的版本讓Delphi的使用者也可以使用)
//--------------------------------------------------------------------------- // (x,y):圓心位置; r:半徑 // startDeg:起始角度 // degree:掃描角度,順時針為負,逆時針為正。 const Deg2Rad: Double =(3.141592653/180); Procedure DrawArc(Canvas: TCanvas; x, y, r, startDeg, degree: Integer; Color: TColor) ; OverLoad Var x3, y3, x4, y4: Integer; angle : Double; Clr : TColor; Begin clr := Canvas.Pen.Color; Canvas.Pen.Color:=Color; angle := startDeg*Deg2Rad; x3 := x Round(r*cos(angle)); y3 := y - Round(r*sin(angle)); angle := (startDeg degree)*Deg2Rad; x4 := x Round(r*cos(angle)); y4 := y - Round(r*sin(angle)); if ( degree>0.0 ) Then Canvas.Arc(x-r, y-r, x r, y r, x3, y3, x4, y4) else if ( degree<0.0 ) Then Canvas.Arc(x-r, y-r, x r, y r, x4, y4, x3, y3); Canvas.Pen.Color:=clr; // restore the original pen color End; Procedure DrawArc(Canvas: TCanvas; x, y, r, startDeg, degree: Integer) ; OverLoad Begin drawArc(Canvas,x,y,r,startDeg,degree,Canvas.Pen.Color) ; End; //--------------------------------------------------------------------------- procedure TForm1.Button1Click(Sender: TObject); begin DrawArc(Form1.Canvas,100,100,50, 0, 135, clRed); DrawArc(Form1.Canvas,100,100,30, -90,-135, clBlue); end; //---------------------------------------------------------------------------發表人 - chance36 於 2004/07/28 00:56:40 |
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
|
黑輪
中階會員 發表:135 回覆:188 積分:64 註冊:2004-01-29 發送簡訊給我 |
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
黑輪 您好 :
引言:是否可以改成畫在圖上的pixels? 就是在一張圖上,畫出圓弧~不完全明白您的意思,試著回如下: 如果是想將圓弧畫在圖上,如Image上的話: drawArc(Image->Canvas, xc, yc, r, startDeg, degree, color); 不過假使Image是載入jpg檔,則要先將其轉換成bitmap格式,才能畫圓弧: Graphics::TBitmap *pBitmap = new Graphics::TBitmap(); pBitmap->Width = Image1->Picture->Width; pBitmap->Height= Image1->Picture->Height; pBitmap->Canvas->Draw(0,0,Image1->Picture->Graphic); Image1->Picture->Assign(pBitmap); delete pBitmap;希望是您要的。 > |
黑輪
中階會員 發表:135 回覆:188 積分:64 註冊:2004-01-29 發送簡訊給我 |
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
黑輪 您好:
引言: 啊~~其實我最後要的是"走圓形路徑"的座標~就是我給它圓的質心、半徑、與起點角度跟方向(順時或逆時針轉)~因為現在在寫一個程式,就是會在圖上走圓形路徑,然後把走過的圖上的顏色資料給記錄下來~可是我寫的走圓程式~都會斷掉~不知用你的方法是否可達成~ 謝謝你的熱心幫忙哦~不好意思誤解了您的提問。 其實這個程式只不過是把畫圓的函式以比較方便給參數的形式改寫,最後仍是將它轉成> href="http://delphi.ktop.com.tw/topic.php?PIC_ID=53803">http://delphi.ktop.com.tw/topic.php?PIC_ID=53803,可以協助您找到所有的座標點,不過得請您自行改寫: 基本上,任意直線的座標可以產生,而再把圓弧以線段連接,如此一來,就得到您要的座標。 其實也有想把圓弧的結果實作出來(Midpoint Circle Algorithm),但因為有其他更急的事要做,所以得緩一下了。 有興趣的會員可以參考電腦繪圖的相關書籍,相信也可以實作出來喔! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |