我正在嘗試使用 Vulkan 的模板緩沖區渲染輪廓。該技術涉及對物件進行兩次渲染,第二次按比例放大以說明所述輪廓。通常這是在 3D 空間中完成的,其中每個頂點的法線向量可用于正確縮放物件。但是,我在 2D 空間中嘗試相同的方法并且沒有預先計算的法線。

一個例子:給定的是 Coordinates I,H并且J我需要找到L,K并且M在每組平行向量之間的距離相同的條件下。
我嘗試放大物件,然后將其移動到正確的位置,但這讓我無處可去。
我正在尋找一種解決方案,該解決方案理想地適用于 2D 空間中的任意形狀并且還有些高效。我也不確定這是否應該在 GPU 或 CPU 上計算。
uj5u.com熱心網友回復:
讓我們畫一個二維多邊形的單點示例。

點的位置M僅取決于位置A及其兩條相鄰線,我也添加了法線 - 綠色和藍色。偏移線和非偏移線的交點上的點P和線。Q
如果我們知道 A - 的相鄰點B,以及到和C的距離,那么OP
M = A - d_p * normalize(B-A) - d_o * normalize(C-A)
這是真的,因為P, O躺在線上B-A和C-A。
從兩色直角三角形很容易計算距離:
d_p=s/sin(alfa)
d_o=s/sin(alfa)
s所需的模板偏移在哪里。他們當然是一樣的。
所以整個計算,給定A,B,C某個多邊形角的坐標和所需的位移s是:
b = normalize(B-A) # vector
c = normalize(C-A) # vector
alfa = arccos(b.c) # dot product
d = s/sin(alfa)
M = A - sign(b.c) * (b c)*d
這也證明M位于阿爾法角平分線上。
無論如何,該公式是通用的并且適用于任何二維多邊形,它很容易并行化,因為每個點都獨立于其他點移動。但
- 對于非凸角,你需要使用相反的符號,我們可以使用點積來概括。
b.c它在接近零時數值不穩定,即當b,c線幾乎平行時,在這種情況下,我建議只移動線A的歸一化法線,在 2Dd*n_b中它是歸一化((By - Ay,Ax-Bx))。n_bB-A
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/523864.html
標籤:C 算法数学gsl二维
上一篇:陣列中所有可能的數字對的差異
下一篇:在另一個物件陣列中傳遞陣列
