CSlopFocusParam.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. using OTSDataType;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Drawing;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using System.Xml;
  9. namespace OTSMeasureApp._0_OTSModel.OTSDataType
  10. {
  11. public struct SpacePoint
  12. {
  13. public SpacePoint(double x, double y, double z)
  14. {
  15. this.x = x;
  16. this.y = y;
  17. this.z = z;
  18. }
  19. public double x;
  20. public double y;
  21. public double z;
  22. }
  23. public struct Vec3
  24. {
  25. public double a;
  26. public double b;
  27. public double c;
  28. }
  29. public class CSlopFocusParam : ISlo
  30. {
  31. private bool m_IsUsingSlopParam=false;
  32. private Point m_FirstPoint;
  33. private double m_FirstWD=0;
  34. private Point m_SecondPoint;
  35. private double m_SecondWD=0;
  36. private Point m_ThirdPoint;
  37. private double m_ThirdWD=0;
  38. public bool IsUsingSlopParam { get => m_IsUsingSlopParam; set => m_IsUsingSlopParam = value; }
  39. public Point FirstPoint { get => m_FirstPoint; set => m_FirstPoint = value; }
  40. public double FirstWD { get => m_FirstWD; set => m_FirstWD = value; }
  41. public Point SecondPoint { get => m_SecondPoint; set => m_SecondPoint = value; }
  42. public double SecondWD { get => m_SecondWD; set => m_SecondWD = value; }
  43. public Point ThirdPoint { get => m_ThirdPoint; set => m_ThirdPoint = value; }
  44. public double ThirdWD { get => m_ThirdWD; set => m_ThirdWD = value; }
  45. public double GetWD(PointF currentPoint)
  46. {
  47. double a=0, b=0, c=0, d=0;
  48. SpacePoint p1 = new SpacePoint(FirstPoint.X,FirstPoint.Y,FirstWD);
  49. SpacePoint p2 = new SpacePoint(SecondPoint.X, SecondPoint.Y, SecondWD);
  50. SpacePoint p3 = new SpacePoint(ThirdPoint.X, ThirdPoint.Y, ThirdWD);
  51. get_panel(p1, p2, p3,ref a,ref b,ref c, ref d);
  52. double wd;
  53. wd = ((0 - d) - (a * currentPoint.X + b * currentPoint.Y)) / c;
  54. return wd;
  55. }
  56. //已知3点坐标,求平面ax+by+cz+d=0;
  57. void get_panel(SpacePoint p1, SpacePoint p2, SpacePoint p3, ref double a, ref double b, ref double c, ref double d)
  58. {
  59. a = (p2.y - p1.y) * (p3.z - p1.z) - (p2.z - p1.z) * (p3.y - p1.y);
  60. b = (p2.z - p1.z) * (p3.x - p1.x) - (p2.x - p1.x) * (p3.z - p1.z);
  61. c = (p2.x - p1.x) * (p3.y - p1.y) - (p2.y - p1.y) * (p3.x - p1.x);
  62. d = 0 - (a * p1.x + b * p1.y + c * p1.z);
  63. }
  64. // 已知三点坐标,求法向量
  65. Vec3 get_Normal(SpacePoint p1, SpacePoint p2, SpacePoint p3)
  66. {
  67. double a, b, c;
  68. a = (p2.y - p1.y) * (p3.z - p1.z) - (p2.z - p1.z) * (p3.y - p1.y);
  69. b = (p2.z - p1.z) * (p3.x - p1.x) - (p2.x - p1.x) * (p3.z - p1.z);
  70. c = (p2.x - p1.x) * (p3.y - p1.y) - (p2.y - p1.y) * (p3.x - p1.x);
  71. Vec3 v= new Vec3();
  72. v.a = a;
  73. v.b = b;
  74. v.c = c;
  75. return v;
  76. }
  77. //点到平面距离
  78. double dis_pt2panel(SpacePoint pt, double a, double b, double c, double d)
  79. {
  80. return Math.Abs(a * pt.x + b * pt.y + c * pt.z + d) / Math.Sqrt(a * a + b * b + c * c);
  81. }
  82. public override void Serialize(bool isStoring, XmlDocument classDoc, XmlNode rootNode)
  83. {
  84. xBool xtoRun = new xBool();
  85. xInt xX1 = new xInt();
  86. xInt xY1 = new xInt();
  87. xInt xX2 = new xInt();
  88. xInt xY2 = new xInt();
  89. xInt xX3 = new xInt();
  90. xInt xY3 = new xInt();
  91. xDouble xWD1 = new xDouble();
  92. xDouble xWD2 = new xDouble();
  93. xDouble xWD3 = new xDouble();
  94. Slo slo = new Slo();
  95. slo.Register("toRun",xtoRun);
  96. slo.Register("X1", xX1);
  97. slo.Register("Y1", xY1);
  98. slo.Register("X2", xX2);
  99. slo.Register("Y2", xY2);
  100. slo.Register("X3", xX3);
  101. slo.Register("Y3", xY3);
  102. slo.Register("WD1", xWD1);
  103. slo.Register("WD2", xWD2);
  104. slo.Register("WD3", xWD3);
  105. if (isStoring)
  106. {
  107. xtoRun.AssignValue(IsUsingSlopParam);
  108. xX1.AssignValue(FirstPoint.X);
  109. xY1.AssignValue(FirstPoint.Y);
  110. xX2.AssignValue(SecondPoint.X);
  111. xY2.AssignValue(SecondPoint.Y);
  112. xX3.AssignValue(ThirdPoint.X);
  113. xY3.AssignValue(ThirdPoint.Y);
  114. xWD1.AssignValue(FirstWD);
  115. xWD2.AssignValue(SecondWD);
  116. xWD3.AssignValue(ThirdWD);
  117. slo.Serialize(true, classDoc, rootNode);
  118. }
  119. else
  120. {
  121. slo.Serialize(false, classDoc, rootNode);
  122. IsUsingSlopParam = xtoRun.value();
  123. m_FirstPoint.X = xX1.value();
  124. m_FirstPoint.Y = xY1.value();
  125. m_SecondPoint.X = xX2.value();
  126. m_SecondPoint.Y = xY2.value();
  127. m_ThirdPoint.X = xX3.value();
  128. m_ThirdPoint.Y = xY3.value();
  129. m_FirstWD=xWD1.value();
  130. m_SecondWD=xWD2.value();
  131. m_ThirdWD=xWD3.value();
  132. }
  133. }
  134. }
  135. }