WPF如何在圓形上優(yōu)雅地添加刻度線
思路
我們可以使用Ellipse先畫出一個(gè)圓當(dāng)背景,然后用Canvas再疊加畫上刻度線,就能得到如下的效果
我們先用Ellipse畫一個(gè)橙色的圓,然后將Canvas的寬度和高度綁定到Ellipse的寬度和高度
<Grid> <Ellipse Fill="Orange" Width="400" Height="400" Name="BackEllipse"/> <Canvas x:Name="MainCanvas" Width="{Binding Width,ElementName=BackEllipse}" Height="{Binding Height,ElementName=BackEllipse}"/> </Grid>
然后我們現(xiàn)在只需要知道點(diǎn)的位置,就可以通過(guò)canvas畫出相應(yīng)的線條了.
計(jì)算圓上點(diǎn)的位置
假設(shè)我們要計(jì)算的點(diǎn)為X,那么隊(duì)員X點(diǎn)的坐標(biāo)為(X1,Y1)
sin(a)=Y1/r => Y1=r*sin(a)
cos(a)=X1/r => X1=r*cos(a)
使用Math.Sin來(lái)計(jì)算的話得先把角度轉(zhuǎn)換為弧度
角度轉(zhuǎn)換為弧度
參考文末補(bǔ)充內(nèi)容
1、角度定義
兩條射線從圓心向圓周射出,形成一個(gè)夾角和夾角正對(duì)的一段弧。當(dāng)弧長(zhǎng)正好等于圓周長(zhǎng)的360分之一時(shí),兩條射線的夾角的大小為1度。(單位: º)
2、弧度定義
兩條射線從圓心向圓周射出,形成一個(gè)夾角和夾角正對(duì)的一段弧。當(dāng)這段弧長(zhǎng)正好等于圓的半徑時(shí),兩條射線的夾角大小為1弧度(單位:rad)
即弧度 = 弧長(zhǎng) / 半徑
圓一周的弧度=周長(zhǎng) / 半徑 => 2πr / r =360º => π=180º,繼而可以知道一弧度等于180º/π
可知:sin(30º)=Math.Sin(30*Math.PI / 180)
使用canvas畫出線段
我們只需要計(jì)算出X點(diǎn)和Z點(diǎn)的坐標(biāo),就能使用Line來(lái)連接兩點(diǎn)畫出刻度線了.
假設(shè)Z所在的圓的半徑為r,X所在的圓的半徑為(r-20)
double radius = BackEllipse.Width / 2; Line lineScale = new Line(); lineScale.X1 = (radius - 20) * Math.Cos(30 * Math.PI / 180); lineScale.Y1 = (radius - 20) * Math.Sin(30 * Math.PI / 180); lineScale.X2 = radius * Math.Cos(30 * Math.PI / 180); lineScale.Y2 = radius * Math.Sin(30 * Math.PI / 180); lineScale.Stroke = Brushes.Red; lineScale.StrokeThickness = 2; MainCanvas.Children.Add(lineScale);
可以得到圖像
我們先把把canvas用藍(lán)色填充,然后把X點(diǎn)設(shè)為(0,0)來(lái)看下效果可知,圓心的位置為左上角,我們可以先把刻度都畫出來(lái),再移動(dòng)下canvas繪畫的起點(diǎn)到橙色圓的圓心就行了
我們把360度分成100分來(lái)畫出100個(gè)刻度線,代碼如下
double radius = BackEllipse.Width / 2; double min = 0; double max = 100; double step = 360.0 / (max - min); for (int i = 0; i < max - min; i++) { Line lineScale = new Line { X1 = (radius - 20) * Math.Cos(i * step * Math.PI / 180), Y1 = (radius - 20) * Math.Sin(i * step * Math.PI / 180), X2 = radius * Math.Cos(i * step * Math.PI / 180), Y2 = radius * Math.Sin(i * step * Math.PI / 180), Stroke = Brushes.Red, StrokeThickness = 2 }; MainCanvas.Children.Add(lineScale); }
我們只需要把X點(diǎn)和Z點(diǎn)都加上半徑就能把canvas繪畫的起點(diǎn)移動(dòng)到圓心的位置,把canvas的背景色去掉效果就實(shí)現(xiàn)我們想要的效果了
完整的代碼如下
前臺(tái)代碼
<Grid> <Ellipse Fill="Orange" Width="400" Height="400" Name="BackEllipse"/> <Canvas x:Name="MainCanvas" Width="{Binding Width,ElementName=BackEllipse}" Height="{Binding Height,ElementName=BackEllipse}"/> </Grid>
后臺(tái)代碼
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); DoDraw(); } private void DoDraw() { double radius = BackEllipse.Width / 2; double min = 0; double max = 100; double step = 360.0 / (max - min); for (int i = 0; i < max - min; i++) { Line lineScale = new Line { X1 = ((radius - 20) * Math.Cos(i * step * Math.PI / 180)) + radius, Y1 = ((radius - 20) * Math.Sin(i * step * Math.PI / 180)) + radius, X2 = (radius * Math.Cos(i * step * Math.PI / 180)) + radius, Y2 = (radius * Math.Sin(i * step * Math.PI / 180)) + radius, Stroke = Brushes.Red, StrokeThickness = 2 }; MainCanvas.Children.Add(lineScale); } } }
知識(shí)補(bǔ)充
角度與弧度互轉(zhuǎn)
1、角度定義
兩條射線從圓心向圓周射出,形成一個(gè)夾角和夾角正對(duì)的一段弧。當(dāng)弧長(zhǎng)正好等于圓周長(zhǎng)的360分之一時(shí),兩條射線的夾角的大小為1度。(單位: º)
2、弧度定義
兩條射線從圓心向圓周射出,形成一個(gè)夾角和夾角正對(duì)的一段弧。當(dāng)這段弧長(zhǎng)正好等于圓的半徑時(shí),兩條射線的夾角大小為1弧度(單位:rad)。
可簡(jiǎn)單理解為: 弧度 = 弧長(zhǎng) / 半徑
3、弧長(zhǎng)與弧度
圓的周長(zhǎng)C的計(jì)算公式為:C = 2πr = πd (r - 半徑;d - 直徑)
圓一周的弧長(zhǎng)為:2πr (弧長(zhǎng) = 周長(zhǎng))
圓一周的弧度為:2πr / r = 2π (根據(jù): 弧度 = 弧長(zhǎng) / 半徑)
4、度與角度的轉(zhuǎn)換
根據(jù)圓為360 º,弧度為2π,即 360º = 2π
角度轉(zhuǎn)弧度:2π / 360 = π / 180 ≈ 0.0174rad, 即: 度數(shù) * (π / 180) = 弧度
例如:將30º轉(zhuǎn)為弧度rad
30º * (π / 180)= 0.523320 rad
弧度轉(zhuǎn)角度: 360 / 2π = 180 / π ≈ 57.3º, 即: 弧度 * (180 / π) = 度數(shù)
例如:將0.523320rad轉(zhuǎn)為度º
0.523320rad * (180 / π) = 29.9992352688º
到此這篇關(guān)于WPF如何在圓形上優(yōu)雅地添加刻度線的文章就介紹到這了,更多相關(guān)WPF圓形添加刻度線內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#中Selenium?WebDriver的常用操作小結(jié)
這篇文章主要為大家詳細(xì)介紹了C#中Selenium?WebDriver的常用操作,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的小伙伴可以參考一下2024-01-01C#實(shí)現(xiàn)在Excel中插入和操作切片器
本文主要介紹了如何使用C#在Excel中插入和操作切片器,包括插入切片器到透視表和表格,修改切片器屬性以及刪除切片器,主要使用了Spire.XLSfor.NET庫(kù)來(lái)實(shí)現(xiàn)這些功能,需要的朋友可以參考下2025-03-03Unity UGUI的Slider滑動(dòng)條件組使用詳解
這篇文章主要為大家介紹了Unity UGUI的Slider滑動(dòng)條件組使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07C#將配置文件appsetting中的值轉(zhuǎn)換為動(dòng)態(tài)對(duì)象調(diào)用
這篇文章主要介紹了將配置文件appsetting中的值轉(zhuǎn)換為動(dòng)態(tài)對(duì)象調(diào)用 ,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09C#實(shí)現(xiàn) Server-sent Events的步驟
這篇文章主要介紹了C#實(shí)現(xiàn) Server-sent Events的步驟,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下2021-01-01