麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > 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 主站蜘蛛池模板: 日本在线精品视频 | 成年免费观看视频 | 国产亚洲精品综合一区91555 | xxxxhd18hd日本hd| 亚洲一区成人在线 | 成人毛片在线 | 国产污污视频 | 黄色aaa视频 | 轻点插视频 | 免费特黄 | 亚洲一区二区国产 | 中文日韩字幕 | 久久精品亚洲一区二区三区观看模式 | 国产成人高潮免费观看精品 | 国产一级一国产一级毛片 | 久久亚洲精品久久国产一区二区 | 麻豆视频国产在线观看 | 涩涩屋av| 成人福利免费在线观看 | 免费a级网站 | 在线a毛片免费视频观看 | 日韩每日更新 | 国产精品成人一区二区三区电影毛片 | 日本不卡一区二区三区在线观看 | 日韩电影一区二区 | 欧美 日韩 国产 成人 | 日韩毛片在线看 | 爽成人777777婷婷 | 日本xxxx视频 | av在线播放电影 | 免费色片 | 亚洲视频观看 | 亚洲精品一二三区 | 国产1区2区在线 | 久久宗合色 | 国毛片 | 久久久久久久久久久高潮一区二区 | 亚洲成人国产综合 | 久久99精品久久久久久国产越南 | 毛片哪里看 | 国产精品亚洲yourport |