求两个圆的交点(模板)
模板代码:
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;
}