#include "electronicFence.h" //----------------param // 定义多边形的经纬度坐标集合 double polygonLat[REC_COORDINATE_DEPTH] = {0}; double polygonLng[REC_COORDINATE_DEPTH] = {0}; ///** //* 是否有 横断
参数为四个点的坐标 //* //* @param px1 //* @param py1 //* @param px2 //* @param py2 //* @param px3 //* @param py3 //* @param px4 //* @param py4 //* @return //*/ //static bool isIntersect(double px1, double py1, double px2, double py2, // double px3, double py3, double px4, double py4) { // bool flag = false; // double d = (px2 - px1) * (py4 - py3) - (py2 - py1) * (px4 - px3); // if (d != 0) { // double r = ((py1 - py3) * (px4 - px3) - (px1 - px3) * (py4 - py3)) / d; // double s = ((py1 - py3) * (px2 - px1) - (px1 - px3) * (py2 - py1)) / d; // if ((r >= 0) && (r <= 1) && (s >= 0) && (s <= 1)) { // flag = true; // } // } // return flag; //} // //static double Multiply(double px0, double py0, double px1, double py1, // double px2, double py2) { // return ((px1 - px0) * (py2 - py0) - (px2 - px0) * (py1 - py0)); //} // ///** //* 目标点是否在目标边上边上
//* //* @param px0 //* 目标点的经度坐标 //* @param py0 //* 目标点的纬度坐标 //* @param px1 //* 目标线的起点(终点)经度坐标 //* @param py1 //* 目标线的起点(终点)纬度坐标 //* @param px2 //* 目标线的终点(起点)经度坐标 //* @param py2 //* 目标线的终点(起点)纬度坐标 //* @return //*/ //static bool isPointOnLine(double px0, double py0, double px1, // double py1, double px2, double py2) { // bool flag = false; // double ESP = 1e-9; // if ((fabs(Multiply(px0, py0, px1, py1, px2, py2)) < ESP) // && ((px0 - px1) * (px0 - px2) <= 0) // && ((py0 - py1) * (py0 - py2) <= 0)) { // flag = true; // } // return flag; //} // // ///** //* 判断目标点是否在多边形内(由多个点组成)
//* //* @param px //* 目标点的经度坐标 //* @param py //* 目标点的纬度坐标 //* @param polygonXA //* 多边形的经度坐标集合 //* @param polygonYA //* 多边形的纬度坐标集合 //* @param num //* 多边形的坐标集个数 //* @return //*/ //bool isPointInPolygon(double px, double py, // double polygonXA[], double polygonYA[], int num) { // bool isInside = false; // double ESP = 1e-9; // int count = 0; // double linePoint1x; // double linePoint1y; // double linePoint2x = 180; // double linePoint2y; // // linePoint1x = px; // linePoint1y = py; // linePoint2y = py; // // // for (int i = 0; i < num; i++) { // double cx1 = polygonXA[i]; // double cy1 = polygonYA[i]; // double cx2 = polygonXA[i + 1]; // double cy2 = polygonYA[i + 1]; // if (isPointOnLine(px, py, cx1, cy1, cx2, cy2)) { // return true; // } // if (fabs(cy2 - cy1) < ESP) { // continue; // } // if (isPointOnLine(cx1, cy1, linePoint1x, linePoint1y, linePoint2x, // linePoint2y)) { // if (cy1 > cy2) // count++; // } // else if (isPointOnLine(cx2, cy2, linePoint1x, linePoint1y, // linePoint2x, linePoint2y)) { // if (cy2 > cy1) // count++; // } // else if (isIntersect(cx1, cy1, cx2, cy2, linePoint1x, linePoint1y, // linePoint2x, linePoint2y)) { // count++; // } // } // if (count % 2 == 1) { // isInside = true; // } // // return isInside; //} // 判断两条线段是否相交 int segmentsIntersect(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) { double d1, d2, d3, d4; d1 = (x1 - x2) * (y3 - y1) - (y1 - y2) * (x3 - x1); d2 = (x1 - x2) * (y4 - y1) - (y1 - y2) * (x4 - x1); d3 = (x3 - x4) * (y1 - y3) - (y3 - y4) * (x1 - x3); d4 = (x3 - x4) * (y2 - y3) - (y3 - y4) * (x2 - x3); return ((d1 * d2 <= 0.0) && (d3 * d4 <= 0.0)); } // 判断点是否在多边形内部 int pointInPolygon(double pointLat, double pointLng, double polygonLat[], double polygonLng[], int numPoints) { int i, j, c = 0; for (i = 0, j = numPoints - 1; i < numPoints; j = i++) { if ((polygonLat[i] > pointLat) != (polygonLat[j] > pointLat) && pointLng < (polygonLng[j] - polygonLng[i]) * (pointLat - polygonLat[i]) / (polygonLat[j] - polygonLat[i]) + polygonLng[i]) { c = !c; } } return c; }