2016-09-28 27 views
0

我在下圖中顯示了一個網格。網格的每個部分都有一個正數(np)和負數正數(nn)。每對法線屬於網格中的一個線段。 enter image description here計算法向量的可見性

中間的紅點是我的觀察點。我需要找出哪些法線對這個觀察點是可見的。

我到目前爲止所遵循的方法是計算從觀察點到每個網格段中間的法向量(ob_i)。我然後在ob_inpnn上做點積。這個結果要麼大於零,要麼小於。如果它小於矢量面向另一個方向並且可以被視爲隱藏在觀察點之外。

使用這種方法,我得到以下結果: enter image description here

繼承人我如何計算的點積和檢查可見:

vector<vector<int>> calculateShadowingMatrix(vector<point> observationNormals, vector<vector<point>> normals){ 
vector<vector<int>> shadowMatrix; 

for(unsigned ii = 0; ii < normals.size(); ii++){ 
    vector<int> visibilty; 

    for(unsigned jj = 0; jj < normals[ii].size(); jj++) { 

     double dot = dotProduct(observationNormals[ii], normals[ii][jj]); 

     if (dot <= 0.0) { 
      visibilty.push_back(1); 
     } else { 
      visibilty.push_back(0); 
     } 

    } 
    shadowMatrix.push_back(visibilty); 
} 

return shadowMatrix; 
} 

double dotProduct(point _u, point _v){ 
    return _u.getX()*_v.getX() - _u.getY()*_v.getY(); 
} 

我試圖讓所有這些都是正常的載體面向觀察點出現,並將面向外的觀察點歸零。我得到的錯誤,正如第二張圖片中可以看到的,一些矢量面對着錯誤的方向。

最終的結果應該如下所示:

enter image description here

+0

您的預期結果是什麼? –

+0

使所有正常的矢量箭頭指向觀察點。在第一張圖片中,我需要在右側結構上顯示紅色箭頭,並在左側結構上顯示藍色箭頭。 –

+0

@MichaelRichardson在問題中更新此內容以幫助他人幫助您。 –

回答

1

你的點積計算是錯誤的。它應該是X * X + Y * Y.

+0

謝謝!它完美的工作! –