title: Calculate volume of 3D mesh
body: <p>i get tired to calculate the volume of 3D object (Cube, Cylinder ...) can any one help </p>
  
  <p>with this problem ? the question is , how to calculate the volume of object from his </p>
  
  <p>coordinates based on triangles. my class don't do well the job , any one help me to </p>
  
  <p>emproove the class ? </p>
  
  <p>thanks</p>
  
  <pre><code>public class Algorithm
  {
      private  Mesh _mesh { get; set; }
  
      public Algorithm(Mesh mesh)
      {
          _mesh = mesh;
      }
  
      private double SignedVolumeOfTriangle(Vector3 p1, Vector3 p2, Vector3 p3)
      {
          var v321 = p3.X * p2.Y * p1.Z;
          var v231 = p2.X * p3.Y * p1.Z;
          var v312 = p3.X * p1.Y * p2.Z;
          var v132 = p1.X * p3.Y * p2.Z;
          var v213 = p2.X * p1.Y * p3.Z;
          var v123 = p1.X * p2.Y * p3.Z;
          return (1.0 / 6.0) * (-v321 + v231 + v312 - v132 - v213 + v123);
      }
  
      public double VolumeOfMesh()
      {
          double volume = 0.0;
  
          Vector3[] vertices = _mesh.Vertices;
          int[] triangles = _mesh.Triangles;
  
          for (int i = 0; i &lt; _mesh.Triangles.Length; i += 3)
          {
              Vector3 p1 = vertices[triangles[i + 0]];
              Vector3 p2 = vertices[triangles[i + 1]];
              Vector3 p3 = vertices[triangles[i + 2]];
  
              volume += SignedVolumeOfTriangle(p1, p2, p3);
          }
  
          return Math.Abs(volume);
      }
  }
  
  
  
  public  class Mesh
  {
      public Mesh(Vector3[] _vertices,int[] _triangles)
      {
          Vertices = _vertices;
          Triangles = _triangles;
      }
  
      public Vector3[] Vertices { get; set; }
  
      public int[] Triangles { get; set; }
  }
  
  
  public class Vector3
  {
      public Vector3()
      {
  
      }
  
      public Vector3(double x,double y,double z)
      {
          X = x;
          Y = y;
          Z = z;
      }
  
      public double X { get; set; }
  
      public double Y { get; set; }
  
      public double Z { get; set; }
  }
  
  
  
  private void button1_Click(object sender, EventArgs e)
  {
          Vector3[] vers = new Vector3[8] {
                                      new Vector3 {X = 5,Y = 5,Z =5},
                                      new Vector3 {X = 15,Y = 5,Z =5},
                                      new Vector3 {X = 15,Y = 15,Z =5},
                                      new Vector3 {X = 5,Y = 15,Z =5},
                                      new Vector3 {X = 5,Y = 5,Z =15},
                                      new Vector3 {X = 15,Y = 5,Z =15},
                                      new Vector3 {X = 15,Y = 15,Z =15},
                                      new Vector3 {X = 5,Y = 15,Z =15},
          };
  
          int[] trs = new int[36] { 0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7, 
                                    1, 6, 2, 1, 5, 6, 0, 4, 7, 0, 7, 3,
                                    0, 1, 5, 0, 5, 4, 3, 2, 6,3, 6, 7 };
  
  
          Mesh mesh = new Mesh(vers, trs);
          Algorithm algo = new Algorithm(mesh);
          var vol = algo.VolumeOfMesh();
  
          MessageBox.Show(vol.ToString());
  }
  </code></pre>
  
  <p>The result of my test is vol = 666,666 but it should be 1000.</p>