欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#中GDI+繪制圓弧及圓角矩形等比縮放的繪制

 更新時(shí)間:2022年08月29日 08:42:50   作者:代碼迷途  
這篇文章主要介紹了C#中GDI+繪制圓弧及圓角矩形等比縮放的繪制,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容戒殺,具有一定的參考價(jià)值,需要的小伙伴可以參考一下

理解圓弧繪制

GDI+中對(duì)于圓弧的繪制,是以給定的長(zhǎng)方形(System.Drawing.Rectangle 結(jié)構(gòu))為邊界繪制的橢圓的一部分形成的圓弧。繪制的圓弧的中心為長(zhǎng)方形內(nèi)切橢圓的圓心(如果是正方形,則正方形的中心是內(nèi)切圓的圓心)

Graphics對(duì)象的DrawArc()方法用于繪制圓弧線段;GraphicsPath對(duì)象的AddArc()方法用于繪制圓弧路徑。

DrawArc為例,參數(shù)為:DrawArc (System.Drawing.Pen pen, System.Drawing.Rectangle rect, float startAngle, float sweepAngle),繪制一段弧線,它表示 Rectangle 結(jié)構(gòu)指定的橢圓的一部分。

  • pen 為畫(huà)筆對(duì)象。
  • rect 包含圓弧的長(zhǎng)方體結(jié)構(gòu)。
  • startAngle 圓弧繪制的開(kāi)始角度。
  • sweepAngle 從 startAngle 角度到弧線的結(jié)束點(diǎn)沿順時(shí)針?lè)较蚨攘康慕牵ㄒ远葹閱挝唬?,即從startAngle開(kāi)始繪制弧線轉(zhuǎn)動(dòng)的角度。

新建Winform項(xiàng)目GDIForArc,測(cè)試和演示弧形繪制的效果。

直接看下面的代碼,分別繪制矩形對(duì)應(yīng)的四個(gè)角的弧形(1/4圓),可以很直觀的看到圓弧的繪制及與長(zhǎng)方體的關(guān)系:

protected override void OnPaint(PaintEventArgs e)
{
    Graphics g = e.Graphics;
    Pen pn = new Pen(Color.Blue,5);
    Rectangle rect = new Rectangle(50, 50, 150, 150);
    g.DrawRectangle(pn, rect);

    Rectangle rect2 = new Rectangle(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);
}

從圓弧到繪制圓角長(zhǎng)方體

GDI+中繪圖系統(tǒng)中順時(shí)針?lè)较驗(yàn)樾D(zhuǎn)正方向,水平向右方向?yàn)閤軸正方向,垂直向下為y軸正方向。

通過(guò)Rectangle結(jié)構(gòu)內(nèi)的四個(gè)圓弧,可以組合成四個(gè)圓角,從而可以進(jìn)一步實(shí)現(xiàn)圓角長(zhǎng)方體、圓形等圖形。

如下,是使用這個(gè)方式繪制的圓角矩形。

需要注意的點(diǎn):

  • 線條連接時(shí)的1像素問(wèn)題,很多時(shí)候會(huì)出現(xiàn)1像素的間隔,并沒(méi)有完全閉合連接,需要額外處理
  • Pen.LineJoin 指定線條連接點(diǎn)的模式
// 繪制圓角矩形
pn.Color = Color.MediumVioletRed;
// 指定連接處的連接點(diǎn)
pn.LineJoin = LineJoin.Round;

