2. 實現
3. 參考
將一條線段柵格化的最簡單的演算法思路是根據其斜率,按x或y方向步進取值:
除此之外還有一種演算法是利用計算機圖形學中繪製直線的bresenham演算法,這種演算法的效率很高,原理就是用遍歷的辦法規避乘法和除法,只用加減法就能完成線段的柵格化。
上述兩種演算法有個問題就是都要經過一系列繁複的判斷,才能得到比較嚴密的結果,所以我並沒有採用。我這裡採用的演算法也是逐漸步進求值的辦法,只不過不再沿著x或者y方向求值,而是沿著射線方向步進。這裡的射線指的是從線段的起點開始,以1畫素為步進單位,步進到線段的終點。因為線段的方向性問題,步進得到的點總會有重複的值,最後再進行去重操作即可。
演算法過程簡述如下:
設線段的起點為o
oo,終點為e
ee,則方向向量為d=e
−od=e-o
d=e−o;
線段的長度l為向量d
dd的模。以0為初值,l為終值,以1為步進值建立乙個for迴圈,每次取的長度為d;
令t =d
/lt=d/l
t=d/
l,則線段上相應的點為p=o
+tdp=o+td
p=o+td
。這個公式是根據射線向量方程推導出來的,可以參看這篇文章《已知線段上某點與起點的距離,求該點的座標》;
將取的點都儲存到容器中;
對容器中的點進行去重操作。
最終得到的點即為直線柵格化後的點。
具體的c++實現**如下:
#include
#include
using
namespace std;
const
double epsilon =
0.000001
;// 2d point
struct vector2d
vector2d
(double dx,
double dy)
// 向量賦值
void
set(
double dx,
double dy)
// 向量相加
vector2d operator+(
const vector2d& v)
const
// 向量相減
vector2d operator-(
const vector2d& v)
const
//向量數乘
vector2d scalar
(double c)
const
// 向量點積
double
dot(
const vector2d& v)
const
//向量的模
double
mod(
)const
bool
equel
(const vector2d& v)
const
return
false;}
double x, y;};
//柵格化一條線段
void
rasterline
(std::pair line, std::vector
& linepointlist)
//與最後乙個值比較,去重
linepointlist.
push_back
(line.first)
;for
(size_t i =
0; i < tmppointlist.
size()
; i++)}
if(!linepointlist[linepointlist.
size()
-1].
equel
(line.second))}
intmain()
}
其執行的結果如下:
[1].向量資料柵格化
[2].bresenham演算法
向量線的一種柵格化演算法
目錄2.實現 3.參考 將一條線段柵格化的最簡單的演算法思路是根據其斜率,按x或y方向步進取值 除此之外還有一種演算法是利用計算機圖形學中繪製直線的bresenham演算法,這種演算法的效率很高,原理就是用遍歷的辦法規避乘法和除法,只用加減法就能完成線段的柵格化。上述兩種演算法有個問題就是都要經過一...
TF IDF 文字的一種向量表示
tf idf是term frequency inverse document frequency的簡稱。她是一種非常常見的用於將文字轉化為有意義的數字表示的演算法。這個技術被廣泛的應用與nlp的各個方面。本文將會介紹怎樣計算和應用tf idf。為了將機器學習演算法或統計技術應用到任何形式的文字上,應...
一種濾波演算法
剛看到要寫濾波演算法的時候懵了,想著是不是要去掉最大值 最小值什麼的,感覺很高大上 於是開始查資料了解,發現濾波演算法其實有很多種方法,如下列舉了一些,當然能起到的濾波作用也是不同的 於是我看了下,選擇了一種最簡單實用的濾波演算法學習了一下,即下面的中位值濾波演算法 簡單來說就是多次取樣,排序,取中...