您的位置:首页 > 其它

二维几何基础模板(二)

2014-09-28 16:16 295 查看

一、直线交点

Point GetLineIntersection(Point P,Vector v,Point Q,Vector w)
{
    Vector u=P-Q;
    double t=Cross(w,u)/Cross(v,w);
    return P+v*t;
}


二、点到直线的距离

double DistanceToLine(Point P,Point A,PointB)
{
    Vector v1=B-A,v2=P-A;
    return fabs(Cross(v1,v2))/length(v1);
}


三、 点到线段的距离

double DistanceToSegment(Point P,Point A,Point B)
{
    if(A==B)
        return Length(P-A);
    Vector v1=B-A,v2=P-A,v3=P-B;
    if(dcmp(Dot(v1,v2))<0)
        return Length(v2);
    else if(dcmp(Dot(v1,v3))>0)
        return Length(v3);
    else
        return fabs(Cross(v1,v2))/Length(v1);
}


四、点在直线上的投影

PointGetLineProjection(Point P,Point A,Poiny B)
{
    Vector v=B-A;
    return A+v*(Dot(v,P-A)/Dot(v,v));
}


五、线段相交判断

//两线段恰好有一个公共点,且不在任何一条线段的端点。
//线段规范相交的充分条件是:每条线段的两个端点都在另一条线段的两侧
bool SegmentProperIntersection(Point a1,Point a2,Point b1,Point b2)
{
    double c1=Cross(a2-a1,b1-a1),c2=Corss(a2-a1,b2-a1),
    c3=Cross(b2-b1,a1-b1),c4=Cross(b2-b1,a2-b1);
    return dcmp(c1)*dcmp(c2)<0&&dcmp(c3)*dcmp(c4)<0;
}
//如果允许在端点处相交,则还需要判断一个点是否在一条线段上(不包含端点)
bool Onsegment(Point p,Point a1,Point a2)
{
    return dcmp(Cross(a1-p,a2-p))==0&&dcmp(Dot(a1-p,a2-p))<0;
}


六、多边形面积

//如果是凸边形,可以从第一个顶点出发吧凸边形分成n-2个三角形
//非凸多边形也是一样的原理
double ConvexPolygonArea(Point* p,int n)
{
    double area=0;
    for(int i=1;i<n-1;i++)
        area+=Cross(P[i]-p[0],p[i+1]-p[0]);
    return area/2;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: