向量線的一種柵格化演算法

2022-07-04 01:42:12 字數 1826 閱讀 4741

目錄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。為了將機器學習演算法或統計技術應用到任何形式的文字上,應...

一種濾波演算法

剛看到要寫濾波演算法的時候懵了,想著是不是要去掉最大值 最小值什麼的,感覺很高大上 於是開始查資料了解,發現濾波演算法其實有很多種方法,如下列舉了一些,當然能起到的濾波作用也是不同的 於是我看了下,選擇了一種最簡單實用的濾波演算法學習了一下,即下面的中位值濾波演算法 簡單來說就是多次取樣,排序,取中...