我有一个如下图所示的网格。网格的每一段都有正法线 (np) 和负法线 (nn)。每对法线都属于网格中的一个片段。
中间的红点是我的观察点。我需要找出该观察点可以看到哪些法线。
到目前为止,我所遵循的方法是计算从观察点到每个网格段(ob_i)中间的法 vector 。然后我在 ob_i 和 np 或 nn 上做点积。其结果要么大于零,要么小于。如果小于 vector 正对着另一个方向,则可视为隐藏在观察点之外。
下面是我如何计算点积并检查可见性:
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 朝向错误的方向。
最终结果应该如下所示:
最佳答案
您的点积计算有误。应该是 X * X + Y * Y。
关于c++ - 计算法 vector 的可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39750388/