模版,注意使用int可能在求叉乘的过程中溢出,解决办法:使用double(使用int在在返回时只返回符号有时也可以);
使用double的:
# include <cmath> const double eps = 1e-8; struct Point{double x, y;} ; int dcmp(double x) { if (fabs(x) < eps) return 0; return x>0 ? 1:-1; } int direction(Point p1, Point p2, Point p3) { double tmp = (p3.x-p1.x)*(p2.y-p1.y) - (p2.x-p1.x)*(p3.y-p1.y); return dcmp(tmp); } char isCross(Point p1, Point p2, Point p3, Point p4) { int d1 = direction(p3, p4, p1); int d2 = direction(p3, p4, p2); int d3 = direction(p1, p2, p3); int d4 = direction(p1, p2, p4); if (d1*d2 < 0 && d3*d4 < 0) return 1; return 0; }
使用int返回符号的:
struct Point{int x, y;} ; int direction(Point p1, Point p2, Point p3) { int tmp = (p3.x-p1.x)*(p2.y-p1.y) - (p2.x-p1.x)*(p3.y-p1.y); if (tmp == 0) return 0; return tmp>0 ? 1:-1; } char isCross(Point p1, Point p2, Point p3, Point p4) { int d1 = direction(p3, p4, p1); int d2 = direction(p3, p4, p2); int d3 = direction(p1, p2, p3); int d4 = direction(p1, p2, p4); if (d1*d2 < 0 && d3*d4 < 0) return 1; return 0; }