计算几何初步

来源:互联网 发布:微交易一分钟k线数据 编辑:程序博客网 时间:2024/05/19 13:17


#include<iostream>#include<algorithm>#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 <<endl << dot(o,a,b);cout << isInter(a,b,c,d); return 0;} 

参考 :点击打开链接