




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第C#中GDI+繪制圓弧及圓角矩形等比縮放的繪制目錄理解圓弧繪制從圓弧到繪制圓角長方體如何實現(xiàn)等比縮放繪制圓角矩形按固定比例計算縮放矩形的嘗試(不推薦)通過Inflate()方法縮放矩形
理解圓弧繪制
GDI+中對于圓弧的繪制,是以給定的長方形(System.Drawing.Rectangle結(jié)構(gòu))為邊界繪制的橢圓的一部分形成的圓弧。繪制的圓弧的中心為長方形內(nèi)切橢圓的圓心(如果是正方形,則正方形的中心是內(nèi)切圓的圓心)
Graphics對象的DrawArc()方法用于繪制圓弧線段;GraphicsPath對象的AddArc()方法用于繪制圓弧路徑。
以DrawArc為例,參數(shù)為:DrawArc(System.Drawing.Penpen,System.Drawing.Rectanglerect,floatstartAngle,floatsweepAngle),繪制一段弧線,它表示Rectangle結(jié)構(gòu)指定的橢圓的一部分。
pen為畫筆對象。rect包含圓弧的長方體結(jié)構(gòu)。startAngle圓弧繪制的開始角度。sweepAngle從startAngle角度到弧線的結(jié)束點沿順時針方向度量的角(以度為單位),即從startAngle開始繪制弧線轉(zhuǎn)動的角度。
新建Winform項目GDIForArc,測試和演示弧形繪制的效果。
直接看下面的代碼,分別繪制矩形對應的四個角的弧形(1/4圓),可以很直觀的看到圓弧的繪制及與長方體的關(guān)系:
protectedoverridevoidOnPaint(PaintEventArgse)
Graphicsg=e.Graphics;
Penpn=newPen(Color.Blue,5);
Rectanglerect=newRectangle(50,50,150,150);
g.DrawRectangle(pn,rect);
Rectanglerect2=newRectangle(300,50,150,350);
g.DrawRectangle(pn,rect2);
//紅色0-90deg的圓弧
pn.Color=RedColor;
g.DrawArc(pn,rect,0,90);
g.DrawArc(pn,rect2,0,90);
//黑色90-180deg的圓弧
pn.Color=BalckColor;
g.DrawArc(pn,rect,90,90);
g.DrawArc(pn,rect2,90,90);
//綠色180-270deg的圓弧
pn.Color=GreenColor;
g.DrawArc(pn,rect,180,90);
g.DrawArc(pn,rect2,180,90);
//粉色270-360deg的圓弧
pn.Color=HotPink;
g.DrawArc(pn,rect,270,90);
g.DrawArc(pn,rect2,270,90);
}
從圓弧到繪制圓角長方體
GDI+中繪圖系統(tǒng)中順時針方向為旋轉(zhuǎn)正方向,水平向右方向為x軸正方向,垂直向下為y軸正方向。
通過Rectangle結(jié)構(gòu)內(nèi)的四個圓弧,可以組合成四個圓角,從而可以進一步實現(xiàn)圓角長方體、圓形等圖形。
如下,是使用這個方式繪制的圓角矩形。
需要注意的點:
線條連接時的1像素問題,很多時候會出現(xiàn)1像素的間隔,并沒有完全閉合連接,需要額外處理Pen.LineJoin指定線條連接點的模式
//繪制圓角矩形
pn.Color=Color.MediumVioletRed;
//指定連接處的連接點
pn.LineJoin=LineJoin.Round;
RectangleroundRect=newRectangle(500,50,150,80);
varradius=20;
varR=radius*2;
RectanglearcRect=newRectangle(roundRect.X,roundRect.Y,R,R);
//左上角
g.DrawArc(pn,arcRect,180,90);
//右上角
arcRect.X=roundRect.Right-R;
g.DrawArc(pn,arcRect,270,90);
//右下角
arcRect.Y=roundRect.Bottom-R;
g.DrawArc(pn,arcRect,0,90);
//左下角
arcRect.X=roundRect.Left;
g.DrawArc(pn,arcRect,90,90);
#region單獨繪制線條,需要處理1像素間隔問題,且連接處不平滑
g.DrawLine(pn,roundRect.X+radius,roundRect.Y,roundRect.Right-radius+1,roundRect.Y);
g.DrawLine(pn,roundRect.Right,roundRect.Y+radius,roundRect.Right,roundRect.Bottom-radius+1);
g.DrawLine(pn,roundRect.Right-radius+1,roundRect.Bottom,roundRect.Left+radius,roundRect.Bottom);
g.DrawLine(pn,roundRect.Left,roundRect.Bottom-radius+1,roundRect.Left,roundRect.Y+radius);
#endregion
如何實現(xiàn)等比縮放繪制圓角矩形
按固定比例計算縮放矩形的嘗試(不推薦)
根據(jù)上面繪制矩形的思路,想著同樣實現(xiàn)一個按照等比縮放繪制內(nèi)部圓角矩形的方式。主要思路是,指定一個縮放比例,讓外部的矩形寬高、位置、圓角繪制的半徑、直徑等對應等比縮放并計算其值。
然后就是圓角矩形的繪制思路。
#region等比縮放的繪制圓角矩形
////等比縮放,繪制內(nèi)層圓角矩形
varscale=0.8f;
varradiusScale=radius*scale;
varRScale=radiusScale*2;
varinnerRoundRect=newRectangleF(roundRect.X+(roundRect.Width-roundRect.Width*scale)/2,roundRect.Y+(roundRect.Height-roundRect.Height*scale)/2,roundRect.Width*scale,roundRect.Height*scale);
vararcRectScale=newRectangleF(innerRoundRect.X,innerRoundRect.Y,RScale,RScale);
//varscale=0.8f;
//varradiusScale=Convert.ToInt32(radius*scale);
//varRScale=radiusScale*2;
//varwidth=Convert.ToInt32(roundRect.Width*scale);
//varheight=Convert.ToInt32(roundRect.Height*scale);
//varinnerRoundRect=newRectangle(roundRect.X+(roundRect.Width-width)/2,roundRect.Y+(roundRect.Height-height)/2,width,height);
//vararcRectScale=newRectangle(innerRoundRect.X,innerRoundRect.Y,RScale,RScale);
pn.Color=Color.MediumPurple;
arcRectScale.X=innerRoundRect.X;
arcRectScale.Y=innerRoundRect.Y;
//左上角
g.DrawArc(pn,arcRectScale,180,90);
g.DrawLine(pn,innerRoundRect.X+radiusScale,innerRoundRect.Y,innerRoundRect.Right-radiusScale+1,innerRoundRect.Y);
//右上角
arcRectScale.X=innerRoundRect.Right-RScale;
g.DrawArc(pn,arcRectScale,270,90);
g.DrawLine(pn,innerRoundRect.Right,innerRoundRect.Y+radiusScale,innerRoundRect.Right,innerRoundRect.Bottom-radiusScale+1);
//右下角
arcRectScale.Y=innerRoundRect.Bottom-RScale;
g.DrawArc(pn,arcRectScale,0,90);
g.DrawLine(pn,innerRoundRect.Right-radiusScale+1,innerRoundRect.Bottom,innerRoundRect.Left+radiusScale,innerRoundRect.Bottom);
//左下角
arcRectScale.X=innerRoundRect.Left;
g.DrawArc(pn,arcRectScale,90,90);
g.DrawLine(pn,innerRoundRect.Left,innerRoundRect.Bottom-radiusScale+1,innerRoundRect.Left,innerRoundRect.Y+radiusScale);
#endregion
去掉外層圓角矩形的直線,效果如下:
直接計算比例的問題在于,由于矩形長寬大小的不同,計算出來內(nèi)部(或外部)矩形的縮小或增大的量會不同,原則上,應該是長寬方向上縮小固定的量(類似邊框在長寬方向時,邊框的大小都是一樣的)。因此,最好取其中一個值。
縮小或增大的矩形的圓角半徑是否應該對應縮放?這是一直沒有很好處理的問題,如果縮小放大的變化不大,則沒有太大區(qū)別,如果比較大,圓角半徑最好保持不變(上例代碼為圓角半徑也跟著縮放的例子)
通過Inflate()方法縮放矩形
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025電影長津湖觀后感心得
- 理財三級2025年真題
- 健康領(lǐng)域?qū)嵺`指南核心要點
- 爆發(fā)性糖尿病病例分析
- 春天健康課小班
- 社區(qū)健康教育理論與模式
- 2025年鐵氧體粘結(jié)永磁磁粉項目提案報告
- 2025年非磁介質(zhì)復制品項目申請報告模板
- 北京市民政局所屬事業(yè)單位2025年第二批公開招聘工作人員筆試及復審筆試歷年典型考題及考點剖析附帶答案詳解
- 文庫發(fā)布:稅務(wù)師課件app
- 2024年深圳市中考歷史試卷真題(含答案解析)
- 老年人燙傷的預防與護理課件
- 體育課身體素質(zhì)練習教案
- 湖北省 公路工程試驗檢測設(shè)備期間核查規(guī)范DB42∕T 1544-2020
- 基礎(chǔ)會計教材電子版
- 四川省地質(zhì)災害治理工程常用資料表格
- 患者隱私保護課件
- RFJ0132010人民防空工程防化設(shè)計規(guī)范
- CA6140車床杠桿工藝設(shè)計說明書完全版
- T_CHES 17-2018 水井報廢與處理技術(shù)導則
- 酒店住宿賬單模板
評論
0/150
提交評論