计算法向量的可见性

时间:2016-09-28 14:26:20

标签: c++ vector linear-algebra

我有一个如下图所示的网格。网格的每个部分都具有正( np )和负正常( nn )。每对法线属于网格中的一个线段。 enter image description here

中间的红点是我的观察点。我需要找出这个观察点可见的法线。

到目前为止,我遵循的方法是计算从观察点到每个网格段中间的法线向量( ob_i )。然后,我在 ob_i np nn 上执行点积。结果大于零或小于。如果它小于矢量面向另一个方向并且可以被视为隐藏在观察点之外。

使用此方法,我得到以下结果: 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

1 个答案:

答案 0 :(得分:1)

您的点积计算错误。它应该是X * X + Y * Y。