国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C# > 正文

WPF如何繪制光滑連續(xù)貝塞爾曲線示例代碼

2019-10-29 21:06:00
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

1.需求

WPF本身沒(méi)有直接把點(diǎn)集合繪制成曲線的函數(shù)。可以通過(guò)貝塞爾曲線函數(shù)來(lái)繪制。  

貝茲曲線由線段與節(jié)點(diǎn)組成,節(jié)點(diǎn)是可拖動(dòng)的支點(diǎn),線段像可伸縮的皮筋,我們?cè)诶L圖工具上看到的鋼筆工具就是來(lái)做這種矢量曲線的。當(dāng)然在一些比較成熟的位圖軟件中也有貝塞爾曲線工具,如PhotoShop等。

貝塞爾曲線類是:BezierSegment,三次貝塞爾曲線,通過(guò)兩個(gè)控制點(diǎn)來(lái)控制開(kāi)始和結(jié)束方向。

QuadraticBezierSegment,二次貝塞爾,通過(guò)一個(gè)控制點(diǎn)來(lái)控制彎曲方向。

本文使用的是三次。

wpf,繪制貝塞爾曲線,貝塞爾曲線,貝塞爾曲線繪制

圖片來(lái)源維基百科

2.思路

大值思路是根據(jù)當(dāng)前點(diǎn),前一個(gè)點(diǎn),后一個(gè)點(diǎn),再后一個(gè)點(diǎn)。共四個(gè)點(diǎn),來(lái)生成一條三次貝塞爾曲線。

wpf,繪制貝塞爾曲線,貝塞爾曲線,貝塞爾曲線繪制

曲線需要(開(kā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; }

效果圖如下:

wpf,繪制貝塞爾曲線,貝塞爾曲線,貝塞爾曲線繪制

 

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)VEVB武林網(wǎng)的支持。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到c#教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 贞丰县| 大关县| 莱西市| 定西市| 根河市| 哈巴河县| 江源县| 伊宁县| 临邑县| 高州市| 兴业县| 抚州市| 五峰| 厦门市| 玛沁县| 土默特右旗| 祁连县| 门源| 吉木乃县| 苏尼特左旗| 神农架林区| 汕尾市| 图们市| 吉林省| 武夷山市| 东至县| 宾川县| 潢川县| 磐安县| 时尚| 东方市| 鄂尔多斯市| 太原市| 昌图县| 平度市| 宁安市| 达州市| 黑河市| 合肥市| 扬州市| 桐梓县|