private static SurveyPointTransformer GetTransformer(SurveyDescriptor descriptor) { var ellipsoid = descriptor.FittingEllipsoid; var hardIron = new Vector3D( ellipsoid.Center.X, ellipsoid.Center.Y, ellipsoid.Center.Z); var softIron = descriptor.FittingEllipsoid.InverseTransform; return(new SurveyPointTransformer(hardIron, softIron)); }
private static SurveyDescriptor GetDescriptor(SurveyPoint[] surveyPoints) { var fittingAlgorithm = new AlgebraicEllipsoidFittingAlgorithm(); var pointsToFit = new Point3D[surveyPoints.Length]; Parallel.For(0, surveyPoints.Length, i => { pointsToFit[i] = surveyPoints[i].CalibrationPoint; }); var fittingEllipsoid = fittingAlgorithm.Fit(pointsToFit); if (fittingEllipsoid == null) { return(null); } var result = new SurveyDescriptor { Radius = new Point3D( fittingEllipsoid.XRadius, fittingEllipsoid.YRadius, fittingEllipsoid.ZRadius), Center = fittingEllipsoid.Center, Count = surveyPoints.Length, Sphericity = fittingEllipsoid.MinRadius / fittingEllipsoid.MaxRadius, FittingEllipsoid = fittingEllipsoid }; var totalOnTheSurface = 0; for (var i = 0; i < pointsToFit.Length; ++i) { if (fittingEllipsoid.Contains(pointsToFit[i], SurveyDoubleUtils.Tolerance)) { ++totalOnTheSurface; } } result.QualityOfFit = 1.0 * totalOnTheSurface / surveyPoints.Length; return(result); }