bool SameSide( XPOINT a, XPOINT b, LINESEG l ) { __int64 dx = a.x - b.x; __int64 dy = a.y - b.y; __int64 dx0 = l.start.x - a.x; __int64 dy0 = l.start.y - a.y; __int64 dx1 = l.end.x - b.x; __int64 dy1 = l.end.y - b.y; __int64 result = (dx * dy0 - dy * dx0) * (dx * dy1 - dy * dx1); if ( result > 0 ) { return true; } return false; } bool ExitPot( LINESEG l, LINESEG n ) { int x0 = l.start.x; int y0 = l.start.y; int x1 = n.start.x; int y1 = n.start.y; int a = l.end.x - x0; int b = l.end.y - y0; //=0 int c = n.end.x - x1; //=0 int d = n.end.y - y1; if ( (b * c - a * d) == 0 ) { return false; } int x = (a * c * (y1 - y0) - a * d * x1 + b * c * x0) / (b * c - a * d); if ( (x >= l.start.x && x <= l.end.x) || (x >= l.end.x && x <= l.start.x) ) { return true; } return false; } bool Intersect( XPOINT* pA, int sizeA, XPOINT* pB, int sizeB ) { if ( pA == NULL || pB == NULL) { return false; } XPOINT pt1Start; XPOINT pt1End; XPOINT pt2Start; XPOINT pt2End; pt1Start = *pA; for (int i = 1; i < sizeA; ++i) { pt1End = *(pA+i); pt2Start = *pB; for (int j = 1; j < sizeB; ++j) { pt2End = *(pB+j); LINESEG l ; l.start = pt1Start; l.end = pt1End; LINESEG n ; n.start = pt2Start; n.end = pt2End; if ( !SameSide(pt1Start, pt1End, n) && !SameSide(pt2Start, pt2End, l) ) { if ( ExitPot(l, n) ) { return true; } } pt2Start = *(pB+j); } pt1Start = *(pA+i); } return false; } double MinDistance( XPOINT* pA, int sizeA, XPOINT* pB, int sizeB ) { XPOINT p; XPOINT a; XPOINT b; double mindist = 1e100; { for (int i = 0; i < sizeA; ++i) { p = *(pA+i); a = *pB; for (int j = 1; i < sizeB; ++j) { b = *(pB+j); LINESEG l ; l.start = a; l.end = b; double dist = 0; PTOLINESEGDIS(p, l, dist); if (dist < mindist) { mindist = dist; } a = b; } } } { for (int i = 0; i < sizeB; ++i) { p = *(pB+i); a = *pA; for (int j = 1; j < sizeA; ++j) { b = *(pA+j); LINESEG l; l.start = a; l.end = b; double dist = 0; PTOLINESEGDIS(p, l, dist); if (dist < mindist) { mindist = dist; } a = b; } } } return mindist; } bool PointInRegion( XPOINT p, XPOINT* l, int size ) { if (l == NULL || size < 3) { return false; } int xMin = (*l).x; int yMin = (*l).y; int xMax = (*l).x; int yMax = (*l).y; for (int i = 1; i < size; ++i) { if ( (*(l+i)).x < xMin ) xMin = (*(l+i)).x; if ( (*(l+i)).y < yMin ) yMin = (*(l+i)).y; if ( (*(l+i)).x > xMax ) xMax = (*(l+i)).x; if ( (*(l+i)).y > yMax ) yMax = (*(l+i)).y; } if ( (p.x < xMin) || (p.x > xMax) || (p.y < yMin) || (p.y > yMax) ) { return FALSE; } XPOINT pt_e; pt_e.x = xMax + 100; pt_e.y = p.y; XPOINT a = (*l); int c = 0; for (int j = 1; j < size; ++j) { XPOINT b = *(l+j); LINESEG m; m.start = p; m.end = pt_e; LINESEG n; n.start = a; n.end = b; if ( !SameSide(p, pt_e, n) && !SameSide(a, b, m) ) { c += 1; } } return (c % 2); }