Closest Point Find the Closest Point on a mesh

- Main Page
- Classes
- Files

- File List

src/main.cpp

    00001 #include "ClosestPoint.h"
    00002 #include <fstream>
    00003 #include <cmath>
    00004 #include <boost/test/minimal.hpp>
    00005
    00006 #define INFINITY_FLOAT std::numeric_limits<float>::infinity();
    00007
    00008 /*Test case to validate if the point is in bounds*/
    00009 bool pointInSphere(Vec3f result, Vec3f queryPoint, float radius){
    00010     if (result == NULL)
    00011         return true;
    00012     return (pow(result.x-queryPoint.x,2) +
    00013             pow(result.y-queryPoint.y,2) +
    00014             pow(result.z-queryPoint.z,2) <= pow(radius,2));
    00015 }
    00016
    00017 /*Helper function*/
    00018 bool barycentric (Vec3f a, Vec3f b, Vec3f c, Vec3f p){
    00019     Vec3f v0 = c -a ;
    00020     Vec3f v1 = b -a ;
    00021     Vec3f v2 = p -a ;
    00022
    00023     float dot00 = v0.dot(v0);
    00024     float dot01 = v0.dot(v1);
    00025     float dot02 = v0.dot(v2);
    00026     float dot11 = v1.dot(v1);
    00027     float dot12 = v1.dot(v2);
    00028
    00029     double invDenom = 1 / (dot00 * dot11 - dot01 * dot01);
    00030     double u = (dot11 * dot02 - dot01 * dot12) * invDenom;
    00031     double v = (dot00 * dot12 - dot01 * dot02) * invDenom;
    00032
    00033     return (u >= 0) && (v >= 0) && (u + v <= 1);
    00034 }
    00035
    00036 /*Test case to check if the point actually exists on the mesh*/
    00037 bool pointOnMesh(Vec3f output,Mesh m){
    00038     if (output == NULL)
    00039         return true;
    00040     vector<Face> face = m.get_faceList();
    00041     for (int i=0; i<face.size() ; i++){
    00042         Face temp = face[i];
    00043
    00044         if(barycentric(temp.v1,temp.v2,temp.v3,output))
    00045             return true;
    00046     }
    00047     return false;
    00048 }
    00049
    00050 /*Boost Test Main*/
    00051 int test_main(int argc, char** argv){
    00052     Mesh mesh;
    00053     char* filename = "./data/bunny.ply";     //Default input mesh
    00054
    00055     if(argc ==2){
    00056         std::string argv1 = argv[1];
    00057         if((argv1 == "-h" )|| (argv1 == "--help")){
    00058             cout <<"Usage: ./ClosestPoint [path to ply file]"<<endl;
    00059             cout << "Default ply: ./data/bunny.ply"<<endl;
    00060             exit(0);
    00061         }
    00062         else
    00063             filename = argv[1];
    00064     }
    00065
    00066     cout << "Reading file: "<<filename<<endl;
    00067
    00068     /*Populate Mesh Data structure from the Ply file*/
    00069
    00070     if (!mesh.readPly(filename)){
    00071         cout <<"Failed to read ply file "<< filename<<endl;
    00072         return 1;
    00073     }
    00074
    00075     ClosestPoint cp = ClosestPoint(mesh);
    00076
    00077     /*Read query points from a file and run the algorithm!*/
    00078     std::ifstream infile("./data/queryPoints.txt");
    00079     float x,y,z,searchRadius;
    00080
    00081     while(infile >>x >> y >> z >> searchRadius){
    00082         Vec3f queryPoint = Vec3f(x,y,z);
    00083         Vec3f output = cp(queryPoint,searchRadius);
    00084
    00085         BOOST_CHECK(pointInSphere(output,queryPoint,searchRadius) == true);
    00086         BOOST_CHECK(pointOnMesh(output,cp.getMesh()) == true);
    00087     }
    00088     return 0;
    00089 }

All Classes