/// <summary> /// calculates volume, only works on an amorphus blob. Returns a double in real world space. /// </summary> /// <param name="planes">List(List(Point3D))</param> /// <param name="increment">double</param> /// <returns>double</returns> public static double volume1stApprox(List <List <Point3D> > planes, double increment) { double volume = 0; for (int i = 0; i < planes.Count; i++) { List <Point3D> plane = planes[i]; if (plane.Count != 0) { plane.Add(plane[0]); //a list eating its own head, steve matthews would be proud double area = 0; area = AreaCalculator.calculateArea(plane); volume = volume + (area * increment); } else { Console.WriteLine("Plane EMPTY!!! BAD THINGS WILL HAPPEN"); } } volume = UnitConvertor.convertPCM(volume, 3); return(volume); }
//provide depth z at a given joint co-ordinate and a pointcloud with that particular information. public static double calculate(List <List <Point3D> > planes, int planeNo) { List <Point3D> plane3D; double circum = 0; //sometimes the bounding can be quite poor depending on skeleton bounding //check if any planes have been returned before passing to circum. calc. if (planes.Count != 0) { if (planeNo == 1) { plane3D = planes[planeNo - 1]; } else { plane3D = planes[planeNo]; } circum = CircumferenceCalculator.calculate(plane3D); Console.WriteLine("Circum Pre Multi: " + circum); circum = UnitConvertor.convertPCM(circum, 1); Console.WriteLine("Circum: " + circum); } return(circum); }
/// <summary> /// Returns the height of a point cloud in real world measurements, aka metres /// </summary> /// <param name="pc">PointCloud</param> /// <returns>double</returns> public static double getHeight(PointCloud pc) { double ymin = pc.getyMin(); double ymax = pc.getyMax(); double height = ymax - ymin; height = UnitConvertor.convertPCM(height, 1); return(height); }
/// <summary> /// returns one area for every plane fed. returns real world areas not point cloud areas /// </summary> /// <param name="planes">List(List(Point3D))</param> /// <returns>List(double)</returns> public static List <double> getAllAreas(List <List <Point3D> > planes) { List <double> output = new List <double>(); for (int i = 0; i < planes.Count; i++) { output.Add(UnitConvertor.convertPCM(AreaCalculator.calculateArea(planes[i]), 2)); } return(output); }
public static Tuple <double, double, List <List <Point3D> > > calculateLimbBounds(PointCloud pc, Dictionary <String, double[]> jointDepths, int limb, double weight) { //Calculate limb bounds based on limb choice double finalCircum = 0.0; double numPlanes = 0.0; Tuple <List <List <Point3D> >, double> T = new Tuple <List <List <Point3D> >, double>(null, 0); //premodify limb circum factors with discovered weight if (weight < 60) { ArmFactorL = 1.21; LegFactorL = 3.89; ArmFactorR = 1.02; LegFactorR = 2.96; ChestFactor = 1.62; ShoulderFactor = 1.43; WaistFactor = 6.63; } else if (weight >= 60 && weight < 90) { ArmFactorL = 1.07; LegFactorL = 3.10; ArmFactorR = 1.05; LegFactorR = 2.95; ChestFactor = 1.42; ShoulderFactor = 1.41; WaistFactor = 5.94; } else if (weight >= 90) { ArmFactorL = 0.91; LegFactorL = 3.39; ArmFactorR = 0.89; LegFactorR = 3.51; ChestFactor = 1.46; ShoulderFactor = 1.53; WaistFactor = 4.529; } switch (limb) { case 1: //SHOULDERS (1) xmin = jointDepths["ShoulderRight"][1]; xmax = jointDepths["ShoulderLeft"][1]; ymax = jointDepths["ShoulderCenter"][2]; ymin = jointDepths["Spine"][2]; zmin = pc.getzMin(); zmax = pc.getzMax(); bounds = new double[] { xmin, ymin, zmin, xmax, ymax, zmax }; premodifier = ShoulderFactor; //translate bounds according to pointcloud data points System.Diagnostics.Debug.WriteLine("Bounds:" + xmin + ", " + ymin + ", " + zmin + ", " + xmax + ", " + ymax + ", " + zmax); break; case 2: //ARM_LEFT (2) xmin = jointDepths["HipLeft"][1]; xmax = jointDepths["WristLeft"][1] + ((jointDepths["WristLeft"][1] - jointDepths["HipLeft"][1]) / 4); ymax = jointDepths["ShoulderLeft"][2]; ymin = jointDepths["WristLeft"][2]; zmin = pc.getzMin(); zmax = pc.getzMax(); bounds = new double[] { xmin, ymin, zmin, xmax, ymax, zmax }; //translate bounds according to pointcloud data points premodifier = ArmFactorL; System.Diagnostics.Debug.WriteLine("Bounds:" + xmin + ", " + ymin + ", " + zmin + ", " + xmax + ", " + ymax + ", " + zmax); break; case 3: //ARM_RIGHT (3) xmin = jointDepths["WristRight"][1] - ((jointDepths["HipRight"][1] - jointDepths["WristRight"][1]) / 4); xmax = jointDepths["HipRight"][1]; ymax = jointDepths["ShoulderRight"][2]; ymin = jointDepths["WristRight"][2]; zmin = pc.getzMin(); zmax = pc.getzMax(); bounds = new double[] { xmin, ymin, zmin, xmax, ymax, zmax }; //translate bounds according to pointcloud data points System.Diagnostics.Debug.WriteLine("Bounds:" + xmin + ", " + ymin + ", " + zmin + ", " + xmax + ", " + ymax + ", " + zmax); premodifier = ArmFactorR; break; case 4: //CHEST(4) xmin = jointDepths["ShoulderRight"][1]; xmax = jointDepths["ShoulderLeft"][1]; ymax = jointDepths["ShoulderCenter"][2]; ymin = jointDepths["Spine"][2]; zmin = pc.getzMin(); zmax = pc.getzMax(); bounds = new double[] { xmin, ymin, zmin, xmax, ymax, zmax }; //translate bounds according to pointcloud data points System.Diagnostics.Debug.WriteLine("Bounds:" + xmin + ", " + ymin + ", " + zmin + ", " + xmax + ", " + ymax + ", " + zmax); premodifier = ChestFactor; break; case 5: //WAIST(5) xmin = jointDepths["HipRight"][1]; xmax = jointDepths["HipLeft"][1]; ymax = jointDepths["HipCenter"][2]; ymin = jointDepths["HipLeft"][2]; zmin = pc.getzMin(); zmax = pc.getzMax(); bounds = new double[] { xmin, ymin, zmin, xmax, ymax, zmax }; //translate bounds according to pointcloud data points System.Diagnostics.Debug.WriteLine("Bounds:" + xmin + ", " + ymin + ", " + zmin + ", " + xmax + ", " + ymax + ", " + zmax); premodifier = WaistFactor; break; case 6: //LEFT_LEG(6) xmin = jointDepths["HipCenter"][1]; xmax = jointDepths["HipLeft"][1]; ymax = jointDepths["HipLeft"][2]; ymin = jointDepths["KneeLeft"][2]; zmin = pc.getzMin(); zmax = pc.getzMax(); bounds = new double[] { xmin, ymin, zmin, xmax, ymax, zmax }; //translate bounds according to pointcloud data points System.Diagnostics.Debug.WriteLine("Bounds:" + xmin + ", " + ymin + ", " + zmin + ", " + xmax + ", " + ymax + ", " + zmax); premodifier = LegFactorL; break; case 7: //RIGHT_LEG(7) xmin = jointDepths["HipRight"][1]; xmax = jointDepths["HipCenter"][1]; ymax = jointDepths["HipRight"][2]; ymin = jointDepths["KneeRight"][2]; zmin = pc.getzMin(); zmax = pc.getzMax(); bounds = new double[] { xmin, ymin, zmin, xmax, ymax, zmax }; //translate bounds according to pointcloud data points System.Diagnostics.Debug.WriteLine("Bounds:" + xmin + ", " + ymin + ", " + zmin + ", " + xmax + ", " + ymax + ", " + zmax); premodifier = LegFactorR; break; default: break; } try { //Calculate circumference segmentedPointcloud = pc.getSubRegion(bounds); T = PlanePuller.pullAll(segmentedPointcloud, 2); finalCircum = CircumferenceCalculator.calculate(T.Item1, 1); numPlanes = UnitConvertor.convertPCM(T.Item2, 1); //Premodify the circumference calculation with the fudge factors. Convert into CM from M. finalCircum = Math.Round(finalCircum * 100, 5); finalCircum = premodifier * finalCircum; } catch (Exception err) { System.Diagnostics.Debug.WriteLine("(Subregion): Subregion issue - " + err.ToString()); } //results printed out before historyloader so we can inspect all is well System.Diagnostics.Debug.WriteLine("***Limb Circumference Results***"); System.Diagnostics.Debug.WriteLine("Limb chosen: " + limb); System.Diagnostics.Debug.WriteLine("Circumference approx: " + finalCircum); System.Diagnostics.Debug.WriteLine("Number of planes: " + numPlanes); return(new Tuple <double, double, List <List <Point3D> > >(finalCircum, numPlanes, T.Item1)); }