二维几何问题的常用函数

来源:互联网 发布:mac上ps破解文件 编辑:程序博客网 时间:2024/05/16 10:56

二维几何问题的一些基本函数实现

#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;const double eps=1e-10;struct Point {//构造函数    double x,y;    Point (double x=0,double y=0):x(x),y(y){}};typedef Point Vector;Vector operator + (Point A,Point B)//向量+向量=向量,点+向量=点{    return Vector(A.x+B.x,A.y+B.y);}Vector operator - (Point A,Point B)//点-点=向量{    return Vector(A.x-B.x,A.y-B.y);}Vector operator * (Point A,double p)//向量*数=向量{    return Vector(A.x*p,A.y*p);}Vector operator / (Point A,double p)////向量/数=向量{    return Vector(A.x/p,A.y/p);}bool operator < (const Point & a,const Point &b){    return a.x<b.x||(a.x==b.x&&a.y<b.y);}int dcmp(double x)//三态函数{    if (fabs(x) <eps) return 0;    else return x<0?-1:1;}bool operator == (const Point &a,const Point &b)//判断相等{    return dcmp(a.x-b.x) == 0&& dcmp(a.y-b.y)==0;}double Dot (Vector A,Vector B )//点积{    return A.x*B.x+A.y*B.y;}double Length(Vector A) //向量长度{    return sqrt(Dot(A,A));}double Angle(Vector A,Vector B)//A与B的夹角{    return acos(Dot(A,B)/Length(A)/Length(B));}double Cross(Vector A,Vector B)//向量的叉积(重要){    return A.x*B.y-A.y*B.x;}double Area2(Point A,Point B,Point C)//三角形有向面积的两倍{    return Cross(B-A,C-A);}Vector Rotate(Vector A,double rad)//向量绕起点旋转{    return Vector (A.x*cos(rad)-A.y*sin(rad),A.x*sin(rad)+A.y*cos(rad));}Vector Normal (Vector A)//向量的单位法向量{    double L=Length(A);    return Vector (-A.y/L,A.x/L);}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 DistancToLine(Point P,Point A,Point B)//点到直线的距离{    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);}Point GetLineProjection(Point P,Point A,Point 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=Cross(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;}double ConvexPolygoArea(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;}int main(){    double  x1,y1,x2,y2,x3,y3,x4,y4;     cin>>x1>>y1>>x2>>y2>>x3>>y3>>x4>>y4;//读入坐标        Point A1(x1,y1);//构成点        Point A2(x2,y2);        Point A3(x3,y3);        Point A4(x4,y4);    return 0;}
原创粉丝点击