题目大意:给出圆心坐标和半径,并给出几个点,求出半圆放在哪个角度是包含的给出的点最多。
解题思路:叉积算法,设矢量P=(x1,y1),Q=(x2,y2),若P*Q>0,则P在Q的顺时针方向,
若P*Q<0,则P在Q逆时针方向。先判断点是否在圆内,再用叉积。
若P*Q=0,则P和Q共线
代码:
#include<stdio.h>
#include<math.h>
const double inf=1e-6;
double x[160],y[160];
double dis(int xa,int ya,int xb,int yb)
{
return sqrt(double((xa-xb)*(xa-xb)+(ya-yb)*(ya-yb))); //判断点是否在圆内
}
int side(int i,int j,int xx,int yy)
{
if( (xx - x[i]) * (yy - y[j]) - (xx - x[j]) * (yy - y[i]) >= 0)//叉积判断
return 1;
else
return 0;
}
int main()
{
double r;
int ox,oy,xx,yy,n,i;
while(scanf("%d%d%lf",&ox,&oy,&r)!=EOF && r>0)
{
scanf("%d",&n);
int j=0;
for( i=0;i<n;i++)
{
scanf("%d%d",&xx,&yy);
if(r-dis(xx,yy,ox,oy)>-inf)//判断点是否在圆内
{
x[j]=xx;
y[j]=yy;
++j;
}
}
n=j;
int maxx=0;
for( i=0;i<n;i++) //判断在哪个角度,包含的点最多
{
int k=0;
for(int j=0;j<n;j++)
if(side(i,j,ox,oy))
++k;
if(maxx<k)maxx=k;
}
printf("%d\n",maxx);
}
return 0;
}