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

2021-10-03 12:31:09 字數 2230 閱讀 3380

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

一種濾波演算法

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