using System; namespace Science.Physics.GeneralPhysics { /// /// CenterOfMass /// public class CenterOfMass : Vector { private void SetDim() { this.DimensionMass = 1; this.DimensionLength = 0; this.DimensionTime = 0; } public CenterOfMass() { SetDim(); } public CenterOfMass(Mass[] m, Position[] r) { SetDim(); double sumOfMass = 0.0; foreach(Mass mass in m) sumOfMass += mass.kg; double x = 0.0, y = 0.0, z = 0.0; for(int i = 0; i < m.Length; i++) { x += m[i].kg*r[i].X; y += m[i].kg*r[i].Y; z += m[i].kg*r[i].Z; } this.X = x/sumOfMass; this.Y = y/sumOfMass; this.Z = z/sumOfMass; } private Scalar.FunctionOfPosition fp; public CenterOfMass(Density rho, Volume v) { SetDim(); fp = rho.ScalarFunctionOfPosition; Scalar.FunctionOfPosition ff = new Scalar.FunctionOfPosition(Rho); Scalar s = new Scalar(ff); Scalar res = VectorCalculus.VolumeIntegral(s, v); double mass = res.Magnitude; Scalar.FunctionOfPosition fx = new Scalar.FunctionOfPosition(Xrho); Scalar sx = new Scalar(fx); Scalar resx = VectorCalculus.VolumeIntegral(sx, v); this.X = resx.Magnitude/mass; this.StandardDeviationOfX = resx.StandardDeviation / mass; Scalar.FunctionOfPosition fy = new Scalar.FunctionOfPosition(Yrho); Scalar sy = new Scalar(fy); Scalar resy = VectorCalculus.VolumeIntegral(sy, v); this.Y = resy.Magnitude / mass; this.StandardDeviationOfY = resy.StandardDeviation / mass; Scalar.FunctionOfPosition fz = new Scalar.FunctionOfPosition(Zrho); Scalar sz = new Scalar(fz); Scalar resz = VectorCalculus.VolumeIntegral(sz, v); this.Z = resz.Magnitude / mass; this.StandardDeviationOfZ = resz.StandardDeviation / mass; } private Scalar Rho(Position r) { return fp(r); } private Scalar Xrho(Position r) { return r.X*fp(r); } private Scalar Yrho(Position r) { return r.Y*fp(r); } private Scalar Zrho(Position r) { return r.Z*fp(r); } public override string ToString() { return base.ToString() + "(m)"; } } }