Example #1
0
    double Mesh::ComputeVolume() const
    {
        const size_t nV = GetNPoints();
        const size_t nT = GetNTriangles();
        if (nV == 0 || nT == 0)
        {
            return 0.0;
        }

        Vec3<double> bary(0.0, 0.0, 0.0);
        for (size_t v = 0; v < nV; v++)
        {
            bary +=  GetPoint(v);
        }
        bary /= static_cast<double>(nV);

        Vec3<double> ver0, ver1, ver2;
        double totalVolume = 0.0;
        for(size_t t = 0; t < nT; t++)
        {
            const Vec3<int> & tri = GetTriangle(t);
            ver0 = GetPoint(tri[0]);
            ver1 = GetPoint(tri[1]);
            ver2 = GetPoint(tri[2]);
            totalVolume += ComputeVolume4(ver0, ver1, ver2, bary);
        }
        return totalVolume/6.0;
    }
Example #2
0
 bool Mesh::IsInside(const Vec3<double> & pt) const
 {
     const size_t nV = GetNPoints();
     const size_t nT = GetNTriangles();
     if (nV == 0 || nT == 0)
     {
         return false;
     }
     Vec3<double> ver0, ver1, ver2;
     double volume;
     for (size_t t = 0; t < nT; t++)
     {
         const Vec3<int> & tri = GetTriangle(t);
         ver0 = GetPoint(tri[0]);
         ver1 = GetPoint(tri[1]);
         ver2 = GetPoint(tri[2]);
         volume = ComputeVolume4(ver0, ver1, ver2, pt);
         if (volume < 0.0)
         {
             return false;
         }
     }
     return true;
 }
Example #3
0
bool TMMesh::SaveVRML2(std::ofstream &fout, const Material & material)
{
    if (fout.is_open())
    {
        size_t nV = m_vertices.GetSize();
        size_t nT = m_triangles.GetSize();
        fout <<"#VRML V2.0 utf8" << std::endl;
        fout <<"" << std::endl;
        fout <<"# Vertices: " << nV << std::endl;
        fout <<"# Triangles: " << nT << std::endl;
        fout <<"" << std::endl;
        fout <<"Group {" << std::endl;
        fout <<"	children [" << std::endl;
        fout <<"		Shape {" << std::endl;
        fout <<"			appearance Appearance {" << std::endl;
        fout <<"				material Material {" << std::endl;
        fout <<"					diffuseColor "      << material.m_diffuseColor.X()      << " "
             << material.m_diffuseColor.Y()      << " "
             << material.m_diffuseColor.Z()      << std::endl;
        fout <<"					ambientIntensity "  << material.m_ambientIntensity      << std::endl;
        fout <<"					specularColor "     << material.m_specularColor.X()     << " "
             << material.m_specularColor.Y()     << " "
             << material.m_specularColor.Z()     << std::endl;
        fout <<"					emissiveColor "     << material.m_emissiveColor.X()     << " "
             << material.m_emissiveColor.Y()     << " "
             << material.m_emissiveColor.Z()     << std::endl;
        fout <<"					shininess "         << material.m_shininess             << std::endl;
        fout <<"					transparency "      << material.m_transparency          << std::endl;
        fout <<"				}" << std::endl;
        fout <<"			}" << std::endl;
        fout <<"			geometry IndexedFaceSet {" << std::endl;
        fout <<"				ccw TRUE" << std::endl;
        fout <<"				solid TRUE" << std::endl;
        fout <<"				convex TRUE" << std::endl;
        if (GetNVertices() > 0) {
            fout <<"				coord DEF co Coordinate {" << std::endl;
            fout <<"					point [" << std::endl;
            for(size_t v = 0; v < nV; v++)
            {
                TMMVertex & currentVertex = m_vertices.GetData();
                fout <<"						" << currentVertex.m_pos.X() << " "
                     << currentVertex.m_pos.Y() << " "
                     << currentVertex.m_pos.Z() << "," << std::endl;
                currentVertex.m_id = v;
                m_vertices.Next();
            }
            fout <<"					]" << std::endl;
            fout <<"				}" << std::endl;
        }
        if (GetNTriangles() > 0) {
            fout <<"				coordIndex [ " << std::endl;
            for(size_t f = 0; f < nT; f++)
            {
                TMMTriangle & currentTriangle = m_triangles.GetData();
                fout <<"						" << currentTriangle.m_vertices[0]->GetData().m_id << ", "
                     << currentTriangle.m_vertices[1]->GetData().m_id << ", "
                     << currentTriangle.m_vertices[2]->GetData().m_id << ", -1," << std::endl;
                m_triangles.Next();
            }
            fout <<"				]" << std::endl;
        }
        fout <<"			}" << std::endl;
        fout <<"		}" << std::endl;
        fout <<"	]" << std::endl;
        fout <<"}" << std::endl;
    }
    return true;
}