Exemplo n.º 1
0
double UniGridApprox::CompMeshError()
{
    Base::Builder3D log3d;
    MeshCore::MeshKernel mesh;
    BRepBuilderAPI_MakeFace Face(aAdaptorSurface.BSpline());
    GeomAPI_ProjectPointOnSurf proj;
    best_fit::Tesselate_Face(Face.Face(), mesh, float(0.1));
    cout << mesh.CountPoints() << endl;
    std::vector<Base::Vector3f> normals =  best_fit::Comp_Normals(mesh);

    double tmp = 0.0, sqrdis;
    double errSum = 0.0;
    int c=0;

    m_err.clear();
    m_err.resize(mesh.CountPoints(), 0.0);

    MeshCore::MeshFacetGrid aFacetGrid(m_Mesh);
    MeshCore::MeshAlgorithm malg(m_Mesh);
    MeshCore::MeshAlgorithm malg2(m_Mesh);
    MeshCore::MeshPointIterator p_it(mesh);

    Base::Vector3f projPoint, distVec, pnt;
    unsigned long  facetIndex;


    for (p_it.Begin(); p_it.More(); p_it.Next())
    {
        if (!malg.NearestFacetOnRay(*p_it, normals[p_it.Position()], aFacetGrid, projPoint, facetIndex))   // gridoptimiert
        {
            if (malg2.NearestFacetOnRay(*p_it, normals[p_it.Position()], projPoint, facetIndex))
            {
                pnt.x = p_it->x;
                pnt.y = p_it->y;
                pnt.z = p_it->z;
                log3d.addSingleLine(pnt,projPoint);
                distVec  = projPoint - pnt;
                sqrdis   = distVec*distVec;
            }
            else
            {
                cout << "oops, ";
                continue;
            }
        }
        else
        {
            pnt.x = p_it->x;
            pnt.y = p_it->y;
            pnt.z = p_it->z;
            log3d.addSingleLine(pnt,projPoint);
            distVec  = projPoint - pnt;
            sqrdis   = distVec*distVec;
        }

        errSum += sqrt(sqrdis);
        ++c;

        if (sqrt(sqrdis) > tmp)
        {
            m_err[p_it.Position()] = sqrt(sqrdis);
            tmp = m_err[p_it.Position()];
        }
    }

    log3d.saveToFile("c:/Error.iv");

    return errSum/c;
}