计算几何模板

来源:互联网 发布:淘宝服装图片拍摄 编辑:程序博客网 时间:2024/06/17 20:34
#include <bits/stdc++.h>
using namespace std;
#define EPS 1e-10


double add(double a,double b)
{
    if(abs(a+b)<EPS*(abs(a)+abs(b))) return 0;
    return a+b;
}
struct P
{
    double x,y;
    P(){}
    P(double x,double y): x(x),y(y){}
    P operator +(P p) {
        return P(add(x,p.x),add(y,p.y));
    }
    P operator -(P p) {
    return P(add(x,-p.x),add(y,-p.y));
    }
    P operator *(double d) {
        return P(x*d,y*d);
    }
    P operator /(double d) {
        return P(x/d,y/d);
    }
    bool operator == (P p) { //判断两个向量是否相等;
    return x==p.x&&y==p.y;
}
    double dot(P p) { //向量内积,内积等于0表示两条实现垂直
        return add(x*p.x,y*p.y);
    }
    double det(P p) { //向量叉积,外积等于0表示在一条直线上
        return add(x*p.y,-y*p.x);
    }
}p[500];
bool on_seg(P p1,P p2,P q)//判断点q是否在线段p1,p2上
{
    return (p1-q).det(p2-q)==0&&(p1-q).dot(p2-q)<=0;
}
P intersection(P p1,P p2,P q1,P q2)//计算直线p1-p2与q1-q2的交点
{
    return p1+(p2-p1)*((q2-q1).det(q1-p1)/(q2-q1).det(p2-p1));
}
double length(P a) { return sqrt(a.dot(a)); }    //求向量长度
double angle(P a, P b) {return acos(a.dot(b)/length(a)/length(b));}//求向量之间的夹角
double area3(P a, P b, P c) { return (b-a).det(c-a); } //求三角形面积
P Rotate(P a, double rad) {//rad是弧度,返回向量a旋转rad度后的向量
    return P(a.x*cos(rad)-a.y*sin(rad), a.x*sin(rad)+a.y*cos(rad));
}
P normal(P a) { //向量单位法向量,调用前请确保a不是零向量
    double l=length(a);
    return P(-a.y/l, a.x/l);
}
//点p到直线ab的距离
double DistanceToLine(P p, P a, P b) {
    P v1 = b-a,v2 =p-a;
    return fabs(v1.det(v2) / length(v1));  //如果不取绝对值,得到的是有向距离
}
int dcmp(double x) {   //判断x是正负0
    if(fabs(x)<EPS) return 0; else return x < 0 ? -1 : 1;
}
//点p到线段ab距离
double DistanceToSegment(P p, P a, P b) {
    if(a==b) return length(p-a);
    P v1 = b-a,v2=p-a, v3 = p-b;
    if(dcmp(v1.dot(v2))<0) return length(v2);
    else if(dcmp(v1.dot(v3))>0) return length(v3);
    else return fabs(v1.det(v2)) / length(v1);
}
P GetLineProjection(P p, P a, P b) {//点P在a,b上的投影
    P v =b-a;
    return a+v*(v.dot(p-a)/v.dot(v));
}
//线段相交判定
bool SegmentProperIntersection(P a1, P a2, P b1, P b2) {
    double c1=(a2-a1).det(b1-a1), c2=(a2 - a1).det( b2 - a1),
            c3 = (b2 - b1).det( a1 - b1), c4 = (b2 - b1).det( a2 - b1);
    return dcmp(c1) * dcmp(c2) < 0 && dcmp(c3) * dcmp(c4) < 0;
}
double ConvexPolygonArea(P* p, int n) {
    double area = 0;
    for(int i = 1; i < n-1; i++)
        area+=(p[i]-p[0]).det(p[i + 1]-p[0]);
    return area / 2;
}




int main()
{
    return 0;
}
0 0
原创粉丝点击