Rectangle roundRect = new Rectangle(500, 50, 150, 80);
var radius = 20;
var R = radius * 2;
Rectangle arcRect = new Rectangle(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 單獨(dú)繪制線條,需要處理1像素間隔問(wèn)題,且連接處不平滑
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

如何實(shí)現(xiàn)等比縮放繪制圓角矩形

按固定比例計(jì)算縮放矩形的嘗試(不推薦)

根據(jù)上面繪制矩形的思路,想著同樣實(shí)現(xiàn)一個(gè)按照等比縮放繪制內(nèi)部圓角矩形的方式。主要思路是,指定一個(gè)縮放比例,讓外部的矩形寬高、位置、圓角繪制的半徑、直徑等對(duì)應(yīng)等比縮放并計(jì)算其值。

然后就是圓角矩形的繪制思路。

#region 等比縮放的繪制圓角矩形
//// 等比縮放,繪制內(nèi)層圓角矩形
var scale = 0.8f;
var radiusScale = radius * scale;
var RScale = radiusScale * 2;
var innerRoundRect = new RectangleF(roundRect.X + (roundRect.Width - roundRect.Width * scale) / 2, roundRect.Y + (roundRect.Height - roundRect.Height * scale) / 2, roundRect.Width * scale, roundRect.Height * scale);
var arcRectScale = new RectangleF(innerRoundRect.X, innerRoundRect.Y, RScale, RScale);
//var scale = 0.8f;
//var radiusScale = Convert.ToInt32(radius * scale);
//var RScale = radiusScale * 2;
//var width = Convert.ToInt32(roundRect.Width * scale);
//var height = Convert.ToInt32(roundRect.Height * scale);
//var innerRoundRect = new Rectangle(roundRect.X + (roundRect.Width - width) / 2, roundRect.Y + (roundRect.Height - height) / 2, width, height);
//var arcRectScale = new Rectangle(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

去掉外層圓角矩形的直線,效果如下:

直接計(jì)算比例的問(wèn)題在于,由于矩形長(zhǎng)寬大小的不同,計(jì)算出來(lái)內(nèi)部(或外部)矩形的縮小或增大的量會(huì)不同,原則上,應(yīng)該是長(zhǎng)寬方向上縮小固定的量(類(lèi)似邊框在長(zhǎng)寬方向時(shí),邊框的大小都是一樣的)。因此,最好取其中一個(gè)值。

縮小或增大的矩形的圓角半徑是否應(yīng)該對(duì)應(yīng)縮放?這是一直沒(méi)有很好處理的問(wèn)題,如果縮小放大的變化不大,則沒(méi)有太大區(qū)別,如果比較大,圓角半徑最好保持不變(上例代碼為圓角半徑也跟著縮放的例子)

通過(guò)Inflate()方法縮放矩形

Inflate()可分為實(shí)例方法和靜態(tài)方法,它是專(zhuān)門(mén)用于縮放矩形的長(zhǎng)寬指定的量的方法,而不是長(zhǎng)寬不對(duì)等的比例計(jì)算。

推薦使用它加上圓角半徑不變的方式,計(jì)算內(nèi)層或外層圓角矩形。

Inflate的使用代碼如下,其他不變的代碼部分不再列出。

var inflateRect = Rectangle.Inflate(roundRect, -8, -8);
// inflateRect.Inflate(-8, -8); // 實(shí)例方法,長(zhǎng)寬縮小或放大指定的量,改變的實(shí)例本身

// others

到此這篇關(guān)于C#中GDI+繪制圓弧及圓角矩形等比縮放的繪制的文章就介紹到這了,更多相關(guān)C# GDI 繪制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#定時(shí)每天00點(diǎn)00分00秒自動(dòng)重啟軟件

    C#定時(shí)每天00點(diǎn)00分00秒自動(dòng)重啟軟件

    這篇文章主要為大家詳細(xì)介紹了C#定時(shí)每天00點(diǎn)00分00秒自動(dòng)重啟軟件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • C# 可空類(lèi)型的具體使用

    C# 可空類(lèi)型的具體使用

    這篇文章主要介紹了C# 可空類(lèi)型的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • C# WinForm程序完全退出的問(wèn)題解決

    C# WinForm程序完全退出的問(wèn)題解決

    C# WinForm程序完全退出的問(wèn)題解決,需要的朋友可以參考一下
    2013-05-05
  • Unity使用多態(tài)制作計(jì)算器功能

    Unity使用多態(tài)制作計(jì)算器功能

    這篇文章主要為大家詳細(xì)介紹了Unity使用多態(tài)制作計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C#基于正則表達(dá)式抓取a標(biāo)簽鏈接和innerhtml的方法

    C#基于正則表達(dá)式抓取a標(biāo)簽鏈接和innerhtml的方法

    這篇文章主要介紹了C#基于正則表達(dá)式抓取a標(biāo)簽鏈接和innerhtml的方法,結(jié)合實(shí)例形式分析了C#使用正則表達(dá)式進(jìn)行頁(yè)面元素的匹配與抓取相關(guān)操作技巧,需要的朋友可以參考下
    2017-06-06
  • WPF ProgressBar實(shí)現(xiàn)實(shí)時(shí)進(jìn)度效果

    WPF ProgressBar實(shí)現(xiàn)實(shí)時(shí)進(jìn)度效果

    這篇文章主要介紹了WPF ProgressBar實(shí)現(xiàn)實(shí)時(shí)進(jìn)度效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • C#之WinForm跨線程訪問(wèn)控件實(shí)例

    C#之WinForm跨線程訪問(wèn)控件實(shí)例

    這篇文章主要介紹了C#之WinForm跨線程訪問(wèn)控件,實(shí)例講述了跨線程訪問(wèn)控件的簡(jiǎn)單實(shí)現(xiàn)方法與用法,需要的朋友可以參考下
    2014-10-10
  • C#實(shí)現(xiàn)的基于二進(jìn)制讀寫(xiě)文件操作示例

    C#實(shí)現(xiàn)的基于二進(jìn)制讀寫(xiě)文件操作示例

    這篇文章主要介紹了C#實(shí)現(xiàn)的基于二進(jìn)制讀寫(xiě)文件操作,結(jié)合具體實(shí)例形式分析了C#以二進(jìn)制文件流形式針對(duì)文件進(jìn)行讀寫(xiě)操作的相關(guān)技巧,需要的朋友可以參考下
    2017-07-07
  • 深入了解c# 迭代器和列舉器

    深入了解c# 迭代器和列舉器

    這篇文章主要介紹了c# 迭代器和列舉器的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)C#,感興趣的朋友可以了解下
    2020-08-08
  • C#線程委托BeginInvoke與EndInvoke的用法

    C#線程委托BeginInvoke與EndInvoke的用法

    這篇文章介紹了C#線程委托BeginInvoke與EndInvoke的用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07

最新評(píng)論