本文介绍了计算三维网格的体积的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我累计算三维物体的体积(立方体,圆柱体...)任何一个可以帮助

i get tired to calculate the volume of 3D object (Cube, Cylinder ...) can any one help

这个问题呢?问题是,如何计算对象从他的

with this problem ? the question is , how to calculate the volume of object from his

坐标基于三角形。我班上做不好的工作,任何一个可以帮助我

coordinates based on triangles. my class don't do well the job , any one help me to

emproove类?

emproove the class ?

感谢

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 < _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());
}



我测试的结果是体积= 666666,但它应该是1000

The result of my test is vol = 666,666 but it should be 1000.

推荐答案

双v132 = (p3.X - basePoint.X)*(p3.Y - basePoint.Y)*(p2.Z - basePoint.Z);

根据的的应该是(注意p1.X而不是p3.X)表面:

Is not correct according to How to calculate the volume of a 3D mesh object the surface of which is made up triangles it should be (notice the p1.X instead of p3.X):

VAR v132 = p1.X * p3.Y * p2.Z;

修改

虽然你标记这个答案是正确的,我测试的代码,发现更多的错误。

Although you marked this answer as correct I tested the code and found more errors.

三角形是不是所有的朝外(或向内)通过调整三角形索引是这样的:

The triangles are not all facing outward (or inward) by adjusting the triangle indices like this:

0, 1, 2,
0, 2, 3,
4, 6, 5,
4, 7, 6,// adjusted
1, 6, 2,
1, 5, 6,
0, 7, 4,// adjusted
0, 3, 7,// adjusted
0, 5, 1,// adjusted
0, 4, 5,// adjusted
3, 2, 6,
3, 6, 7

所有法线朝外。然后计算返回-1000根据底座抵消负。

all normals face outward. the calculation then returns -1000 the minus depending on the base offset.

这篇关于计算三维网格的体积的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-11 15:46