WPF如何繪制光滑連續(xù)貝塞爾曲線示例代碼
1.需求
WPF本身沒有直接把點集合繪制成曲線的函數(shù)??梢酝ㄟ^貝塞爾曲線函數(shù)來繪制?! ?/p>
貝茲曲線由線段與節(jié)點組成,節(jié)點是可拖動的支點,線段像可伸縮的皮筋,我們在繪圖工具上看到的鋼筆工具就是來做這種矢量曲線的。當(dāng)然在一些比較成熟的位圖軟件中也有貝塞爾曲線工具,如PhotoShop等。
貝塞爾曲線類是:BezierSegment,三次貝塞爾曲線,通過兩個控制點來控制開始和結(jié)束方向。
QuadraticBezierSegment,二次貝塞爾,通過一個控制點來控制彎曲方向。
本文使用的是三次。
圖片來源維基百科
2.思路
大值思路是根據(jù)當(dāng)前點,前一個點,后一個點,再后一個點。共四個點,來生成一條三次貝塞爾曲線。
曲線需要(開始點,結(jié)束點,控制點1,控制點2),圖中標(biāo)識的兩個紅色點即是控制點。
代碼主要是計算兩個紅色的控制點。
先計算相鄰點的中點【橙色】。
再將中點的連線平移到相鄰的位置【藍(lán)色點】,取得虛線,得到虛線的端點【紅色】。
紅色,即為控制點。
3.主要代碼
/// <summary> /// 獲得貝塞爾曲線 /// </summary> /// <param name="currentPt">當(dāng)前點</param> /// <param name="lastPt">上一個點</param> /// <param name="nextPt1">下一個點1</param> /// <param name="nextPt2">下一個點2</param> /// <returns></returns> private BezierSegment GetBezierSegment(Point currentPt, Point lastPt, Point nextPt1, Point nextPt2) { //計算中點 var lastC = GetCenterPoint(lastPt, currentPt); var nextC1 = GetCenterPoint(currentPt, nextPt1); //貝塞爾控制點 var nextC2 = GetCenterPoint(nextPt1, nextPt2); //計算相鄰中點連線跟目的點的垂足 //效果并不算太好,因為可能點在兩個線上或者線的延長線上,計算會有誤差 //所以就直接使用中點平移方法。 //var C1 = GetFootPoint(lastC, nextC1, currentPt); //var C2 = GetFootPoint(nextC1, nextC2, nextPt1); //計算“相鄰中點”的中點 var c1 = GetCenterPoint(lastC, nextC1); var c2 = GetCenterPoint(nextC1, nextC2); //計算【"中點"的中點】需要的點位移 var controlPtOffset1 = currentPt - c1; var controlPtOffset2 = nextPt1 - c2; //移動控制點 var controlPt1 = nextC1 + controlPtOffset1; var controlPt2 = nextC1 + controlPtOffset2; //如果覺得曲線幅度太大,可以將控制點向當(dāng)前點靠近一定的系數(shù)。 controlPt1 = controlPt1 + 0 * (currentPt - controlPt1); controlPt2 = controlPt2 + 0 * (nextPt1 - controlPt2); var bzs = new BezierSegment(controlPt1, controlPt2, nextPt1, true); return bzs; }
效果圖如下:
4.源碼下載
http://xiazai.jb51.net/201804/yuanma/WPF-BezierSegment(jb51.net).rar
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對我們的支持。
欄 目:C#教程
下一篇:C# Oracle批量插入數(shù)據(jù)進(jìn)度條的實現(xiàn)代碼
本文標(biāo)題:WPF如何繪制光滑連續(xù)貝塞爾曲線示例代碼
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/5207.html
您可能感興趣的文章
- 01-10WinForm繪制圓角的方法
- 01-10Extjs4如何處理后臺json數(shù)據(jù)中日期和時間
- 01-10asp.net中XML如何做增刪改查操作
- 01-10C#及WPF獲取本機所有字體和顏色的方法
- 01-10WPF實現(xiàn)類似360安全衛(wèi)士界面的程序源碼分享
- 01-10C#繪制曲線圖的方法
- 01-10C#.NET中如何批量插入大量數(shù)據(jù)到數(shù)據(jù)庫中
- 01-10WPF實現(xiàn)時鐘特效
- 01-10超炫酷的WPF實現(xiàn)Loading控件效果
- 01-10解析C#中的常量及如何在C#編程中定義常量


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻 器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機閱讀
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 04-02jquery與jsp,用jquery
- 01-10delphi制作wav文件的方法
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10C#中split用法實例總結(jié)
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改