樣條之貝塞爾(Bezier)

? ? ? 我曾經發過兩篇關于貝塞爾的文章:數學圖形(1.47)貝塞爾(Bézier)曲線,數學圖形之貝塞爾(Bézier)曲面。那是使用我自己定義的腳本語言生成貝塞爾圖形。由于我自己定義的腳本語法功能有限,所以最多只能支持5次貝塞爾函數,而這里將實現N次。

? ? ? N階貝塞爾曲線可如下推斷:

? ? ? 給定點P0P1、…、Pn,其貝塞爾曲線即

? ? ??\mathbf{B}(t)=\sum_{i=0}^n {n\choose i}\mathbf{P}_i(1-t)^{n-i}t^i ={n\choose 0}\mathbf{P}_0(1-t)^nt^{0}+{n\choose 1}\mathbf{P}_1(1-t)^{n-1}t^{1}+\cdots+{n\choose n-1}\mathbf{P}_{n-1}(1-t)^{1}t^{n-1}+{n\choose n}\mathbf{P}_n(1-t)^{0}t^n \mbox{ , } t \in [0,1]

看其公式需要先為之生成一套楊輝三角形數組。

關于插值與樣條的介紹請看:http://www.cnblogs.com/WhyEngine/p/4020294.html

.h文件

 1 /****************************************************************
 2 
 3   File name   :  YcBezierSpline.h
 4   Author      :  葉峰
 5   Version     :  2.0
 6   Create Date :  2014/08/18  
 7   Description :  Bezier樣條
 8 
 9 *****************************************************************/
10 
11 #ifndef __YcBezierSpline_H__
12 #define __YcBezierSpline_H__
13 
14 // INCLUDES -----------------------------------------------------------------------------
15 
16 #include "YicSpline.h"
17 
18 // --------------------------------------------------------------------------------------
19 
20 #define YD_MAX_BEZIER_CONTROL_VALUE 33
21 
22 // --------------------------------------------------------------------------------------
23 
24 class YcBezierSpline : public YicSpline
25 {
26 public:
27     YcBezierSpline();
28 
29     ~YcBezierSpline();
30 
31     // 設置輸出樣條值的數目
32     void    SetSplineValuesCount(Yuint count);
33 
34     // 獲得輸出樣條值的數目
35     Yuint   GetSplineValuesCount() const;
36 
37     // 計算樣條數值
38     bool    BuildSpline(const void* ctrlValuesPtr, Yuint ctrlStride, Yuint ctrlCount, 
39         void* splineValuesPtr, Yuint splineStride) const;
40 
41 protected:
42     void    ClearPowT();
43 
44     void    BuildPowT();
45 
46     Yreal    GetValueT(Yint t, Yint p) const
47     {
48         return m_pow_t[YD_MAX_BEZIER_CONTROL_VALUE*t + p];
49     }
50 
51 protected:
52     Yuint   m_valuesCount;
53     Yreal*  m_pow_t;
54 
55 protected:
56     static void    BuildYanghuiTriangle();
57     static Yint m_yanghuiRowIndex[YD_MAX_BEZIER_CONTROL_VALUE];
58     static Yint m_yanghuiTriangle[(YD_MAX_BEZIER_CONTROL_VALUE+1)*YD_MAX_BEZIER_CONTROL_VALUE/2];
59 };
60 
61 // --------------------------------------------------------------------------------------
62 
63 #endif

