计算几何模板

来源:互联网 发布:labtool48uxp软件下载 编辑:程序博客网 时间:2024/05/17 09:24

求两个圆的交点(模板)

模板代码:

bool intersection(const Point& o1, double r1, const Point& o2, double r2, Point& p1, Point& p2){double d = dis(o1, o2);if(d < fabs(r1 - r2) - eps || d > r1 + r2 + eps)    {return false;}double cosa = (sqr(r1) + sqr(d) - sqr(r2)) / (2 * r1 * d);double sina = sqrt(max(0., 1. - sqr(cosa)));p1 = p2 = o1;p1.x += r1 / d * ((o2.x - o1.x) * cosa + (o2.y - o1.y) * -sina);p1.y += r1 / d * ((o2.x - o1.x) * sina + (o2.y - o1.y) * cosa);p2.x += r1 / d * ((o2.x - o1.x) * cosa + (o2.y - o1.y) * sina);p2.y += r1 / d * ((o2.x - o1.x) * -sina + (o2.y - o1.y) * cosa);//printf("%lf %lf %lf %lf\n",p1.x,p1.y,p2.x,p2.y);return true;}

点到直线的距离模板:
double fun1(double ax,double ay,double bx,double by,double x,double y){     if(ax==bx) return fabs(x-ax);//x坐标相等,及斜率不存在。    double k=(ay-by)/(ax-bx);//斜率。    double b=ay-k*ax;    //所求直线方程是:y=k*x+b;    double n=fabs(k*x+b-y);    return n/sqrt(k*k+1);}

判断两个线段是否相交:

struct Point{    double x,y;};double Min(double a,double b){    return a>b?b:a;}double Max(double a,double b){    return a>b?a:b;}double Multi(Point p1, Point p2, Point p3){   return (p1.x-p3.x)*(p2.y-p3.y)-(p2.x-p3.x)*(p1.y-p3.y);}bool fun(Point a1, Point a2, Point b1, Point b2)//判断两条线段是否相交(含顶点){    if (Min(a1.x, a2.x) <= Max(b1.x, b2.x) &&        Min(a1.y, a2.y) <= Max(b1.y, b2.y) &&        Min(b1.x, b2.x) <= Max(a1.x, a2.x) &&        Min(b1.y, b2.y) <= Max(a1.y, a2.y) &&        Multi(a1, a2, b1) * Multi(a1, a2, b2) <= 0 &&        Multi(b1, b2, a1) * Multi(b1, b2, a2) <= 0        )        return true;//说明两线段之间相交    return false;}

判断点是在矩形内

bool Inrectangle(int i)//判断点是否在矩形的内部 seg为点,rec为矩形对角点坐标。{    if (seg[i].x > Max(rec[1].x, rec[3].x)) return false;    if (seg[i].y > Max(rec[1].y, rec[3].y)) return false;    if (seg[i].x < Min(rec[1].x, rec[3].x)) return false;    if (seg[i].y < Min(rec[1].y, rec[3].y)) return false;    return true;}



原创粉丝点击