计算几何模板

求两个圆的交点(模板)

模板代码:

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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值