CPP文件

  1 /****************************************************************
  2 
  3   File name   :  YcBezierSpline.cpp
  4   Author      :  葉峰
  5   Version     :  2.0
  6   Create Date :  2014/08/18  
  7   Description :  
  8 
  9 *****************************************************************/
 10 
 11 // INCLUDES -----------------------------------------------------------------------------
 12 
 13 #include "..\..\YCommon_h\YSpline\YcBezierSpline.h"
 14 #include <assert.h>
 15 
 16 // --------------------------------------------------------------------------------------
 17 
 18 Yint    YcBezierSpline::m_yanghuiRowIndex[YD_MAX_BEZIER_CONTROL_VALUE] = {0};
 19 Yint    YcBezierSpline::m_yanghuiTriangle[(YD_MAX_BEZIER_CONTROL_VALUE+1)*YD_MAX_BEZIER_CONTROL_VALUE/2] = {0};
 20 
 21 void    YcBezierSpline::BuildYanghuiTriangle()
 22 {
 23     // 第0行
 24     m_yanghuiRowIndex[0] = 0;
 25     m_yanghuiTriangle[0] = 1;
 26 
 27     Yint index = 1;
 28     Yint t0,t1;
 29     Yint* lastRow;
 30     for (Yint i = 1; i < YD_MAX_BEZIER_CONTROL_VALUE; i++)
 31     {
 32         m_yanghuiRowIndex[i] = index;
 33         m_yanghuiTriangle[index] = 1;
 34         index++;
 35 
 36         for (Yint j = 1; j <= i; j++)
 37         {
 38             lastRow = m_yanghuiTriangle + m_yanghuiRowIndex[i-1];
 39             t0 = lastRow[j - 1];
 40             t1 = (j < i) ? lastRow[j] : 0;
 41 
 42             m_yanghuiTriangle[index] = t0 + t1;
 43             index++;
 44         }
 45     }
 46 
 47     assert(index == (YD_MAX_BEZIER_CONTROL_VALUE+1)*YD_MAX_BEZIER_CONTROL_VALUE/2);
 48 }
 49 
 50 // --------------------------------------------------------------------------------------
 51 
 52 YcBezierSpline::YcBezierSpline()
 53 {
 54     if (m_yanghuiTriangle[0] == 0)
 55     {
 56         BuildYanghuiTriangle();
 57     }
 58 
 59     m_valuesCount = 0;
 60     m_pow_t = NULL;
 61 
 62     SetSplineValuesCount(100);
 63 }
 64 
 65 YcBezierSpline::~YcBezierSpline()
 66 {
 67     ClearPowT();
 68 }
 69 
 70 // 設置輸出樣條值的數目
 71 void   YcBezierSpline::SetSplineValuesCount(Yuint count)
 72 {
 73     if (count < 2)
 74     {
 75         count = 2;
 76     }
 77 
 78     if (count == m_valuesCount)
 79     {
 80         return;
 81     }
 82     m_valuesCount = count;
 83     BuildPowT();
 84 }
 85 
 86 // 獲得輸出樣條值的數目
 87 Yuint   YcBezierSpline::GetSplineValuesCount() const
 88 {
 89     return m_valuesCount;
 90 }
 91 
 92 void    YcBezierSpline::ClearPowT()
 93 {
 94     if (m_pow_t)
 95     {
 96         free(m_pow_t);
 97         m_pow_t = NULL;
 98     }
 99 }
100 
101 void    YcBezierSpline::BuildPowT()
102 {
103     ClearPowT();
104 
105     m_pow_t = (Yreal*)malloc(m_valuesCount*YD_MAX_BEZIER_CONTROL_VALUE*sizeof(Yreal));
106     Yreal t;
107     for (Yuint i = 0; i < m_valuesCount; i++)
108     {
109         t = i/(m_valuesCount - 1.0f);
110 
111         m_pow_t[i*YD_MAX_BEZIER_CONTROL_VALUE] = 1.0f;
112         for (Yint j = 1; j < YD_MAX_BEZIER_CONTROL_VALUE; j++)
113         {
114             m_pow_t[i*YD_MAX_BEZIER_CONTROL_VALUE + j] = m_pow_t[i*YD_MAX_BEZIER_CONTROL_VALUE + j - 1]*t;
115         }
116     }
117 }
118 
119 // 計算樣條數值
120 bool    YcBezierSpline::BuildSpline(const void* ctrlValuesPtr, Yuint ctrlStride, Yuint ctrlCount, 
121     void* splineValuesPtr, Yuint splineStride) const
122 {
123     if (ctrlCount < 2 || ctrlCount > YD_MAX_BEZIER_CONTROL_VALUE)
124     {
125         return false;
126     }
127 
128     Yreal* destValue;
129     Yreal* srcValue;
130     Yreal v;
131     const Yint* yanghuiRow = m_yanghuiTriangle + m_yanghuiRowIndex[ctrlCount - 1];
132 
133     for (Yuint i = 0; i < m_valuesCount; i++)
134     {
135         v = 0.0f;
136         for (Yuint j = 0; j < ctrlCount; j++)
137         {
138             srcValue = (Yreal*)((char*)ctrlValuesPtr + ctrlStride*j);
139             v += yanghuiRow[j] * (*srcValue) * GetValueT(i, j) * GetValueT(m_valuesCount - 1 - i, ctrlCount - 1 - j);
140         }
141 
142         destValue = (Yreal*)((char*)splineValuesPtr + splineStride*i);
143         *destValue = v;
144     }
145 
146     return true;
147 }
148 
149 // --------------------------------------------------------------------------------------

