c++ - 计算法 vector 的可见性

标签 c++ vector linear-algebra

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

中间的红点是我的观察点。我需要找出该观察点可以看到哪些法线。

到目前为止,我所遵循的方法是计算从观察点到每个网格段(ob_i)中间的法 vector 。然后我在 ob_inpnn 上做点积。其结果要么大于零,要么小于。如果小于 vector 正对着另一个方向,则可视为隐藏在观察点之外。

使用这种方法,我得到以下结果: 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();
}

我试图让所有面向观察点的法 vector 都存在,并将面向外的法 vector 归零。我收到错误,如第二张图片所示,一些 vector 朝向错误的方向。

最终结果应该如下所示:

enter image description here

最佳答案

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

关于c++ - 计算法 vector 的可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39750388/

相关文章:

c++ - 求模拟粒子轨迹的3D点和 vector 几何C++库

python - 物理转置大型非方 numpy 矩阵

r - Gram-Schmidt 正交化

c++ - 光电鼠标作为编码器

c++ - 以编程方式确定我正在运行的发行版

c++ - 如何设置 "discrete_distribution"c++的 vector

C++ for-each 语句触发 "vector iterators incompatible"断言失败 : this->_Getcont() == 0

php - 找到相交线之间的所有四边形?

c++ - 如何在 Boost 中对多边形进行三角剖分?

c++ - 即使使用适当的方面,非有限 float 的反序列化也会失败