点和线段、线段和线段的关系

来源:互联网 发布:网络兼职执业药师 编辑:程序博客网 时间:2024/04/28 03:51

这篇文章还不错 : http://blog.csdn.net/william001zs/article/details/6213485 

1、Onseg() 判断点是否在线段上。

2、Dis() 求点到线段的距离。

3、Meet() 判断两条线段是否相交。

#include <math.h>#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;#define N 105const double eps = 1e-6;const double Pi = acos(-1.0);struct Point{    double x,y;};struct Seg{    Point l1,l2;};int sgn(double x){    return x<-eps ? -1 : (x>eps);}double Cross(const Point& p1,const Point& p2,const Point& p3,const Point& p4){    return (p2.x-p1.x)*(p4.y-p3.y) - (p2.y-p1.y)*(p4.x-p3.x);}double Dot(const Point& p1,const Point& p2,const Point& p3,const Point& p4){    return (p2.x-p1.x)*(p4.x-p3.x) + (p2.y-p1.y)*(p4.y-p3.y);}double Area(const Point& p1,const Point& p2,const Point& p3){    return Cross(p1,p2,p1,p3);}double Dis(const Point& p1,const Point& p2){    return sqrt( 1.0*(p1.x-p2.x)*(p1.x-p2.x) + (p1.y-p2.y)*(p1.y-p2.y) );}double Dis(const Point& p,const Point& l1,const Point& l2){    return fabs(Area(p,l1,l2)) / Dis(l1,l2);}bool InRec(const Point& p,const Point& l1,const Point& l2){    return p.x >= min(l1.x,l2.x) && p.x <= max(l1.x,l2.x)        && p.y >= min(l1.y,l2.y) && p.y <= max(l1.y,l2.y);}bool OnLine(const Point& p,const Point& p1,const Point& p2){    return sgn(Cross(p,p1,p,p2)) == 0;}bool OnSeg(const Point& p,const Point& l1,const Point& l2){    return OnLine(p,l1,l2) && InRec(p,l1,l2);}bool Meet(const Point& p1,const Point& p2,const Point& p3,const Point& p4){    return max(min(p1.x,p2.x),min(p3.x,p4.x)) <= min(max(p1.x,p2.x),max(p3.x,p4.x))        && max(min(p1.y,p2.y),min(p3.y,p4.y)) <= min(max(p1.y,p2.y),max(p3.y,p4.y))        && sgn(Cross(p3,p2,p3,p4) * Cross(p3,p4,p3,p1)) >= 0        && sgn(Cross(p1,p4,p1,p2) * Cross(p1,p2,p1,p3)) >= 0;}