WPF绘制光滑连续贝塞尔曲线
?
1.需求
WPF本身沒(méi)有直接把點(diǎn)集合繪制成曲線的函數(shù)。可以通過(guò)貝塞爾曲線函數(shù)來(lái)繪制。
貝塞爾曲線類是:BezierSegment,三次貝塞爾曲線,通過(guò)兩個(gè)控制點(diǎn)來(lái)控制開始和結(jié)束方向。
QuadraticBezierSegment,二次貝塞爾,通過(guò)一個(gè)控制點(diǎn)來(lái)控制彎曲方向。
本文使用的是三次。
?
圖片來(lái)源維基百科
2.思路
參考文檔是:https://www.cnblogs.com/pangliang/archive/2011/03/24/1993308.html
大值思路是根據(jù)當(dāng)前點(diǎn),前一個(gè)點(diǎn),后一個(gè)點(diǎn),再后一個(gè)點(diǎn)。共四個(gè)點(diǎn),來(lái)生成一條三次貝塞爾曲線。
曲線需要(開始點(diǎn),結(jié)束點(diǎn),控制點(diǎn)1,控制點(diǎn)2),圖中標(biāo)識(shí)的兩個(gè)紅色點(diǎn)即是控制點(diǎn)。
代碼主要是計(jì)算兩個(gè)紅色的控制點(diǎn)。
先計(jì)算相鄰點(diǎn)的中點(diǎn)【橙色】。
再將中點(diǎn)的連線平移到相鄰的位置【藍(lán)色點(diǎn)】,取得虛線,得到虛線的端點(diǎn)【紅色】。
紅色,即為控制點(diǎn)。
3.主要代碼
?
/// <summary>/// 獲得貝塞爾曲線/// </summary>/// <param name="currentPt">當(dāng)前點(diǎn)</param>/// <param name="lastPt">上一個(gè)點(diǎn)</param>/// <param name="nextPt1">下一個(gè)點(diǎn)1</param>/// <param name="nextPt2">下一個(gè)點(diǎn)2</param>/// <returns></returns>private BezierSegment GetBezierSegment(Point currentPt, Point lastPt, Point nextPt1, Point nextPt2){//計(jì)算中點(diǎn)var lastC = GetCenterPoint(lastPt, currentPt);var nextC1 = GetCenterPoint(currentPt, nextPt1); //貝塞爾控制點(diǎn)var nextC2 = GetCenterPoint(nextPt1, nextPt2);//計(jì)算相鄰中點(diǎn)連線跟目的點(diǎn)的垂足//效果并不算太好,因?yàn)榭赡茳c(diǎn)在兩個(gè)線上或者線的延長(zhǎng)線上,計(jì)算會(huì)有誤差//所以就直接使用中點(diǎn)平移方法。//var C1 = GetFootPoint(lastC, nextC1, currentPt);//var C2 = GetFootPoint(nextC1, nextC2, nextPt1);//計(jì)算“相鄰中點(diǎn)”的中點(diǎn)var c1 = GetCenterPoint(lastC, nextC1);var c2 = GetCenterPoint(nextC1, nextC2);//計(jì)算【"中點(diǎn)"的中點(diǎn)】需要的點(diǎn)位移var controlPtOffset1 = currentPt - c1;var controlPtOffset2 = nextPt1 - c2;//移動(dòng)控制點(diǎn)var controlPt1 = nextC1 + controlPtOffset1;var controlPt2 = nextC1 + controlPtOffset2;//如果覺(jué)得曲線幅度太大,可以將控制點(diǎn)向當(dāng)前點(diǎn)靠近一定的系數(shù)。controlPt1 = controlPt1 + 0 * (currentPt - controlPt1);controlPt2 = controlPt2 + 0 * (nextPt1 - controlPt2);var bzs = new BezierSegment(controlPt1, controlPt2, nextPt1, true);return bzs;}
效果圖如下:
?
4.源碼下載
?https://files.cnblogs.com/files/chlm/WPF%E5%85%89%E6%BB%91%E6%9B%B2%E7%BA%BF%E5%9B%BE.rar
感謝閱讀,希望可以幫到你
總結(jié)
以上是生活随笔為你收集整理的WPF绘制光滑连续贝塞尔曲线的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 百度云不限速就用它-如何百度云不限速
- 下一篇: 苹果开发者账号如何多人协作进行开发和真机