三角网格体积计算

原问题链接:How calculate a volume of this mesh 3D?
相关论文:EFFICIENT FEATURE EXTRACTION FOR 2D/3D OBJECTS
IN MESH REPRESENTATION

补全后的代码

#include <iostream>
#include <pcl/point_types.h>
#include <pcl/io/obj_io.h>
#include <pcl/io/vtk_lib_io.h>
#include <pcl/conversions.h>
#include <cmath>


inline float signedVolumeOfTriangle (pcl::PointXYZ p1, pcl::PointXYZ p2, pcl::PointXYZ p3) 
{
    
    
  float v321 = p3.x*p2.y*p1.z;
  float v231 = p2.x*p3.y*p1.z;
  float v312 = p3.x*p1.y*p2.z;
  float v132 = p1.x*p3.y*p2.z;
  float v213 = p2.x*p1.y*p3.z;
  float v123 = p1.x*p2.y*p3.z;
  return (1.0f/6.0f)*(-v321 + v231 + v312 - v132 - v213 + v123);
}

float volumeOfMesh(pcl::PolygonMesh mesh) 
{
    
    
  float vols = 0.0;
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
  pcl::fromPCLPointCloud2(mesh.cloud, *cloud);
  for(int triangle=0;triangle<mesh.polygons.size();triangle++)
  {
    
    
    pcl::PointXYZ pt1 = cloud->points[mesh.polygons[triangle].vertices[0]];
    pcl::PointXYZ pt2 = cloud->points[mesh.polygons[triangle].vertices[1]];
    pcl::PointXYZ pt3 = cloud->points[mesh.polygons[triangle].vertices[2]];
    vols += signedVolumeOfTriangle(pt1, pt2, pt3);
  }
  return abs(vols);
}

    int main(int argc, char **argv) {
    
    
        pcl::PolygonMesh mesh;
        pcl::io::loadOBJFile(argv[1], mesh);
        std::cout << volumeOfMesh(mesh) << std::endl;
        return 0;
    }

猜你喜欢

转载自blog.csdn.net/weixin_44387339/article/details/116377681