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)的位置,就可以通過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來計(jì)算的話得先把角度轉(zhuǎn)換為弧度
角度轉(zhuǎn)換為弧度
參考文末補(bǔ)充內(nèi)容
1、角度定義
兩條射線從圓心向圓周射出,形成一個(gè)夾角和夾角正對(duì)的一段弧。當(dāng)弧長正好等于圓周長的360分之一時(shí),兩條射線的夾角的大小為1度。(單位: º)
2、弧度定義
兩條射線從圓心向圓周射出,形成一個(gè)夾角和夾角正對(duì)的一段弧。當(dāng)這段弧長正好等于圓的半徑時(shí),兩條射線的夾角大小為1弧度(單位:rad)
即弧度 = 弧長 / 半徑
圓一周的弧度=周長 / 半徑 => 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來連接兩點(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)來看下效果可知,圓心的位置為左上角,我們可以先把刻度都畫出來,再移動(dòng)下canvas繪畫的起點(diǎn)到橙色圓的圓心就行了

我們把360度分成100分來畫出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)弧長正好等于圓周長的360分之一時(shí),兩條射線的夾角的大小為1度。(單位: º)
2、弧度定義
兩條射線從圓心向圓周射出,形成一個(gè)夾角和夾角正對(duì)的一段弧。當(dāng)這段弧長正好等于圓的半徑時(shí),兩條射線的夾角大小為1弧度(單位:rad)。
可簡單理解為: 弧度 = 弧長 / 半徑

3、弧長與弧度
圓的周長C的計(jì)算公式為:C = 2πr = πd (r - 半徑;d - 直徑)
圓一周的弧長為:2πr (弧長 = 周長)
圓一周的弧度為:2πr / r = 2π (根據(jù): 弧度 = 弧長 / 半徑)
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)文章
探秘Unity游戲開發(fā)中的狀態(tài)設(shè)計(jì)模式
這篇文章主要介紹了探秘Unity游戲開發(fā)中的狀態(tài)設(shè)計(jì)模式,狀態(tài)模式是Unity游戲開發(fā)中常用的一種設(shè)計(jì)模式,可以幫助開發(fā)者更好地管理游戲?qū)ο鬆顟B(tài),提高游戲的可維護(hù)性和可擴(kuò)展性2023-05-05
C#?Winform消息通知系統(tǒng)托盤氣泡提示框ToolTip控件
這篇文章主要為大家介紹了C#或Winform中的消息通知之系統(tǒng)托盤的氣泡提示框窗口(系統(tǒng)toast通知)、ToolTip控件和ToolTipText屬性詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
unity3d?對(duì)接?workerman?實(shí)現(xiàn)聯(lián)機(jī)游戲功能
workerman?是一款開源高性能?PHP?應(yīng)用容器,他除了用于互聯(lián)網(wǎng)、即時(shí)通訊、APP?開發(fā)、硬件通訊、智能家居、物聯(lián)網(wǎng)等領(lǐng)域的開發(fā)外,這篇文章主要介紹了unity3d?對(duì)接?workerman?實(shí)現(xiàn)聯(lián)機(jī)游戲,需要的朋友可以參考下2022-10-10
WCF實(shí)現(xiàn)進(jìn)程間管道通信Demo分享
下面小編就為大家分享一篇WCF實(shí)現(xiàn)進(jìn)程間管道通信Demo,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2017-12-12

