最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2018年04月17日 08:38:34   作者:冷火蟲(chóng)  
貝塞爾曲線,又稱貝茲曲線或貝濟(jì)埃曲線,一般的矢量圖形軟件通過(guò)它來(lái)精確畫(huà)出曲線,下面這篇文章主要給大家介紹了關(guān)于WPF如何繪制光滑連續(xù)貝塞爾曲線的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。

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等。

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

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

本文使用的是三次。

 

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

2.思路

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

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

效果圖如下:

 

4.源碼下載

http://xiazai.jb51.net/201804/yuanma/WPF-BezierSegment(jb51.net).rar

總結(jié)

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

相關(guān)文章

  • C#結(jié)合JavaScript實(shí)現(xiàn)秒殺倒計(jì)時(shí)的方法

    C#結(jié)合JavaScript實(shí)現(xiàn)秒殺倒計(jì)時(shí)的方法

    這篇文章主要介紹了C#結(jié)合JavaScript實(shí)現(xiàn)秒殺倒計(jì)時(shí)的方法,涉及C#結(jié)合javascript操作時(shí)間的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • C#基于Socket實(shí)現(xiàn)簡(jiǎn)單聊天室功能

    C#基于Socket實(shí)現(xiàn)簡(jiǎn)單聊天室功能

    這篇文章主要為大家詳細(xì)介紹了C#基于Socket實(shí)現(xiàn)簡(jiǎn)單聊天室功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C#結(jié)合html2canvas切割圖片并導(dǎo)出到PDF

    C#結(jié)合html2canvas切割圖片并導(dǎo)出到PDF

    html2canvas?是一個(gè)?JavaScript?庫(kù),它可以把任意一個(gè)網(wǎng)頁(yè)中的元素繪制到指定的?canvas?中,本文將結(jié)合html2canvas進(jìn)行切割圖片并導(dǎo)出到PDF,感興趣的可以了解下
    2025-02-02
  • C#中split用法實(shí)例總結(jié)

    C#中split用法實(shí)例總結(jié)

    這篇文章主要介紹了C#中split用法,結(jié)合實(shí)例形式總結(jié)分析了C#常見(jiàn)的split操作字符串相關(guān)技巧,需要的朋友可以參考下
    2016-06-06
  • winform多線程組件BackgroundWorker使用

    winform多線程組件BackgroundWorker使用

    這篇文章介紹了winform多線程組件BackgroundWorker的使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • C#快速實(shí)現(xiàn)拖放操作

    C#快速實(shí)現(xiàn)拖放操作

    這篇文章介紹了C#快速實(shí)現(xiàn)拖放操作的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • C#中ArrayList的使用方法

    C#中ArrayList的使用方法

    這篇文章主要介紹了
    2013-12-12
  • 使用C#發(fā)送帶附件的電子郵件的方法的代碼示例分析

    使用C#發(fā)送帶附件的電子郵件的方法的代碼示例分析

    這篇文章主要介紹了使用C#發(fā)送帶附件的電子郵件的方法的代碼示例分析,文中還提到了利用163的SMTP服務(wù)器發(fā)郵件的方法,需要的朋友可以參考下
    2016-02-02
  • C#獲取文件夾所占空間大小的功能

    C#獲取文件夾所占空間大小的功能

    這篇文章介紹了C#獲取文件夾所占空間大小的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • 為何Linq的Distinct實(shí)在是不給力

    為何Linq的Distinct實(shí)在是不給力

    本篇文章對(duì)Linq的Distinct進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05

最新評(píng)論

平谷区| 盘山县| 临城县| 满城县| 张掖市| 年辖:市辖区| 富源县| 德化县| 乡城县| 阜宁县| 图片| 呼伦贝尔市| 互助| 松阳县| 两当县| 汪清县| 晋江市| 蒲江县| 习水县| 区。| 阜南县| 博罗县| 青铜峡市| 海淀区| 文山县| 威信县| 宝丰县| 中阳县| 格尔木市| 陵水| 隆昌县| 芜湖县| 和田市| 蛟河市| 玉树县| 罗江县| 侯马市| 姚安县| 托克逊县| 固原市| 阿拉善左旗|