a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C > 正文

解析在Direct2D中畫Bezier曲線的實現方法

2020-01-26 16:11:50
字體:
來源:轉載
供稿:網友
Direct2D通過ID2D1RenderTarget接口支持基本圖元(直線,矩形,圓角矩形,橢圓等)的繪制,然而,此接口并未提供對曲線繪制的直接支持。因此,想要使用Direct2D繪制一段通過指定點的曲線,比如Bezier曲線,必須借助于DrawGeometry()方法間接實現。需要通過一定的算法,將指定點轉換為定義Path的控制點。幸運的是,codproject上已經有人做了這項工作,給出了相應的轉換算法,并給出了C#版的實現:
Draw a Smooth Curve through a Set of 2D Points with Bezier Primitives
C#的代碼可以很容易的轉換成C++版本的,下面是我轉換的一個用于Direct2D的繪制Bezier曲線的C++函數:
復制代碼 代碼如下:

 /// <summary>
 /// Refer to : http://www.codeproject.com/KB/graphics/BezierSpline.aspx
 /// Solves a tridiagonal system for one of coordinates (x or y) of first Bezier control points.
 /// </summary>
 /// <param name="rhs">Right hand side vector.</param>
 /// <param name="x">Solution vector.</param>
 void GetFirstControlPoints(
     __in const std::vector<FLOAT>& rhs,
     __out std::vector<FLOAT>& x )
 {
     ATLASSERT(rhs.size()==x.size());
     int n = rhs.size();
     std::vector<FLOAT> tmp(n);    // Temp workspace.

     FLOAT b = 2.0f;
     x[0] = rhs[0] / b;
     for (int i = 1; i < n; i++) // Decomposition and forward substitution.
     {
         tmp[i] = 1 / b;
         b = (i < n-1 ? 4.0f : 3.5f) - tmp[i];
         x[i] = (rhs[i] - x[i-1]) / b;
     }
     for (int i = 1; i < n; i++)
     {
         x[n-i-1] -= tmp[n-i] * x[n-i]; // Back substitution.
     }
 }

 /// <summary>
 /// Refer to : http://www.codeproject.com/KB/graphics/BezierSpline.aspx
 /// Get open-ended Bezier Spline Control Points.
 /// </summary>
 /// <param name="knots">Input Knot Bezier spline points.</param>
 /// <param name="firstCtrlPt">Output First Control points array of knots.size()-1 length.</param>
 /// <param name="secondCtrlPt">Output Second Control points array of knots.size()-1 length.</param>
 void GetCurveControlPoints(
     __in const std::vector<D2D1_POINT_2F>& knots,
     __out std::vector<D2D1_POINT_2F>& firstCtrlPt,
     __out std::vector<D2D1_POINT_2F>& secondCtrlPt )
 {
     ATLASSERT( (firstCtrlPt.size()==secondCtrlPt.size())
         && (knots.size()==firstCtrlPt.size()+1) );

     int n = knots.size()-1;
     ATLASSERT(n>=1);

     if (n == 1)
     {
         // Special case: Bezier curve should be a straight line.
         // 3P1 = 2P0 + P3
         firstCtrlPt[0].x = (2 * knots[0].x + knots[1].x) / 3.0f;
         firstCtrlPt[0].y = (2 * knots[0].y + knots[1].y) / 3.0f;

         // P2 = 2P1 主站蜘蛛池模板: 亚洲精品日韩综合观看成人91 | 日本成年人免费网站 | 中国特级黄色片 | 亚洲一区二区在线免费观看 | 色综合久久久久 | 热99这里只有精品 | 最新av在线网址 | 日韩免费在线观看视频 | 久久小视频 | 最新av在线网址 | 妞干网免费 | 亚洲电影在线观看 | 欧美一区永久视频免费观看 | sese综合 | 欧美精品免费在线观看 | 丁香婷婷综合激情五月色 | 欧美日韩黄色一级片 | 国产一级片播放 | 国产一区二区精品 | 午夜久久 | 理论片一区 | 久久人人爽人人爽 | 欧美大片在线免费观看 | 亚洲一二三区影视 | h视频在线观看免费 | 国产精品视频久久久久 | 在线观看的黄色网址 | 亚洲成人综合在线 | 天天草天天色 | 中文字幕成人在线视频 | 亚洲欧洲日韩 | 在线a视频 | 视频一区在线播放 | 伊人网影院 | 国产网站在线 | 久久久久久久国产精品 | 日韩精品一区二区三区在线观看 | 天天色天天色 | 国产精品久久久久影院色老大 | 欧美日韩中文 | 日韩国产精品一区二区三区 |