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); } }
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); } }
public static Point3D ToPoint3D(this IDPoint3 pnt) { return(new Point3D(pnt.X, pnt.Y, pnt.Z)); }