我有一个如下图所示的网格。网格的每个部分都具有正( np )和负正常( nn )。每对法线属于网格中的一个线段。
中间的红点是我的观察点。我需要找出这个观察点可见的法线。
到目前为止,我遵循的方法是计算从观察点到每个网格段中间的法线向量( ob_i )。然后,我在 ob_i 和 np 或 nn 上执行点积。结果大于零或小于。如果它小于矢量面向另一个方向并且可以被视为隐藏在观察点之外。
这是我如何计算点积并检查可见性:
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();
}
我试图让所有面向观察点的法向矢量都存在,并将那些面向外的矢量归零。我得到错误,正如在第二张图片中看到的,一些向量面向错误的方向。
最终结果应如下所示:
答案 0 :(得分:1)
您的点积计算错误。它应该是X * X + Y * Y。