本文共 1139 字,大约阅读时间需要 3 分钟。
#include#include #define EPS 1e-6using namespace std;typedef struct Point{ int x, y; Point(int xx, int yy):x(xx), y(yy){}}point;bool isZero(double x){ return (x <= EPS && x >= -EPS);}//叉积判断 OB相对 OA方向 如果为正 则 OB在OA逆时针方向 为负在顺时针方向 int cross(const point &O, const point &A, const point &B){ int xoa = A.x - O.x; int xob = B.x - O.x; int yoa = A.y - O.y; int yob = B.y - O.y; return xoa*yob - xob*yoa;}//点积为0,两向量垂直;为正,锐角;为负,钝角。仿照叉积,点积的实现如下: int dot(const point &O, const point &A, const point &B){ int xoa = A.x - O.x; int xob = B.x - O.x; int yoa = A.y - O.y; int yob = B.y - O.y; return xoa*xob + yoa*yob;}//判断两条线段是否相交 跨立 + 叉积 bool isInter(point A, point B, point C, point D){ return max(A.x,B.x) >= min(C.x, D.x) &&max(C.x, D.x) >= min(A.x, B.x) &&max(A.y, B.y) >= min(C.y, D.y) &&max(C.y, D.y) >= min(A.y, B.y) &&cross(A,B,C)*cross(A,B,D) <= 0 &&cross(C,D,A)*cross(C,D,B) <= 0 ; }int main() { //cout << isZero(1e-7); point o(0,0); point a(1,1); point b(1,3); point c(2,1); point d(3,5);// cout << cross(o,a,b); // cout < << dot(o,a,b); cout << isInter(a,b,c,d); return 0; }
参考 :
转载地址:http://lmimi.baihongyu.com/