欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

已知圆上两点坐标和半径求圆心

程序员文章站 2022-04-01 09:35:30
...

牛客题目链接

已知两点坐标可求出直线方程,当然也包括斜率了,已知斜率tan a,最近刚学的高数上,可根据三角函数的反函数(C++ atan2(y,x))求出角度(小心为double类型),用到圆心到两点中点这条边可求出圆心。

/**遇到此类型的题目就是先确定圆心再去判断其他店是否在圆上或者圆内**/
  
#include <map>
#include <queue>
#include <string>
#include<iostream>
#include<stdio.h>
#include<string.h>
#include <algorithm>
#include <math.h>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
typedef pair<ll,ll> pii;
const int maxn=2e5+1010;
#define inf 0x3f3f3f3f
#define sf scanf
#define pf printf
const int mod=998244353;
const int MOD=10007;
const double eps=1e-6;

ll r,num;

struct Point
{
	double x,y;
	Point(){}
	Point(double tx,double ty){x=tx;y=ty;}
}p[200];

double dist(Point p1,Point p2)
{
	return sqrt(pow(p1.x-p2.x,2)+pow(p1.y-p2.y,2));///求出两点距离
}

Point Center(Point p1,Point p2)
{
	Point mid = Point((p1.x+p2.x)/2,(p1.y+p2.y)/2);///求得中点坐标
	double angle = atan2(p1.x-p2.x,p2.y-p1.y); ///求出极坐标
	double d = sqrt(r*r-pow(dist(p1,mid),2));///求出侧边也就是圆心到其中点的距离
	return Point(mid.x-d*cos(angle),mid.y-d*sin(angle));///求出圆心坐标
}


int main()
{
		cin>>r;
		cin>>num;
		for(int i=0;i<num;i++)
			cin>>p[i].x>>p[i].y;
		ll ans = 1;
		for(int i=0;i<num;i++)
		{
			for(int j=i+1;j<num;j++)
			{
				if(dist(p[i],p[j]) > 2.0*r) continue;///两点距离比直径大直接退出
				Point center = Center(p[i],p[j]);///求出圆心的
				ll cnt = 0;
				for(int k=0;k<num;k++)
					if(dist(center,p[k]) < 1.0*r+eps) cnt++;///求这个求出来的圆心点到个点的距离是否瞒住条件
				ans = max(ans,cnt);///求出最大值
			}
		}
		cout<<ans<<endl;
	return 0;
}