Ejemplo n.º 1
0
        public static (double volume, IDPoint3 center)? GetVolumeAndMassCenter(this ITriObject triObject)
        {
            try
            {
                double   Volume = 0;
                IDPoint3 Center = MaxGlobal.DPoint3.Create(0, 0, 0);

                for (int i = 0; i < triObject.Mesh.NumFaces; i++)
                {
                    IFace face = triObject.Mesh.Faces[i];

                    IDPoint3 vert2 = MaxGlobal.DPoint3.Create(triObject.Mesh.GetVert((int)face.GetVert(2)));
                    IDPoint3 vert1 = MaxGlobal.DPoint3.Create(triObject.Mesh.GetVert((int)face.GetVert(1)));
                    IDPoint3 vert0 = MaxGlobal.DPoint3.Create(triObject.Mesh.GetVert((int)face.GetVert(0)));

                    vert1.Subtract(vert0);
                    vert2.Subtract(vert0);

                    double dV = MaxGlobal.DotProd(
                        MaxGlobal.CrossProd(
                            vert1.Subtract(vert0),
                            vert2.Subtract(vert0))
                        , vert0);

                    Volume += dV;

                    Center = Center.Add((vert0.Add(vert1).Add(vert2)).MultiplyBy(dV));
                }

                Volume = Volume / 6;
                Center = Center.DivideBy(24);
                Center = Center.DivideBy(Volume);

                return(Volume, Center);
            }
            catch
            {
                return(null);
            }
        }
Ejemplo n.º 2
0
        public static (double volume, Point3D center)? GetVolumeAndMassCenter(this IINode node)
        {
            try
            {
                bool       toDelete  = false;
                ITriObject triObject = node.GetTriObjectFromNodeInCurrentTime(out toDelete);

                (double volume, IDPoint3 center)? ret = triObject.GetVolumeAndMassCenter();

                // Delete the triObject
                //triObject.DeleteAllRefsToMe();

                // Gets the WORLD position
                IDMatrix3 tm          = node.GetObjectTM(MaxInterface.Time, null).ToDMatrix3();
                IDPoint3  worldCenter = MaxGlobal.Multiply(tm, ret.Value.center);

                return(ret.Value.volume, worldCenter.ToPoint3D());
            }
            catch
            {
                return(null);
            }
        }
Ejemplo n.º 3
0
 public static Point3D ToPoint3D(this IDPoint3 pnt)
 {
     return(new Point3D(pnt.X, pnt.Y, pnt.Z));
 }