向量線的一種柵格化演算法
阿新 • • 發佈:2020-03-05
[toc]
# 1. 概述
## 1.1. 已知演算法
將一條線段柵格化的最簡單的演算法思路是根據其斜率,按X或Y方向步進取值:![線的柵格化][imglink1]![線的柵格化][imglink2]
除此之外還有一種演算法是利用計算機圖形學中繪製直線的Bresenham演算法,這種演算法的效率很高,原理就是用遍歷的辦法規避乘法和除法,只用加減法就能完成線段的柵格化。
## 1.2. 本文演算法
上述兩種演算法有個問題就是都要經過一系列繁複的判斷,才能得到比較嚴密的結果,所以我並沒有採用。我這裡採用的演算法也是逐漸步進求值的辦法,只不過不再沿著X或者Y方向求值,而是沿著射線方向步進。這裡的射線指的是從線段的起點開始,以1畫素為步進單位,步進到線段的終點。因為線段的方向性問題,步進得到的點總會有重複的值,最後再進行去重操作即可。
演算法過程簡述如下:
1. 設線段的起點為$O$,終點為$E$,則方向向量為$D=E-O$;
2. 線段的長度L為向量$D$的模。以0為初值,L為終值,以1為步進值建立一個for迴圈,每次取的長度為d;
3. 令$t=d/L$,則線段上相應的點為$P=O+tD$。這個公式是根據射線向量方程推匯出來的,可以參看這篇文章[《已知線段上某點與起點的距離,求該點的座標》][netlink1];
4. 將取的點都儲存到容器中;
5. 對容器中的點進行去重操作。
最終得到的點即為直線柵格化後的點。
# 2. 實現
具體的C++實現程式碼如下:
```cpp
#