//if two points in the same plane bool isInSamePlane(Point p1, Point p2, vector<pcl::KdTreeFLANN<Point>> trees){ for(int i=0; i<trees.size(); i++){ if(isInPlane(p1, trees.at(i))&&isInPlane(p2, trees.at(i))){ return true; } } return false; }
float plane::distance(const vector3& p)const { if (isInPlane(p)) return 0.0f; return (p - point_).dotProduct(norm_); }
bool plane::isInPlane(const line& l)const { auto dot = norm_.dotProduct(l.dir()); if (!floatEqual(dot, 0.0f)) return false; return isInPlane(l.start()); }
std::pair<bool, vector3> plane::intersection(const line& l)const { auto ret = std::make_pair<bool, vector3>(false, vector3()); if (isInPlane(l)) return ret; ret.first = true; auto t = (norm_.dotProduct(point_) - norm_.dotProduct(l.start())) / (norm_.dotProduct(l.dir())); ret.second = l.start() + t * l.dir(); return ret; }
// bb 가 보이는지를 판정한다 bool ROcclusionList::IsVisible(rboundingbox &bb) { for(ROcclusionList::iterator i=begin();i!=end();i++) { ROcclusion *poc=*i; bool bVisible=false; for(int j=0;j<poc->nCount+1;j++) { if(isInPlane(&bb,&poc->pPlanes[j])) { bVisible=true; break; } } // 하나의 occlusion 에라도 가려져있으면 더이상 볼필요없다. if(!bVisible) return false; } return true; }