2013-team5/geometry
从 Trac 迁移的文章
这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。
原文章内容如下:
{{{
#include <cmath>
using namespace std;
const double EPS = 1e-8;
struct point
{
double x, y;
point(){}
point(double xx, double yy) : x(xx), y(yy){}
}p[maxN];
struct seg
{
point p1, p2;
seg(){}
seg(point pp1, point pp2) : p1(pp1), p2(pp2) {}
seg(double x1, double y1, double x2, double y2) : p1(point(x1, y1)), p2(point(x2, y2)) {}
};
double dist(point p1, point p2)
{
return sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
}
double crossA(point p1, point p2)
{
return (p1.x * p2.y - p2.x * p1.y);
}
double crossB(point p1, point p2, point P)
{
return (p1.x - P.x) * (p2.y - P.y) - (p2.x - P.x) * (p1.y - P.y);
}
bool check_seg(seg L1, seg L2) //线段相交
{
return max(L1.p1.x, L1.p2.x) >= min(L2.p1.x, L2.p2.x) &&
max(L1.p1.y, L1.p2.y) >= min(L2.p1.y, L2.p2.y) &&
max(L2.p1.x, L2.p2.x) >= min(L1.p1.x, L1.p2.x) &&
max(L2.p1.y, L2.p2.y) >= min(L1.p1.y, L1.p2.y) &&
crossB(L1.p1, L2.p2, L2.p1) * crossB(L2.p2, L1.p2, L2.p1) >= 0 &&
crossB(L2.p1, L1.p2, L1.p1) * crossB(L1.p2, L2.p2, L1.p1) >= 0;
}
bool PIS(point P, seg L) //判断点是否在直线上
{
if (P.x > max(L.p1.x, L.p2.x)) return 0;
if (P.x < min(L.p1.x, L.p2.x)) return 0;
if (P.y > max(L.p1.y, L.p2.y)) return 0;
if (P.y < min(L.p1.y, L.p2.y)) return 0;
return fabs(crossB(L.p1, L.p2, P)) < EPS;
}
}}}
#include <cmath>
using namespace std;
const double EPS = 1e-8;
struct point
{
double x, y;
point(){}
point(double xx, double yy) : x(xx), y(yy){}
}p[maxN];
struct seg
{
point p1, p2;
seg(){}
seg(point pp1, point pp2) : p1(pp1), p2(pp2) {}
seg(double x1, double y1, double x2, double y2) : p1(point(x1, y1)), p2(point(x2, y2)) {}
};
double dist(point p1, point p2)
{
return sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
}
double crossA(point p1, point p2)
{
return (p1.x * p2.y - p2.x * p1.y);
}
double crossB(point p1, point p2, point P)
{
return (p1.x - P.x) * (p2.y - P.y) - (p2.x - P.x) * (p1.y - P.y);
}
bool check_seg(seg L1, seg L2) //线段相交
{
return max(L1.p1.x, L1.p2.x) >= min(L2.p1.x, L2.p2.x) &&
max(L1.p1.y, L1.p2.y) >= min(L2.p1.y, L2.p2.y) &&
max(L2.p1.x, L2.p2.x) >= min(L1.p1.x, L1.p2.x) &&
max(L2.p1.y, L2.p2.y) >= min(L1.p1.y, L1.p2.y) &&
crossB(L1.p1, L2.p2, L2.p1) * crossB(L2.p2, L1.p2, L2.p1) >= 0 &&
crossB(L2.p1, L1.p2, L1.p1) * crossB(L1.p2, L2.p2, L1.p1) >= 0;
}
bool PIS(point P, seg L) //判断点是否在直线上
{
if (P.x > max(L.p1.x, L.p2.x)) return 0;
if (P.x < min(L.p1.x, L.p2.x)) return 0;
if (P.y > max(L.p1.y, L.p2.y)) return 0;
if (P.y < min(L.p1.y, L.p2.y)) return 0;
return fabs(crossB(L.p1, L.p2, P)) < EPS;
}