bool Utility::checkSameClockDir(const cv::Point3d& triPt1, const cv::Point3d& triPt2, const cv::Point3d& triPt3, const cv::Point3d& norm)
 {
     // edge 1 of triangle
     cv::Point3d edge1 = triPt2 - triPt1;
     // edge 2 of triangle
     cv::Point3d edge2 = triPt3 - triPt1;
     // vector normal of triangle
     cv::Point3d triNormal = edge1 - edge2;
     // dot product with norm
     return norm.dot(triNormal) > 0;
 }
bool SimulatingImage::isCross(cv::Point3d ray) {
    
    if (acos(ray.z) > fov) {
        return false;
    }
    
    double cosine = ray.ddot(norm);
    if (0. < cosine  && cosine <= 1.) {
        return true;
    } else {
        return false;
    }
}
 double Utility::getAngle(const cv::Point3d& a, const cv::Point3d& b)
 {
     return acos(std::min<double>(1, std::max<double>(-1, a.dot(b) / (cv::norm(a) * cv::norm(b)))));
 }