electronicFence.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. #include "electronicFence.h"
  2. //----------------param
  3. // 定义多边形的经纬度坐标集合
  4. double polygonLat[REC_COORDINATE_DEPTH] = {0};
  5. double polygonLng[REC_COORDINATE_DEPTH] = {0};
  6. ///**
  7. //* 是否有 横断<br/> 参数为四个点的坐标
  8. //*
  9. //* @param px1
  10. //* @param py1
  11. //* @param px2
  12. //* @param py2
  13. //* @param px3
  14. //* @param py3
  15. //* @param px4
  16. //* @param py4
  17. //* @return
  18. //*/
  19. //static bool isIntersect(double px1, double py1, double px2, double py2,
  20. // double px3, double py3, double px4, double py4) {
  21. // bool flag = false;
  22. // double d = (px2 - px1) * (py4 - py3) - (py2 - py1) * (px4 - px3);
  23. // if (d != 0) {
  24. // double r = ((py1 - py3) * (px4 - px3) - (px1 - px3) * (py4 - py3)) / d;
  25. // double s = ((py1 - py3) * (px2 - px1) - (px1 - px3) * (py2 - py1)) / d;
  26. // if ((r >= 0) && (r <= 1) && (s >= 0) && (s <= 1)) {
  27. // flag = true;
  28. // }
  29. // }
  30. // return flag;
  31. //}
  32. //
  33. //static double Multiply(double px0, double py0, double px1, double py1,
  34. // double px2, double py2) {
  35. // return ((px1 - px0) * (py2 - py0) - (px2 - px0) * (py1 - py0));
  36. //}
  37. //
  38. ///**
  39. //* 目标点是否在目标边上边上<br/>
  40. //*
  41. //* @param px0
  42. //* 目标点的经度坐标
  43. //* @param py0
  44. //* 目标点的纬度坐标
  45. //* @param px1
  46. //* 目标线的起点(终点)经度坐标
  47. //* @param py1
  48. //* 目标线的起点(终点)纬度坐标
  49. //* @param px2
  50. //* 目标线的终点(起点)经度坐标
  51. //* @param py2
  52. //* 目标线的终点(起点)纬度坐标
  53. //* @return
  54. //*/
  55. //static bool isPointOnLine(double px0, double py0, double px1,
  56. // double py1, double px2, double py2) {
  57. // bool flag = false;
  58. // double ESP = 1e-9;
  59. // if ((fabs(Multiply(px0, py0, px1, py1, px2, py2)) < ESP)
  60. // && ((px0 - px1) * (px0 - px2) <= 0)
  61. // && ((py0 - py1) * (py0 - py2) <= 0)) {
  62. // flag = true;
  63. // }
  64. // return flag;
  65. //}
  66. //
  67. //
  68. ///**
  69. //* 判断目标点是否在多边形内(由多个点组成)<br/>
  70. //*
  71. //* @param px
  72. //* 目标点的经度坐标
  73. //* @param py
  74. //* 目标点的纬度坐标
  75. //* @param polygonXA
  76. //* 多边形的经度坐标集合
  77. //* @param polygonYA
  78. //* 多边形的纬度坐标集合
  79. //* @param num
  80. //* 多边形的坐标集个数
  81. //* @return
  82. //*/
  83. //bool isPointInPolygon(double px, double py,
  84. // double polygonXA[], double polygonYA[], int num) {
  85. // bool isInside = false;
  86. // double ESP = 1e-9;
  87. // int count = 0;
  88. // double linePoint1x;
  89. // double linePoint1y;
  90. // double linePoint2x = 180;
  91. // double linePoint2y;
  92. //
  93. // linePoint1x = px;
  94. // linePoint1y = py;
  95. // linePoint2y = py;
  96. //
  97. //
  98. // for (int i = 0; i < num; i++) {
  99. // double cx1 = polygonXA[i];
  100. // double cy1 = polygonYA[i];
  101. // double cx2 = polygonXA[i + 1];
  102. // double cy2 = polygonYA[i + 1];
  103. // if (isPointOnLine(px, py, cx1, cy1, cx2, cy2)) {
  104. // return true;
  105. // }
  106. // if (fabs(cy2 - cy1) < ESP) {
  107. // continue;
  108. // }
  109. // if (isPointOnLine(cx1, cy1, linePoint1x, linePoint1y, linePoint2x,
  110. // linePoint2y)) {
  111. // if (cy1 > cy2)
  112. // count++;
  113. // }
  114. // else if (isPointOnLine(cx2, cy2, linePoint1x, linePoint1y,
  115. // linePoint2x, linePoint2y)) {
  116. // if (cy2 > cy1)
  117. // count++;
  118. // }
  119. // else if (isIntersect(cx1, cy1, cx2, cy2, linePoint1x, linePoint1y,
  120. // linePoint2x, linePoint2y)) {
  121. // count++;
  122. // }
  123. // }
  124. // if (count % 2 == 1) {
  125. // isInside = true;
  126. // }
  127. //
  128. // return isInside;
  129. //}
  130. // 判断两条线段是否相交
  131. int segmentsIntersect(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) {
  132. double d1, d2, d3, d4;
  133. d1 = (x1 - x2) * (y3 - y1) - (y1 - y2) * (x3 - x1);
  134. d2 = (x1 - x2) * (y4 - y1) - (y1 - y2) * (x4 - x1);
  135. d3 = (x3 - x4) * (y1 - y3) - (y3 - y4) * (x1 - x3);
  136. d4 = (x3 - x4) * (y2 - y3) - (y3 - y4) * (x2 - x3);
  137. return ((d1 * d2 <= 0.0) && (d3 * d4 <= 0.0));
  138. }
  139. // 判断点是否在多边形内部
  140. int pointInPolygon(double pointLat, double pointLng, double polygonLat[], double polygonLng[], int numPoints) {
  141. int i, j, c = 0;
  142. for (i = 0, j = numPoints - 1; i < numPoints; j = i++) {
  143. if ((polygonLat[i] > pointLat) != (polygonLat[j] > pointLat) &&
  144. pointLng < (polygonLng[j] - polygonLng[i]) * (pointLat - polygonLat[i]) / (polygonLat[j] - polygonLat[i]) + polygonLng[i]) {
  145. c = !c;
  146. }
  147. }
  148. return c;
  149. }