?圖像:

相關軟件的下載地址為:http://files.cnblogs.com/WhyEngine/TestSpline.zip

轉載于:https://www.cnblogs.com/WhyEngine/p/4020365.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/273570.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/273570.shtml
英文地址,請注明出處:http://en.pswp.cn/news/273570.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

TCollector

TCollector tcollector is a client-side process that gathers data from local collectors and pushes the data to OpenTSDB. You run it on all your hosts, and it does the work of sending each hosts data to the TSD. tcollector是client-side&#xff08;客戶端&…

設計模式 之 工廠模式

項目源碼&#xff1a;https://gitee.com/Jacob-gitee/DesignMode 個人博客&#xff1a;https://jacob.org.cn 女媧造人的故事 東漢《風俗通》記錄了一則神話故事&#xff1a;“開天辟地&#xff0c;未有人民&#xff0c;女媧搏黃土做人”&#xff0c;講述的內容就是大家非常熟…

設計模式 之 單例模式

項目源碼&#xff1a;https://gitee.com/Jacob-gitee/DesignMode 個人博客&#xff1a;https://jacob.org.cn 宗旨 Ensure a class has only one instance,and provide a global point of access to it.&#xff08;確保某一個類只有一個實例&#xff0c;而且自行實例化并向整個…

如何實現滑動scrollview上下隱藏

問題描述現在有一個需求&#xff0c;就是一個界面如下ABCA固定在頂部&#xff0c;C固定在底部其中B是一個scrollview(也可能是listview)&#xff0c;要實現&#xff0c;在向上滑動B的時候&#xff0c;A平滑的往上滑&#xff0c;同時C平滑的往下滑&#xff0c;直到消失&#xff…

設計模式 之 抽象工廠模式

項目源碼&#xff1a;https://gitee.com/Jacob-gitee/DesignMode 個人博客 &#xff1a;https://jacob.org.cn 女媧的失誤 工廠模式中講了女媧造人的故事。人是造出來了&#xff0c;世界也熱鬧了&#xff0c;可是低頭一看&#xff0c;都是清一色的類型&#xff0c;缺少關愛、仇…

strip 命令的使用方法

用途 通過除去綁定程序和符號調試程序使用的信息&#xff0c;降低擴展公共對象文件格式&#xff08;XCOFF&#xff09;的對象文件的大小。 語法 strip [ -V ] [ -r [ -l ] | -x [ -l ] | -t | -H | -e | -E ] [ -X {32 |64 |32_64 }] [ -- ] File ... 描…

設計模式 之 模板模式

項目源碼&#xff1a;https://gitee.com/Jacob-gitee/DesignMode 個人博客 &#xff1a;http://jacob.org.cn 女媧的失誤 工廠模式中講了女媧造人的故事。人是造出來了&#xff0c;世界也熱鬧了&#xff0c;可是低頭一看&#xff0c;都是清一色的類型&#xff0c;缺少關愛、仇…

使用Java高速實現進度條

基于有人問到如何做進度條&#xff0c;以下給個簡單的做法&#xff1a; 主要是使用JProgressBar&#xff08;Swing內置javax.swing.JProgressBar&#xff09;和SwingWorker&#xff08;Swing內置javax.swing.SwingWorker&#xff09; 有人肯定會說&#xff0c;不是用線程做的嗎…

Linux 安裝JDK

個人博客 &#xff1a;https://www.siyuan.run CSDN&#xff1a;https://blog.csdn.net/siyuan 微信小程序&#xff1a;思遠Y 安裝時使用到的命令&#xff1a; cd&#xff1a;切換目錄。 eg&#xff1a;cd / mkdir&#xff1a;創建目錄。 eg&#xff1a;mkdir jacob 創建單極目…

