MagJsonConvert.cs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using o0._9Axis;
  5. using Newtonsoft.Json;
  6. using Newtonsoft.Json.Linq;
  7. using MathNet.Numerics.LinearAlgebra;
  8. public class MagJsonConvert
  9. {
  10. public static MagnetometerAutoCalibrater Parse(string jsonStr)
  11. {
  12. JObject jo = JObject.Parse(jsonStr);
  13. jo.Remove("Complete");
  14. JToken jt_e = jo.GetValue("EllipsoidFitting");
  15. jo.Remove("EllipsoidFitting");
  16. JToken jt_v = jo.GetValue("VectorByBlock");
  17. jo.Remove("VectorByBlock");
  18. int FitCountLeft = jo.GetValue("FitCountLeft").Value<int>();
  19. jo.Remove("FitCountLeft");
  20. MagnetometerAutoCalibrater calibrater = jo.ToObject<MagnetometerAutoCalibrater>();
  21. calibrater.FitCountLeft = FitCountLeft;
  22. calibrater.EllipsoidFitting = ToEllipsoidFitting(jt_e);
  23. foreach (JProperty item in jt_v)
  24. {
  25. calibrater.VectorByBlock[ToVectorInt(JArray.Parse(item.Name))] = ToVectorDouble(item.Value as JArray);
  26. }
  27. return calibrater;
  28. }
  29. public static string ToJson(MagnetometerAutoCalibrater calibrater)
  30. {
  31. return JsonConvert.SerializeObject(calibrater);
  32. }
  33. private static EllipsoidFitting ToEllipsoidFitting(JToken jToken)
  34. {
  35. var Center = ToVectorDouble(jToken["Center"] as JArray);
  36. var CorrectMatrix = ToMatrixDouble(jToken["CorrectMatrixArray"] as JArray);
  37. var Radius = ToVectorDouble(jToken["Radius"] as JArray);
  38. return new EllipsoidFitting(Center, CorrectMatrix, Radius);
  39. }
  40. private static Matrix<double> ToMatrixDouble(JArray arr)
  41. {
  42. int rcCount = arr.Count;
  43. Matrix<double> matrix = CreateMatrix.Dense<double>(rcCount, rcCount);
  44. for (var i = 0; i < rcCount; ++i)
  45. for (var j = 0; j < rcCount; ++j)
  46. matrix[i, j] = arr[i][j].Value<double>();
  47. return matrix;
  48. }
  49. private static o0.Geometry.Vector<double> ToVectorDouble(JArray arr)
  50. {
  51. return new o0.Geometry.Vector<double>(
  52. arr[0].Value<double>(), arr[1].Value<double>(), arr[2].Value<double>());
  53. }
  54. private static o0.Geometry.Vector<int> ToVectorInt(JArray arr)
  55. {
  56. return new o0.Geometry.Vector<int>(
  57. arr[0].Value<int>(), arr[1].Value<int>(), arr[2].Value<int>());
  58. }
  59. }