diff options
author | cathook <b01902109@csie.ntu.edu.tw> | 2014-06-01 13:56:57 +0800 |
---|---|---|
committer | cathook <b01902109@csie.ntu.edu.tw> | 2014-06-01 13:56:57 +0800 |
commit | d5052f1c296dddf51b3e83d59bf3e3c1952cb2d0 (patch) | |
tree | 16f7920c5079e0aefcf9509d2dbab59c464d42bd /README.asciidoc | |
parent | bd58f63900410ec4764031f2e6de2d75e91434b3 (diff) | |
download | meow-d5052f1c296dddf51b3e83d59bf3e3c1952cb2d0.tar meow-d5052f1c296dddf51b3e83d59bf3e3c1952cb2d0.tar.gz meow-d5052f1c296dddf51b3e83d59bf3e3c1952cb2d0.tar.bz2 meow-d5052f1c296dddf51b3e83d59bf3e3c1952cb2d0.tar.lz meow-d5052f1c296dddf51b3e83d59bf3e3c1952cb2d0.tar.xz meow-d5052f1c296dddf51b3e83d59bf3e3c1952cb2d0.tar.zst meow-d5052f1c296dddf51b3e83d59bf3e3c1952cb2d0.zip |
big chnage
Diffstat (limited to 'README.asciidoc')
-rw-r--r-- | README.asciidoc | 1349 |
1 files changed, 671 insertions, 678 deletions
diff --git a/README.asciidoc b/README.asciidoc index af84ff1..09f1af8 100644 --- a/README.asciidoc +++ b/README.asciidoc @@ -10,698 +10,690 @@ * https://github.com/cathook/meow/archive/master.zip[Download] == File Tree -=== *meowpp/* C++ templates - -* *utility.h* some useful functions, - `stringPringf()` , `stringReplace()` , `cstringEndWith()` , - `debugPrintf()` , `messagePrintf()` , `filenameCompare()` -* *Usage.h* `class Usage` -* *colors/* Color splces and transformer -** *RGB.h* `class RGBi` , `class RGBf` -** *YUV.h* `class YUVi` , `class YUVf` , `RGB_to_YUV()` , `YUV_to_RGB()` -** *HSL.h* `class HSLf` , `RGB_to_HSL()` , `HSL_to_RGB()` , - `YUV_to_HSL()` , `HSL_to_YUV()` -** *HSV.h* `class HSVf` , `RGB_to_HSV()` , `HSV_to_RGB()` , - `YUV_to_HSV()` , `HSV_to_YUV()` , - `HSL_to_HSV()` , `HSV_to_HSL()` -* *dsa/* Data Structures and Algorithms -** *BinaryIndexTree.h* `class BinaryIndexTree<Vector, Scalar>` -** *DisjointSet.h* `class DisjointSet` -** *Heaps.h* `class MergeableHeap<Element>` -** *KD_Tree.h* `class KD_Tree<Vector, Scalar>` -** *SegemenTree.h* `class SegmentTree<Value>` -** *SplayTree.h* `class SplayTree<Key, Value>` -** *SplayTree_Range.h* `class SplayTree_Range<Key, Value>` -** *VP_Tree.h* `class VP_Tree<Vector, Scalar>` -* *geo/* -** *Vector2D.h* `Vector2D<Scalar>` -** *Vector3D.h* `Vector3D<Scalar>` -* *math/* -** *utility.h* some useful functions, - `constant PI` , - `noEPS()` , `normalize()` , `denormalize()` , - `ratioMapping()` , `inRange()` , `squ()` , `average()` -** *LinearTransformation.h* `LinearTransformation<Scalar>` -** *LinearTransformations.h* `Rotation3D<Scalar>` -** *Matrix.h* `Matrix<Entry>` -** *Transformation.h* `Transformation<Scalar>` -** *Transformations.h* `BallProjection<Scalar>`, `PhotoProjection<Scalar>` -* *oo/* -** *ObjBase.h* `class ObjBase` -** *ObjSelector.h* `class ObjBase<size_t id>` -** *Properties.h* `class Properties` - -== Structures/Classes/Functions - - -:b: | - - - -=== meow:: *Functios* in utility.h - -[options="header",width="100%",cols="1>s,5<,1<,10<",grid="rows"] -|============================================================== -|Name | Parameters | Return_Type | Description -|stringPrintf |(char const * `fmt`, ...) | std::string -|Format print to C++ string and return it -|stringReplace |(std::string `str`, + -std::string const& -`from`, + -std::string const& `to`) | std::string -|Return a string like `str`, but all `from` be replaced by `to` -|cstringEndWith |(char const* `str`, + -int `n`, ...) | bool -|Return whether `str` is end with one of the c-string you specify in -the parameters or not -|debugPrintf |(char const* `fmt`, ...) | void -|Print debug message (file name, line number, ...etc) when `DEBUG` is -defined -|messagePrintf |(int `level_change`, + -char const* `fmt`, ...) | void -|階層式的訊息輸出 -|filenameCompare |(std::string const& `f1`, std::string const& `f2`)|void -| 依照 `a0.txt < a1.txt < a2.txt < a10.txt` 的字串比較方法比較字串 -|============================================================== -[NOTE] -==================================== -* `stringReplace()` 不是用什麼好方法寫的因此執行效率很低請別虐待它. -==================================== - -''' - - -=== meow:: *Usage* (C++ Class) -==== Description -`Usage` 是用來分析argc, argv和輸出usage document的class. -argc, argv的部份, 有以下規則 - -* `-c` 其中 `c` 可以代換成正常的一個字元的字符, -這種選像要嘛就是 *有設置* , 不然就是 *沒設置* -* `-c <value>` 附加一個value, 這種選項可以是選擇性 ,即要設定與否都可以, -反之則一定要設定. 另外可以給定value的預設值以及哪些value是可接受的 -* `<value>` 其他, 一律視為process arguments - -==== Methods -* `Usage(String const& _name)` + -建構子, 所有說明文字中 *<name>* 都會被代換成 `_name` -* `Usage()` + -建構子, `_name` 自動取為 " *nobody* " -* `import(Usage const& usage)` + -將另一個usage的設定匯入, 回傳成功與否 *(bool)* -* `update(Usage const& usage)` + -將另一個usage分析argc,argv出來的資料拿來用, 回傳成功與否 *(bool)* -* `addOption(unsigned char option, String const& description)` + -新增一個不接額外選項的參數, 並附上說明文字, 回傳成功與否 *(bool)* -* `addOption(unsigned char option, String const& description, -String const& value_type, String const& value_default, bool must)` + -新增一個有額外選項的參數, 並附上說明文字, 額外選項的型別跟預設值. -說明文字中所有的" *<types>* "將會被取代指定的型別, 其中 `must` 代表 -" *是否一定要設定此參數* " , 回傳表成功與否 *(bool)* -* `addOptionValueAccept(unsigned char option, -String const& value, String const& description)` + -針對某個option, 新增一個可接受的額外選項 (如果某個option從頭到尾都 -沒有新增可接受的選項, 則視為不限制), 回傳成功與否 *(bool)* -* `hasOptionSetup(unsigned char option)` + -回傳是否有此選項 *(bool)* -* `getOptionValuesCount(unsigned char option)` + -回傳此參數被設置了幾次 *(size_t)* , 只對有接額外參數的有效 -* `getOptionValue(unsigned char option, size_t index)` + -回傳第`index`個額外選項 *(String)* -* `getProcArgsCount()` + -回傳有多少個Process Arguments *(size_t)* -* `getProcArg(size_t index)` + -取得第`index`個Process Argument *(String)* -* `getProcArgs()` + -回傳一個陣列, 包含所有Process Arguments *(Strings)* -* `addUsageBegin(String const& des)` + -新增一段usage document於每個選項逐條說明之前 -* `addUsageEnd (String const& des)` + -新增一段usage document於每個選項逐條說明之後 -* `String getUsage()` + -回傳usage document *(String)* -* `setArguments(int argc, char** argv, String* errmsg)` + -輸入argv, argc, 回傳是否沒有錯誤發生 *(bool)* , 其中如果有錯誤發生, -且 `errmsg != NULL` 則會將錯誤訊息寫入之 -[NOTE] -================================== -* `String` 是 `std::string` . -* `Strings` 是 `std::vector< std::string> >`. -* 如果沒有寫回傳什麼, 就是回傳 `void` -================================== - -''' - - -=== meow:: *DisjointSet* (C++ class) -==== Description -`DisjointSet` 是個*輕量級Data Dtructure*, 用來維護一堆互斥集的資訊. -相關資料可參考 -link:http://www.csie.ntnu.edu.tw/~u91029/DisjointSets.html[演算法筆記] - -==== Support Methods - -[options="header",width="100%",cols="1>m,3>s,7<,3<,3^,20<",grid="rows"] -|===================================================================== -|Const?|Name | Parameters | Return_Type| Time_Complexity| Description -|const |root |(size_t `number`) | size_t | very fast -|回傳 `number` 所在的 *集合的編號* (0~N-1) -|const |size |() | size_t | very fast -|回傳 *總集合大小* -| |reset|(size_t `N`) | void | O(N) -| 清空, 並且設定總集合大小為 `N` -| |merge|(size_t `number1`, + -size_t `number2`)| size_t | very fast -| 將 `number1` 所在的集合 跟 `number2` 所在的集合 *合併*, -並回傳合併後新的集合的編號 -|===================================================================== -[NOTE] -======================================== -* *very fast* 表示它算的真的超級快, 可以視為常數時間. -* 預設值所有 `number` 所在的集合的編號就是 `number` 本身, -即沒有任兩個數在同一個set裡面 -======================================== - -''' - -=== meow:: *MergeableHeap<Element>* (C++ class) -==== Description -一個用 *左偏樹* 實作的 *Maximum-Heap* , 除了原本heap有的功能外, -還支援 `merge`, `split` 等功能 - -==== Template Class Operators Request -[options="header",width="70%",cols="1>m,1<,3<s,5<,3<,15<",grid="rows"] -|===================================================================== -|Const?|Typename| Operator | Parameters | Return_Type| Description -|const |Element |operator< |(Element `v`)| bool | 大小比較 -|===================================================================== - -==== Support Methods - -* N <- `this` 中擁有的資料數 - -[options="header",width="100%",cols="1>m,2>s,7<,3<,3^,20<",grid="rows"] -|===================================================================== -|Const?|Name | Parameters | Return_Type| Time_Complexity| Description -||moveTo|(MergeableHeap* `h`)|void|O(M) -|將 `this` 的資料複寫到 `h` 上面, 同時清空自己, -時間複雜度中的M是 `h` 所擁有的資料數 -|const|top|()|Element const&|O(1) -|回傳最大的那個 `Element` -|const|size|()|size_t|O(1) -|回傳 `this` 中擁有的資料數 -|const|empty|()|bool|O(1) -|回傳 `this` 是否為空 -||push|(Element const& `e`)|void|O(logN) -|將 `e` 加入 -||pop|()|void|O(logN) -|將最大的 `Element` 移除 -||clear|()|void|O(N) -|將資料清空 -||merge|(MergeableHeap* `heap2`)|void|O(logN+logM) -|將 `heap2` 的資料統統加到 `this` 中, 並且清空 `heap2` -時間複雜度中的M是 `heap2` 的資料數 -|===================================================================== - -[WARNING] -============================================== -* 假設現在有兩個MergeableHeap `A` 和 `B`, 則: -** 執行 `A.merge(&B)` 後 `B` 會變成空的 -** 執行 `B.moveTo(&A)` 後 `B` 會變成空的, `A` 原本擁有的資料也會覆蓋掉 -============================================== - -''' - - -=== meow:: *VP_Tree<Vector, Scalar>* (C++ class) -==== Description -`VP_Tree` 用來維護由 *N個K維度向量所成的集合*, -並可於該set中查找 *前i個離給定向量最接近的向量*. + -不像 `KD_Tree` 二分樹每次都選擇一個維度去分, 分成小的跟大的, -`VP_Tree` 每次選一個點, 將資料分成 離這個點近的, 跟離這個點遠的. -至於怎麼選呢...., 嘛還沒研究, 先random - -.參考資料連結: -* http://stevehanov.ca/blog/index.php?id=130[link] -* http://pnylab.com/pny/papers/vptree/vptree[link] - -==== Template Class Operators Request -[options="header",width="70%",cols="1>m,1<,3<s,5<,3<,15<",grid="rows"] -|===================================================================== -|Const?|Typename| Operator | Parameters | Return_Type| Description -|const | Vector|operator[] |(size_t `n`) | Scalar | 取得第 `n` 維度量 -|const | Vector|operator= |(Vector `v`) | Vector& | copy operator -|const | Vector|operator< |(Vector `v`) | bool | 權重比較 -|const | Scalar| 'Scalar' |(int `n`) | Scalar | 建構子, -其中一定`n=0 or 4` -|const | Scalar|operator* |(Scalar `s`) | Scalar | 相乘 -|const | Scalar|operator+ |(Scalar `s`) | Scalar | 相加 -|const | Scalar|operator- |(Scalar `s`) | Scalar | 相差 -|const | Scalar|operator- |( ) | Scalar | 取負號 -|const | Scalar|operator< |(Scalar `s`) | bool | 大小比較 -|===================================================================== - -==== Custom Type Definitions -* `Vectors` <- `std::vector<Vector>` - -==== Support Methods - -* N <- `this` 中擁有的資料數 -* D <- `this` 資料維度 - -[options="header",width="100%",cols="1>m,3>s,7<,3<,3^,20<",grid="rows"] -|===================================================================== -|Const?|Name | Parameters | Return_Type| Time_Complexity| Description -||insert|(Vector const& `v`)|void| O(1) -|將向量 `v` 加到set中 -||erase|(Vector const& `v`)|bool| O(N) -|將向量 `v` 從set中移除, '~TODO:可以再優化~' -||build|()|void|O(KN logN) or O(1) -|檢查距上一次 `build()` 至今是否有 `insert/erase` 被呼叫, -若有, 重新建樹, 否則不做事 -||forceBuild|()|void|O(KN logN) -|重新建樹 -|const|query|(Vector const& `v`, + -size_t `i`, + -bool `cmp`)|Vectors -|O(logN) ~Expected~ -|於set中找尋距離 `v` 前 `i` 近的向量, 並依照由近而遠的順序排序. -如果有兩個向量 `v1`,`v2` 距離一樣, 且 `cmp` 為 `true` , 則直接依照 -`v1 < v2` 來決定誰在前面. 最後回傳一陣列包含所有解. -||clear|()|void|O(1) -|清空所有資料 -||reset|(size_t `dimension`)|size_t|O(1) -|清空所有資料並且指定維度為 `max(1, dimension)` 並且回傳指定後的維度 -|===================================================================== +=== LaTex/ -[NOTE] -======================================== -* 實測結果發覺, 維度小的時候, 比起中規中矩的 `KD_Tree`, `VP_Tree` 有 -'randomp' 於其中, 因此時間複雜度只是期望值 'O(logN)' 但是測資大到 -一定程度, `KD_Tree` 效率會一整個大幅掉下, 但 `VP_Tree` 幾乎不受影響 -* 'TODO' `insert()`, `erase()` 算是未完成功能 - -======================================== - -''' - -=== meow:: *KD_Tree<Vector, Scalar>* (C++ class) -==== Description -`KD_Tree` 全名k-dimension tree, 用來維護由 *N個K維度向量所成的集合*, -並可於該set中查找 *前i個離給定向量最接近的向量* - -==== Template Class Operators Request -[options="header",width="70%",cols="1>m,1<,3<s,5<,3<,15<",grid="rows"] -|===================================================================== -|Const?|Typename| Operator | Parameters | Return_Type| Description -|const | Vector|operator[] |(size_t `n`) | Scalar | 取得第 `n` 維度量 -|const | Vector|operator< |(Vector `v`) | bool | 權重比較 -|const | Scalar|operator* |(Scalar `s`) | Scalar | 相乘 -|const | Scalar|operator+ |(Scalar `s`) | Scalar | 相加 -|const | Scalar|operator- |(Scalar `s`) | Scalar | 相差 -|const | Scalar|operator< |(Scalar `s`) | bool | 大小比較 -|===================================================================== - -==== Custom Type Definitions -* `Vectors` <- `std::vector<Vector>` - -==== Support Methods - -* N <- `this` 中擁有的資料數 -* K <- `this` 資料維度 - -[options="header",width="100%",cols="1>m,3>s,7<,3<,3^,20<",grid="rows"] -|===================================================================== -|Const?|Name | Parameters | Return_Type| Time_Complexity| Description -||insert|(Vector const& `v`)|void| O(1) -|將向量 `v` 加到set中 -||erase|(Vector const& `v`)|bool| O(N) -|將向量 `v` 從set中移除, '~TODO:可以再優化~' -||build|()|void|O(KN logN) or O(1) -|檢查距上一次 `build()` 至今是否有 `insert/erase` 被呼叫, -若有, 重新建樹, 否則不做事 -||forceBuild|()|void|O(KN logN) -|重新建樹 -|const|query|(Vector const& `v`, + -size_t `i`, + -bool `cmp`)|Vectors -|O(KN ^1-1/K^ ) -|於set中找尋距離 `v` 前 `i` 近的向量, 並依照由近而遠的順序排序. -如果有兩個向量 `v1`,`v2` 距離一樣, 且 `cmp` 為 `true` , 則直接依照 -`v1 < v2` 來決定誰在前面. 最後回傳一陣列包含所有解. -||clear|()|void|O(1) -|清空所有資料 -||reset|(size_t `dimension`)|void|O(1) -|清空所有資料並且指定維度為 `dimension` -|===================================================================== -[NOTE] -======================================== -* 此資料結構只有在 N >> 2 ^K^ 時才比較有優勢, -當 K 逐漸變大時, 所花時間會跟暴搜沒兩樣 -======================================== - -''' - -=== meow:: *SplayTree<Key, Value>* (C++ class) -==== Description -`SplayTree` 是一種神乎其技的資料結構, 維護一堆 Key->Value . 並且支援 -一些 `std::map` 難以快速實踐的操作, 如 `split` , `merge` , `keyOffset` - -==== Template Class Operators Request -[options="header",width="70%",cols="1>m,1<,3<s,5<,3<,15<",grid="rows"] -|===================================================================== -|Const?|Typename| Operator| Parameters | Return_Type| Description -|const |Key |operator+|(Key `k`) | Key | 相加 -|const |Key |operator<|(Key `k`) | bool | 大小比較 -| |Key |'Key' |(int `n`) | | 建構子, `n` 永遠是0 -| |Value | 'Value' |( ) | | 建構子 -|===================================================================== - -==== Custom Type Definitions - -* `Element` -> 用來當作回傳資料的媒介 -** 重定義 `operator->()` 到 `std::pair<Key const&, Value&>*` -** 重定義 `operator*()` 到 `std::pair<Key const&, Value&>&` -** 有 `operator==` , `operator!=`, `operator=` 可用 -** 可以直接用 `(*e).second = some_value` 來改變SplayTree中的資料 - -==== Support Methods - -* N <- `this` 中擁有的資料數 -* M <- `tree2` 中擁有的資料數 - -[options="header",width="100%",cols="1>m,3>s,7<,3<,3^,20<",grid="rows"] -|===================================================================== -|Const?|Name | Parameters | Return_Type| Time_Complexity| Description -||moveTo|(SplayTree* `tree2`)|void|O(M) -|將 `this` 的資料複寫到 `tree2` 上面, 同時清空自己, -時間複雜度中的M是 `tree2` 所擁有的資料數 -|const|lowerBound|(Key const& `k`)|Element|O(logN) -|找出第一個(最小的) Element且 `k` <= 它的 Key, 並且回傳之. -找不到的話回傳 `this->end()` -|const|lowerBound|(Key const& `k`)|Element|O(logN) -|找出第一個(最小的) Element且 `k` < 它的 Key, 並且回傳之. -找不到的話回傳 `this->end()` -|const|lowerBound|(Key const& `k`)|Element|O(logN) -|找出第一個(最小的) Element且 `k` >= 它的 Key, 並且回傳之. -找不到的話回傳 `this->end()` -|const|lowerBound|(Key const& `k`)|Element|O(logN) -|找出第一個(最小的) Element且 `k` > 它的 Key, 並且回傳之. -找不到的話回傳 `this->end()` -|const|find|(Key const& `k`)|Element|O(logN) -|找出 Key= `k` 的Elemenet 並回傳. 找不到的話回傳 `this->end()` -|const|order|(size_t `ord`)|Element|O(logN) -|將Elements依照Key由小到大排序, 回傳第 `ord` 個Element (由0算起). -其中如果 `ord` > N - 1, 則會回傳 `this->last()` -|const|first|(size_t `ord`)|Element|O(logN) -|回傳Key最小的Element, 如果SplayTree為空, 則回傳 `this->end()` -|const|last|(size_t `ord`)|Element|O(logN) -|回傳Key最大的Element, 如果SplayTree為空, 則回傳 `this->end()` -|const|end|()|Element|O(1) -|回傳一個指向NULL的Element, 以供 `find` , `order` , `first` -, `last` 等判斷是否有找到相對應的Element -|const|size|()|size_t|O(1)| 回傳資料數 -|const|size|()|bool|O(1)| 回傳是否為空 -||clear|()|void|O(N)| 清空資料 -||insert|(Key const& `key`, + -Value const& `value`)|bool|O(logN) -|檢查是否已有Element的Key 為 `key`, 若有則回傳 `false` , 否則將 -一個 (Key -> Value) = (`key` -> `value`)的Element加入, 並回傳 `true` -將所有Element的Key同加上 `delta` -||erase|(Key const& `key`)|bool|O(logN) -|檢查是否已有Element的Key 為 `key`, 若有則刪除之, 並回傳 `true`, -否則則回傳 `false` -||keyOffset|(Key const& `delta`)|void|O(1) -|將所有Element的Key同加上 `delta` -||operator[]|(Key const& `key`)|Value&|O(logN) -|檢查是否已有Element的Key 為 `key`, 若有則回傳相對應的Value的Reference -否則先執行 `insert(key, Value())` 再回傳相對應的Reference -||splitOut|(Key const& `upper_bound`, + -SplayTree* `tree2`)|void -|O(logN) + O(M) -|將 `tree2` 清空, 再將所有Key > `upper_bound` 的Element都丟到 `tree2` -||mergeAfter|(SplayTree* `tree2`)|void|O(logN) + O(logM) -|檢查是否 `this` 中的 Key 都小於 `tree2` 中的Key, 是的話把 `tree2` -中的 Element 都搬到 `this` , 同時清空 `tree2` , 回傳 `true`. 否則 -回傳 `false` -||merge|(SplayTree* `tree2`)|void|O(logN) + O(logM) -|檢查是否 `this` 中的 Key 都小於 `tree2` 中的Key 或者 -是否 `this` 中的 Key 都大於 `tree2` 中的Key, 是的話把 `tree2` -中的 Element 都搬到 `this` , 同時清空 `tree2` , 回傳 `true`. 否則 -回傳 `false` -|===================================================================== +LaTex 相關模板 + +===== Makefile + +環境變數: + +* `SOURCE = source.tex` 設定 'LaTex' 源碼檔名 +* `TARGET = output` 設定生出來的 *pdf* 檔名 [NOTE] -======================================== -* 假設現在有兩個SplayTree `A` 和 `B`, 則: -** 執行 `B.moveTo(&A)` 後 `B` 會變成空的, `A` 原本擁有的資料也會覆蓋掉 -** 執行 `A.merge(&B)` 或 `A.mergeAfter(&B)` 後 -如果檢查發現確實可以merge, 則之後 `B` 會變成空的 -======================================== - -''' - - -=== meow:: *SegmentTree<Value>* (C++ class) -==== Description -維護一個陣列, 並且讓user可以有區間查詢, 區間修改的小東東 - -==== Template Class Operators Request -[options="header",width="70%",cols="1>m,1<,3<s,5<,3<,15<",grid="rows"] -|===================================================================== -|Const?|Typename| Operator | Parameters |Return_Type| Description -|const |Value |operator+ |(Value `v`)|Value | 相加(位移) -|const |Value |operator* |(size_t `n`)|Value | 每個Value都一樣, -長為 `n` 的區間的值 -|const |Value |operator{b}|(Value `v`)|Value | 區間合併後的值 -|===================================================================== - -* 若要維護區間最小值, 即每次都是詢問範圍 `[a, b]` 的最小值, 則可以定義 -** `operator+` 為 '回傳相加值' -** `operator*` 為 '回傳*this' -** `operator|` 為 '回傳std::min(*this, v)' -* 若要維護區間最總和, 即每次都是詢問範圍 `[a, b]` 的總和, 則可以定義 -** `operator+` 為 '回傳相加值' -** `operator*` 為 '回傳(*this) * n' -** `operator|` 為 '回傳相加值' - -==== Support Methods - -* N <- `this` 所維護的陣列長度 - -[options="header",width="100%",cols="1>m,2>s,7<,3<,3^,20<",grid="rows"] -|===================================================================== -|Const?|Name | Parameters | Return_Type| Time_Complexity| Description -||reset|(size_t `size`)|void|O(1) -|將資料清空且設定維護範圍是 `0~size - 1` 其中時間複雜度確切多少未知 -要看 `std::vector::resize()` 的效率 -|const|query|(ssize_t `first`, + -ssize_t `last`)|Value|O(logN) -|回傳區間 `[first,last]` (邊界都含) 的區間值 -||override|(ssize_t `first`, + -ssize_t `last`, + -Value const& `value`) -|void|O(logN) -|將區間 `[first,last]` 全部都設定成 `value` -||offset|(ssize_t `first`, + -ssize_t `last`, + -Value const& `delta`) -|void|O(logN) -|將區間 `[first,last]` 全部都加上 `delta` -|===================================================================== - -''' - - -=== meow:: *SplayTree_Range<Key, Value>* (C++ class) -==== Description -`SplayTree_Range` 是一種神乎其技的資料結構, 維護一堆 Key->Value. 並且支援 -一些 `std::map` 難以快速實踐的操作, 如 `split` , `merge` , `keyOffset` - -==== Template Class Operators Request -[options="header",width="70%",cols="1>m,1<,3<s,5<,3<,15<",grid="rows"] -|===================================================================== -|Const?|Typename| Operator| Parameters | Return_Type| Description -|const |Key |operator+|(Key `k`) | Key | 相加 -|const |Key |operator<|(Key `k`) | bool | 大小比較 -| |Key |'Key' |(int `n`) | | 建構子, `n` 永遠是0 -| |Value | 'Value' |( ) | | 建構子 -|===================================================================== - -==== Custom Type Definitions - -* `Element` -> 用來當作回傳資料的媒介 -** 重定義 `operator->()` 到 `std::pair<Key const&, Value&>*` -** 重定義 `operator*()` 到 `std::pair<Key const&, Value&>&` -** 有 `operator==` , `operator!=`, `operator=` 可用 -** 可以直接用 `(*e).second = some_value` 來改變SplayTree_Range中的資料 - -==== Support Methods - -* N <- `this` 中擁有的資料數 -* M <- `tree2` 中擁有的資料數 - -[options="header",width="100%",cols="1>m,3>s,7<,3<,3^,20<",grid="rows"] -|===================================================================== -|Const?|Name | Parameters | Return_Type| Time_Complexity| Description -||moveTo|(SplayTree_Range* `tree2`)|void|O(M) -|將 `this` 的資料複寫到 `tree2` 上面, 同時清空自己, -時間複雜度中的M是 `tree2` 所擁有的資料數 -|const|lowerBound|(Key const& `k`)|Element|O(logN) -|找出第一個(最小的) Element且 `k` <= 它的 Key, 並且回傳之. -找不到的話回傳 `this->end()` -|const|lowerBound|(Key const& `k`)|Element|O(logN) -|找出第一個(最小的) Element且 `k` < 它的 Key, 並且回傳之. -找不到的話回傳 `this->end()` -|const|lowerBound|(Key const& `k`)|Element|O(logN) -|找出第一個(最小的) Element且 `k` >= 它的 Key, 並且回傳之. -找不到的話回傳 `this->end()` -|const|lowerBound|(Key const& `k`)|Element|O(logN) -|找出第一個(最小的) Element且 `k` > 它的 Key, 並且回傳之. -找不到的話回傳 `this->end()` -|const|find|(Key const& `k`)|Element|O(logN) -|找出 Key= `k` 的Elemenet 並回傳. 找不到的話回傳 `this->end()` -|const|query|()|Value|O(1) -|回傳整棵樹的區間Value -|const|query|(Key const& `first` , + -Key const& `last`)|Value|O(logN) -|找出key介於 `first` + -~ `last` 的區間Value -|const|order|(size_t `ord`)|Element|O(logN) -|將Elements依照Key由小到大排序, 回傳第 `ord` 個Element (由0算起). -其中如果 `ord` > N - 1, 則會回傳 `this->last()` -|const|first|(size_t `ord`)|Element|O(logN) -|回傳Key最小的Element, 如果SplayTree_Range為空, 則回傳 `this->end()` -|const|last|(size_t `ord`)|Element|O(logN) -|回傳Key最大的Element, 如果SplayTree_Range為空, 則回傳 `this->end()` -|const|end|()|Element|O(1) -|回傳一個指向NULL的Element, 以供 `find` , `order` , `first` -, `last` 等判斷是否有找到相對應的Element -|const|size|()|size_t|O(1)| 回傳資料數 -|const|size|()|bool|O(1)| 回傳是否為空 -||clear|()|void|O(N)| 清空資料 -||insert|(Key const& `key`, + -Value const& `value`)|bool|O(logN) -|檢查是否已有Element的Key 為 `key`, 若有則回傳 `false` , 否則將 -一個 (Key -> Value) = (`key` -> `value`)的Element加入, 並回傳 `true` -將所有Element的Key同加上 `delta` -||erase|(Key const& `key`)|bool|O(logN) -|檢查是否已有Element的Key 為 `key`, 若有則刪除之, 並回傳 `true`, -否則則回傳 `false` -||keyOffset|(Key const& `delta`)|void|O(1) -|將所有Element的Key同加上 `delta` -||valueOffset|(Value const& `delta`)|void|O(1) -|將所有Element的value同加上 `delta` -||valueOverride|(Value const& `vaule`)|void|O(1) -|將所有Element的value同變成 `value` -||operator[]|(Key const& `key`)|Value&|O(logN) -|檢查是否已有Element的Key 為 `key`, 若有則回傳相對應的Value的Reference -否則先執行 `insert(key, Value())` 再回傳相對應的Reference -||splitOut|(Key const& `upper_bound`, + -SplayTree_Range* `tree2`)|void -|O(logN) + O(M) -|將 `tree2` 清空, 再將所有Key > `upper_bound` 的Element都丟到 `tree2` -||mergeAfter|(SplayTree_Range* `tree2`)|void|O(logN) + O(logM) -|檢查是否 `this` 中的 Key 都小於 `tree2` 中的Key, 是的話把 `tree2` -中的 Element 都搬到 `this` , 同時清空 `tree2` , 回傳 `true`. 否則 -回傳 `false` -||merge|(SplayTree_Range* `tree2`)|void|O(logN) + O(logM) -|檢查是否 `this` 中的 Key 都小於 `tree2` 中的Key 或者 -是否 `this` 中的 Key 都大於 `tree2` 中的Key, 是的話把 `tree2` -中的 Element 都搬到 `this` , 同時清空 `tree2` , 回傳 `true`. 否則 -回傳 `false` -|===================================================================== +`TARGET` 不需要給副檔名 + +targets: + +* `all` 生成 *'<TARGET>'.pdf* +* `view` 用kde-open 把輸出結果開起來(如有需要會先重新編譯) +* `clean` 清除 +* `two` 編譯兩次, 如果有目錄的話可能會需要用到 + +===== source.tex + +內容為一些我自己定義的設定, 參數設置等等. 另外還有用寫在註解裡面的小筆記 + + + +=== asciidoc/ + +一些關於asciidoc的example與編譯設定 + +===== Makefile + +編譯asciidoc用的, 裡面有兩個環境變數: + +- ASCIIDOC_SOURCE: 指定原始碼, 預設為 'example.txt' +- ASCIIDOC_OUTPUT: 輸出的檔名, 預設為 'output.html' + +另外還有一個target: + +[source,makefile] +--------------- +$(ASCIIDOC_OUTPUT): $(ASCIIDOC_SOURCE) +--------------- + + + +=== cppMakefile/ + + + +.Description + +這是一個簡單的 *GNU makefile for 'C++' project* +類似AutoTool等工具, 不過又更簡化了, 操作方法是利用GNUMakefile裡的targets +當作指令, 生出一個targets檔, 以後鍵入 `make all` 就會自動把所有targets都 +編譯出來. + +.Commands + +* `make init` + +初始化, 設定完之後所在位置會多幾個資料夾如下 + +** 'bin/' 放編譯出來的執行檔 +** 'dep/' dependency相關資料, 內容會自動生成, 不用理它 +** 'inc/' 自定義的include file放置位置 +** 'src/' source code放置位置 +** 'obj/' obj file放置位置, 會自動生成, 不用理它 + +* `make new NAME=<name> [OBJS=<OBJ_FILES> LIBS=<LIBRARIES>]` + +新增一個target, 須給定目標名 , 並且此Makefile會假定 `main() { ... }` 放在 +'src/<name>.cpp' 而最終輸出會是 'bin/<name>' . + +關於 'OBJS=' 與 'LIBS=' 參考下面說明 + +* `make add NAME=<name> [OBJS=<OBJ_FILES> LIBS=<LIBRARIES>]` + +針對target為 '<name>' 的目標新增需要的 '<OBJ_FILES>' , 與 '<LIBRARIES>'. +'<LIBRARIES>' 的部份會用 `pkg-config` 去解讀, 例如 '<LIBRARIES>' 為 +'opencv lapackpp' 則link時會被以下指令展開 + +`pkg-config --libs opencv lapackpp` + +而 '<OBJ_FILES>' 的部份則只需要給 *name* 就好, 不需要有完整個 pathname, 例如 +例如 '<OBJ_FILES>' 是 'a b c' 則此makefile會視為 + +** source code: 'src/a.cpp src/b.cpp src/c.cpp' +** obj file: 'obj/a.o obj/b.o obj/c.o' + +* `make del NAME=<name> [OBJS=<OBJ_FILES> LIBS=<LIBRARIES>]` + +與 add相反, 嘗試將指定target所需的'<OBJ_FILES>'和'<LIBRARIES>'移除 + +* `make clean` + +將 'bin/*' 'dep/*' 'obj/*' 清除, 有時候覺得dependency怪怪的 +時可以嘗試執行此指令 [NOTE] -======================================== -* 假設現在有兩個SplayTree_Range `A` 和 `B`, 則: -** 執行 `B.moveTo(&A)` 後 `B` 會變成空的, `A` 原本擁有的資料也會覆蓋掉 -** 執行 `A.merge(&B)` 或 `A.mergeAfter(&B)` 後 -如果檢查發現確實可以merge, 則之後 `B` 會變成空的 -======================================== - -''' - - -=== meow:: *BinaryIndexTree<Value>* (C++ class) -==== Description -極度簡化版的 `SegmentTree` 已無法區間操作, 區間詢問的區間開頭也一定要 -在 `index=0` 的地方 - -==== Template Class Operators Request -[options="header",width="70%",cols="1>m,1<,3<s,5<,3<,15<",grid="rows"] -|===================================================================== -|Const?|Typename| Operator | Parameters | Return_Type| Description -|const | Value | operator+ |(Value `n`) | Value | 合併用(類似 -`SegmentTree` 的 -operator{b} ) -|===================================================================== - -==== Support Methods - -* N <- `this` 中擁有的資料數 - -[options="header",width="100%",cols="1>m,3>s,7<,3<,3^,20<",grid="rows"] -|===================================================================== -|Const?|Name | Parameters | Return_Type| Time_Complexity| Description -||reset|(size_t `size`, Value const& `value`)|void|O(`size`) -|將資料長度刷成 `N = size` 且每一個元素都是 `value` -||update|(size_t `index`, Value const& `value`)|void|O(logN) -|將第 `index` (從零開始算) 多加上 `value` -|const|query|(size_t `index`)|void|O(logN) -|詢問 `0~index` 的區間值 -|===================================================================== +其中整個project到底有哪些obj file會完全依照 *src/* 裡面有哪些 `.cpp` 檔決定 + +===== GNUMakefile + +就是一個 Makefile, 不過裡面有些東西是 `GNU-make` only的 + +===== GNUMakefile.dependency.bash + +產生 dependency檔用的 + + + +=== doxygen/ + + +doxygen 相關設定 + +===== Makefile + +編譯doxygen document的Makefile, 裡面只有一個target: 'document', +另外有兩個環境變數: + +- DOXYGEN_RUN_PATH: 指定doxygen執行的pwd, 預設為 `pwd` +- DOXYGEN_CONFIG: 指定config檔放在哪裡, 預設為 `pwd` + +===== config + +設置, 以下幾點個人覺得比較重要的 + +[source,conf] +------------------------- + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- +DOXYFILE_ENCODING = UTF-8 +PROJECT_NAME = "Templates -- Meow" +PROJECT_NUMBER = 1.1.2 +PROJECT_BRIEF = 不能, 也不應該先編譯成obj-file的templates +PROJECT_LOGO = $(config_path)/logo.png +OUTPUT_DIRECTORY = doc +CREATE_SUBDIRS = NO +OUTPUT_LANGUAGE = English +TAB_SIZE = 2 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- +EXTRACT_ALL = YES +EXTRACT_STATIC = YES +EXTRACT_LOCAL_CLASSES = NO +EXTRACT_LOCAL_CLASSES = YES +FORCE_LOCAL_INCLUDES = YES + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- +INPUT = meowpp +INPUT_ENCODING = UTF-8 +FILE_PATTERNS = +RECURSIVE = YES + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- +GENERATE_HTML = YES +HTML_OUTPUT = html +HTML_FILE_EXTENSION = .html +HTML_HEADER = $(config_path)/header.html +HTML_FOOTER = $(config_path)/footer.html +HTML_STYLESHEET = $(config_path)/stylesheet.css +HTML_EXTRA_STYLESHEET = $(config_path)/custom.css +HTML_EXTRA_FILES = +HTML_COLORSTYLE_HUE = 120 +HTML_COLORSTYLE_SAT = 36 +HTML_COLORSTYLE_GAMMA = 166 +DISABLE_INDEX = YES +GENERATE_TREEVIEW = YES +FORMULA_FONTSIZE = 11 +SEARCHENGINE = NO + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- +GENERATE_LATEX = YES +LATEX_CMD_NAME = xelatex +PAPER_TYPE = letter +HIDE_UNDOC_RELATIONS = NO +UML_LOOK = YES +EXTRA_PACKAGES = +LATEX_HEADER = $(config_path)/header.tex +LATEX_FOOTER = $(config_path)/footer.tex + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- +CALL_GRAPH = YES +CALLER_GRAPH = YES +------------------------- [NOTE] -======================================== -* 一般來說只能用在維護區間總和, 維護區間最大值只有在特殊情況才可以, 即 -'針對每個元素, 每次 update() 的值一定會大於等於原本的值' -* 若要用區間最大值 , 則 `Value` 的 `operator+` 要寫成 `std::max(...)` -======================================== - -''' - -=== meow:: *Functios* in math/utility.h - -[options="header",width="100%",cols="1>s,5<,1<,10<",grid="rows"] -|============================================================== -|Name | Parameters | Return_Type | Description -|noEPS<T> |(T `value`, T `eps` = 1e-9) | T | -如果abs(輸入的數值) < eps, 則回傳0, 否則回傳輸入的數值 -|normalize<T> |(T `lower`, T `upper`, + - T value) -| T | `(value - lower) / (upper - lower)` -|denormalize<T> |(T `lower`, T `upper`, - + - T `ratio`) | T | `lower + (upper - lower) * ratio` -|ratioMapping<T>|(T `l1`, T `u1`, - + -T `m1`, T `l2`, + -T `u2`) -| T | `denormalize(l2, u2, normalize(l1, u1, m1))` -|inRange<T> |(T const& `mn`, T const& `mx`, + - T const& `v`) | T | -`std::max(mn, std::min(mx, v))` -|squ<T> |(T const& `x`) | T| `x * x` -|cub<T> |(T const& `x`) | T| `x * x * x` -|average<T>|(T const& `beg`, T const& `end`, + - double `sigs`)| T| -只將 `sigs` 個標準差以內的數據拿來取平均 -|average<T>|(T const& `beg`, T const& `end`, - + - T const& `p`, double `sigs`)| T| 同上, 不過這次用 `p` 來加權平均 -|============================================================== +'config' 中 `$(config_path)` 是一個環境變數, 代表這個configure file所在位置 +*呼叫asciidoc時必須有設置這個環境變數* + + +===== header.html + +*HTML* output 的開頭 +沒有更動 + +===== footer.html + +*HTML* output 的結尾 +沒有更動 + +===== logo.png + +就是logo + + +===== stylesheet.css + +*HTML* output 的css樣式, 我把他改成暗色系了 + +以下是更動的地方: +[source,css] +---------------------------------------------- +body, table, div, p, dl { + font: 400 14px/19px Roboto,sans-serif,monospace; +} + +.title { + line-height: 100%; + font-size: 200%; + margin : 0px; + padding: 0px; + border : 0px; +} + +dt { + color: #999999; + font-style:italic; +} + +div.qindex, div.navtab{ + background-color: #2B3F26; +} + +a { + color: #5D77AC; +} + +.contents a:visited { + color: #7695D2; +} + +a.code, a.code:visited { + color: #7695D2; +} + +a.codeRef, a.codeRef:visited { + color: #7695D2; +} + +pre.fragment { + background-color: #0B0C0D; + border-radius: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; +} + +div.fragment { + background-color: #0B0C0D; + border-radius: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; +} + +div.line { + font-family: 'courier new', monospace, fixed; + color: #CCCCCC; + font-size: 14px; + min-height: 14px; +} + +span.lineno { + background-color: #181818; +} +span.lineno a { + background-color: #3B3838; +} + +span.lineno a:hover { + background-color: #6B6868; +} + +body { + background-color: #212131; + color: #DDFFDD; +} + +span.keyword { + color: #00A000 +} + +span.keywordtype { + color: #907050 +} + +span.comment { + color: #808080 +} + +table.memberdecls { + border-top-color: #111111; +} + +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #192322; +} + +.mdescLeft, .mdescRight { + color: #CCCCCC; +} + +.memTemplParams { + color: #7695D2; +} + +.memtemplate { + color: #7695D2; +} + +.memproto, dl.reflist dt { + color: #758575; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.95); + /* background-image:url('nav_f.png'); */ + background-color: #181C28; +} + +.memdoc, dl.reflist dd { + /* background-image:url('nav_g.png'); */ + background-color: #131923; +} + +.params .paramdir { + color:#A0AA00; +} + +.directory tr.even { + background-color: #272838; +} + +.directory .levels span { + color: #5D77AC; +} + +div.header +{ + /* background-image:url('nav_h.png'); */ + /* background-repeat:repeat-x; */ + background-color: #290A1C; + padding: 0px; + margin : 0px; + border : 0px; + margin-top: 10px; + border-bottom: 1px solid #AA0000;/*#C4CFE5;*/ +} + +div.headertitle +{ + padding: 5px; + margin : 0px; + border : 0px; +} + +#projectname +{ + font: 400% Tahoma, Arial,sans-serif,monospace; +} + +div.toc h3 { + color: #7695D2; +} + +---------------------------------------------- + +===== custom.css + +*HTML* output 的css樣式, 在這邊設定的話連 'navtree' 等都可以設定. + +另外這個檔案的檔名不能是 `navtree.css` , 不知道是不是bug. + +===== header.tex + +*LaTex* output 的開頭 + +===== header.tex + +*LaTex* output 的結尾 + +===== stylesheet.sty + +*LaTex* 的樣式設定 + + +=== meowpp/ + +meow for *C++ templates* + + +===== Self.h + +包含一個具有 *Copy On Write* 技術的 'class' 而且有實作 *by reference* , +基本上就是改良C\+\+原本的 reference 機制, 原本的 reference 只能在宣告的時候 +指定參照指向的變數, +而這邊則可以動態改變 + + +===== Usage.h + +方便user製作還算精美的 *usage document* 並且利用 `getopt()` 實作讀入參數與分析 + +===== utility.h + +一些不知道要歸類到哪的小functions + + +==== colors/ + + +一些 *color space* 以及這些space的 *transformate function* 都放在這資料夾下 [NOTE] -==================================== -* 額外附贈一個 `const double PI = 3.141592653589......` -==================================== +目前transformation function的準確率還很低, 有待以後加強 + +===== Color3_Space.h + +`class Color3_Space<T>` *Channel Number = 3* 的 Color Space 的共通 *Base class* + +===== RGB_Space.h + +Channel分別是 + +* Red +* Green +* Blue + +.Classes +* `meow::RGBi_Space` 用 'int' 存資料, 每個channel數值合法範圍是 *0~255* +* `meow::RGBf_Space` 用 'double' 存資料, 每個channel數值合法範圍是 *0.0~1.0* + +.Functions +* `meow::colorTransformation(in, *out)` for +** RGBi_Space <--> RGBf_Space + +===== YUV_Space.h + +Channel分別是 + +* Y 明度 +* U 色度 +* V 濃度 + +.Classes +* `meow::YUVf_Space` 用 'double' 存資料, 每個channel數值合法範圍是 *0~1.0* + +.Functions +* `meow::colorTransformation(in, *out)` for +** YUVf_Space <--> RGBi_Space +** YUVf_Space <--> RGBf_Space + +===== HSL_Space.h + +Channel分別是 + +* H 色調 +* S 飽和度 +* L 亮度 + +.Classes +* `meow::HSLf_Space` 用 'double' 存資料, 每個channel數值合法範圍是 *0~1.0* + +.Functions +* `meow::colorTransformation(in, *out)` for +** HSLf_Space <--> RGBi_Space +** HSLf_Space <--> RGBf_Space +** HSLf_Space <--> YUVf_Space + +===== HSV_Space.h + +Channel分別是 + +* H 色調 +* S 飽和度 +* V 亮度 + +.Classes +* `meow::HSVf_Space` 用 'double' 存資料, 每個channel數值合法範圍是 *0~1.0* + +.Functions +* `meow::colorTransformation(in, *out)` for +** HSVf_Space <--> RGBi_Space +** HSVf_Space <--> RGBf_Space +** HSVf_Space <--> YUVf_Space +** HSVf_Space <--> HSLf_Space + + +==== dsa/ + + +包含一些資料結構 + +===== BinaryIndexTree.h + +極度簡化的 *SegmentTree* 已無區間更新的操作. + +.Classes +* `meow::BinaryIndexTree<Value>` + +===== DisjointSet.h + +用來維護一堆互斥集的資訊. + +.Classes +* `meow::DisjointSet` + +===== HashTable.h + +就是傳說中的HashTable + +.Classes +* `meow::HashTableList<Data, HashFunc>` + +===== KD_Tree.h + +查詢第k近鄰居用的 + +.Classes +* `meow::KD_Tree<Vector>` + +===== MergeableHeap.h + +可合併Heap + +.Classes +* `meow::MergeableHeap<Element>` + +===== SegmentTree.h + +線段樹 +.Classes +* `meow::SegmentTree<Value>` + +===== SplayTree.h + +伸展樹, 比一般平衡樹稍強的東東 +* `meow::SplayTree<Key, Value>` +* `meow::SplayTree_Range<Key, Value>` + +===== VP_Tree.h + +查詢第k近鄰居用的 + +.Classes +* `meow::VP_Tree<Vector>` + +==== geo/ + +計算幾何相關, 算是從math中特化出來的 + +===== Vectors.h + +實作上不是用陣列, 是直接宣告2到3個變數分別存x, y (,z) + +.Classes +* `meow::Vector2D<Scalar>` +* `meow::Vector3D<Scalar>` + + + +==== math/ + + +===== utility.h + +數學相關的小 function 雜七雜八的不知道歸類何處 + +.Functions +* noEPS() +* normalize() +* denormalize() +* ratioMapping() +* inRange() +* squ() +* cub() +* average() +* average() +* tAbs() + +.Constants +* PI + +===== Matrix.h + +.Classes +* `meow::Matrix<Entry>` + +===== Vector.h + +實作上將 *Matrix* 重新包裝 + +.Classes +* `meow::Vector<Scalar>` + +===== Transformation.h + +各種轉換的 Base Class, 這裡所謂的 *Transformation* 形式上不一定要是 Linear, +但原則上都是 *input a vector, output a vector* 其中input/output的dimension可以 +不同. + +.Classes +* `meow::Transformation<Scalar>` + +===== Transformations.h + +包含各種 *Non-Linear* transformation + +.Classes +* `meow::BallProjection<Scalar>` +* `meow::PhotoProjection<Scalar>` + +===== LinearTransformation.h + +各種 LinearTransformation 的Base Class, 繼承自 `meow::Transformation` + +.Classes +* `meow::LinearTransformation<Scalar>` + +===== LinearTransformations.h + +各種 *Linear* Transformation + +.Classes +* `meow::Rotation3D<Scalar>` + +===== methods.h + +一些數學方法 + +.Functions +* ransac() +* levenbergMarquardt() + + + +==== oo/ + +物件相關 + +===== ObjBase.h + +.Classes +* `meow::ObjBase` + +===== ObjTypes.h + +.Classes +* `meow::ObjType` +* `meow::ObjInt` +* `meow::ObjSizeT` +* `meow::ObjDouble` +* `meow::ObjString` + +===== ObjArray.h + +.Classes +* `meow::ObjArray` + +===== ObjDictionary.h + +.Classes +* `meow::ObjDictionary` + +===== ObjSelector.h -''' +.Classes +* `meow::ObjSelector<SID>` == Test @@ -740,3 +732,4 @@ http://www.spoj.com/problems/SHUFFLEK/[SPOJ] == Bug Report / Contact * E-Mail: cat.hook31894 \~在~ gmail.com + * GitHub |