Css導航

<div> <ul> <li><a></a></li> <li><a></a></li> <li><a></a></li> .. </ul> </div> <li>中也可包含 <ul> <a></a> <li><a></a>&…

關于js的function.來自百度知道的回答,學習了.

在js中&#xff0c;創建一個函數對象的語法是var myFunction new Function(arg1,…,agrN, body);其中&#xff0c;該函數對象的N個參數放在 函數主體參數body的前面&#xff0c;即函數主體參數必須放在參數列表的最后&#xff0c;也可以無參數new Function(body)。你添加第三個…

Ribbon 支持的9大負載均衡策略

個人博客 &#xff1a;https://www.siyuan.run CSDN&#xff1a;https://blog.csdn.net/siyuan 微信小程序&#xff1a;思遠Y 線性輪詢策略&#xff1a; RoundRibbonRule BaseLoadBalancer 負載均衡器默認采用線性負載輪詢負載均衡策略。 工作流程&#xff1a; RoundRibbonRule…

fedora20開機啟動配置:systemctl

老版fedora中使用chkconfig配置開機啟動&#xff0c;fedora20中&#xff0c;使用chkconfig會出現各種問題。使用systemctl配置。 具體表格如下 轉載于:https://www.cnblogs.com/hh6plus/p/5548083.html

Mysql 字符操作函數相關

常用的字符串函數&#xff1a; 函數說明CONCAT(s1,s2&#xff0c;...)返回一個或多個待拼接的內容&#xff0c;任意一個為NULL則返回值為NULL。CONCAT_WS(x,s1,s2,...)返回多個字符串拼接之后的字符串&#xff0c;每個字符串之間有一個x。SUBSTRING(s,n,len)、MID(s,n,len)兩個…

“cvSnakeImage”: 找不到標識符

1>g:\project\opencv\helloopencv\helloopencv\helloopencv.cpp(74) : error C2065: “CV_VALUE”: 未聲明的標識符1>g:\project\opencv\helloopencv\helloopencv\helloopencv.cpp(74) : error C3861: “cvSnakeImage”: 找不到標識符 增加頭文件 #include <opencv2/l…

Shell 快速入門

個人博客 &#xff1a;https://www.siyuan.run CSDN&#xff1a;https://blog.csdn.net/siyuan 微信小程序&#xff1a;思遠Y 概述 Shell 是一個用 C 語言編寫的程序&#xff0c;它是用戶使用 Linux 的橋梁。Shell 既是一種命令語言&#xff0c;又是一種程序設計語言。 Shell…

Andriod開發 --插件安裝、環境配置、問題集錦

1.用Eclipse搭建Android開發環境和創建第一個Android項目&#xff08;Windows平臺&#xff09; 鏈接閱讀http://www.cnblogs.com/allenzheng/archive/2012/11/10/2762379.html 搭建環境中的不同之處&#xff1a; &#xff08;1&#xff09;我在安裝過程中&#xff0c;在安裝ADT…

《Java 高并發》01 高并發基本概念

基本概念 同步和異步 同步和異步通常是用來形容一次方法調用。 同步方法調用一旦開始&#xff0c;調用者必須等到方法返回才能繼續執行后續操作。 異步方法調用更像一個消息傳遞&#xff0c;一旦開始&#xff0c;方法調用就會立即返回&#xff0c;調用者就可以繼續后續的操…

Android之Http網絡編程(四)

前面幾篇博文簡單的介紹了一些常見的Http的操作&#xff0c;這些操作幾乎都是在新開的線程中進行的網絡請求&#xff0c;并在日志中打印出獲取到的網絡數據。那么&#xff0c;問題來了&#xff01;&#xff08;呃~感覺下一句是藍翔有木有&#xff1f;&#xff09;如何在把獲取到…

《Java 高并發》02 多線程的特性

多線程的三大特性&#xff1a;原子性、可見性和有序性。 原子性 原子性是指一個操作或者多個操作&#xff0c;一旦開始就不會被其他線程干擾&#xff0c;即使是在多個線程一起執行的情況下也不會被干擾。或者不執行。 原子性主要是為了保證數據一致&#xff0c;線程安全問題…