目錄2. 實現
3. 參考
將一條線段柵格化的最簡單的演算法思路是根據其斜率,按x或y方向步進取值:
除此之外還有一種演算法是利用計算機圖形學中繪製直線的bresenham演算法,這種演算法的效率很高,原理就是用遍歷的辦法規避乘法和除法,只用加減法就能完成線段的柵格化。
上述兩種演算法有個問題就是都要經過一系列繁複的判斷,才能得到比較嚴密的結果,所以我並沒有採用。我這裡採用的演算法也是逐漸步進求值的辦法,只不過不再沿著x或者y方向求值,而是沿著射線方向步進。這裡的射線指的是從線段的起點開始,以1畫素為步進單位,步進到線段的終點。因為線段的方向性問題,步進得到的點總會有重複的值,最後再進行去重操作即可。
演算法過程簡述如下:
設線段的起點為\(o\),終點為\(e\),則方向向量為\(d=e-o\);
線段的長度l為向量\(d\)的模。以0為初值,l為終值,以1為步進值建立乙個for迴圈,每次取的長度為d;
令\(t=d/l\),則線段上相應的點為\(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::pairline, 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)) }
int main()
}
其執行的結果如下:
[1].向量資料柵格化
[2].bresenham演算法
向量線的一種柵格化演算法
2.實現 3.參考 將一條線段柵格化的最簡單的演算法思路是根據其斜率,按x或y方向步進取值 除此之外還有一種演算法是利用計算機圖形學中繪製直線的bresenham演算法,這種演算法的效率很高,原理就是用遍歷的辦法規避乘法和除法,只用加減法就能完成線段的柵格化。上述兩種演算法有個問題就是都要經過一系列...
TF IDF 文字的一種向量表示
tf idf是term frequency inverse document frequency的簡稱。她是一種非常常見的用於將文字轉化為有意義的數字表示的演算法。這個技術被廣泛的應用與nlp的各個方面。本文將會介紹怎樣計算和應用tf idf。為了將機器學習演算法或統計技術應用到任何形式的文字上,應...
一種濾波演算法
剛看到要寫濾波演算法的時候懵了,想著是不是要去掉最大值 最小值什麼的,感覺很高大上 於是開始查資料了解,發現濾波演算法其實有很多種方法,如下列舉了一些,當然能起到的濾波作用也是不同的 於是我看了下,選擇了一種最簡單實用的濾波演算法學習了一下,即下面的中位值濾波演算法 簡單來說就是多次取樣,排序,取中...