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

一個畫圓弧的小函式 (模仿Java)

 
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-07-27 23:33:02 IP:211.76.xxx.xxx 未訂閱
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-07-28 00:54:24 IP:203.204.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-07-28 01:15:37 IP:211.76.xxx.xxx 未訂閱
Chance36 太好了!感謝您! >
黑輪
中階會員


發表:135
回覆:188
積分:64
註冊:2004-01-29

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-05 10:16:43 IP:140.124.xxx.xxx 未訂閱
是否可以改成畫在圖上的pixels? 就是在一張圖上,畫出圓弧~
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-08-05 10:42:47 IP:211.76.xxx.xxx 未訂閱
黑輪 您好 :    
引言:是否可以改成畫在圖上的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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-08-09 17:36:12 IP:140.124.xxx.xxx 未訂閱
啊~~其實我最後要的是"走圓形路徑"的座標~就是我給它圓的質心、半徑、與起點角度跟方向(順時或逆時針轉)~因為現在在寫一個程式,就是會在圖上走圓形路徑,然後把走過的圖上的顏色資料給記錄下來~可是我寫的走圓程式~都會斷掉~不知用你的方法是否可達成~ 謝謝你的熱心幫忙哦~
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-08-09 18:06:55 IP:211.76.xxx.xxx 未訂閱
黑輪 您好:    
引言: 啊~~其實我最後要的是"走圓形路徑"的座標~就是我給它圓的質心、半徑、與起點角度跟方向(順時或逆時針轉)~因為現在在寫一個程式,就是會在圖上走圓形路徑,然後把走過的圖上的顏色資料給記錄下來~可是我寫的走圓程式~都會斷掉~不知用你的方法是否可達成~ 謝謝你的熱心幫忙哦~
不好意思誤解了您的提問。 其實這個程式只不過是把畫圓的函式以比較方便給參數的形式改寫,最後仍是將它轉成> href="http://delphi.ktop.com.tw/topic.php?PIC_ID=53803">http://delphi.ktop.com.tw/topic.php?PIC_ID=53803,可以協助您找到所有的座標點,不過得請您自行改寫: 基本上,任意直線的座標可以產生,而再把圓弧以線段連接,如此一來,就得到您要的座標。 其實也有想把圓弧的結果實作出來(Midpoint Circle Algorithm),但因為有其他更急的事要做,所以得緩一下了。 有興趣的會員可以參考電腦繪圖的相關書籍,相信也可以實作出來喔!
系統時間:2024-07-01 21:01:06
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!