雷达覆盖_ssl1232_计算几何

Description


以雷达心为圆心的半圆形雷达覆盖范围有多个点 雷达可旋转,求最多覆盖数(含在边界的)
雷达半径 0 时退出程序
description

Analysis


没有输入输出描述也是醉了
继续学习叉积的应用:

确定两条连续的有向线段p0p1和p0p2在pl点是向左转还是向右转
如图
实例
1. 计算叉积m=(x1-x0)*(y2-y0)-(x2-x0)*(y1-y0)
2. 判断m
若m>0 则p1点向左拐
若m<0 则p1点向右拐
若m=0 则点p0、p1、p2在一条直线上

枚举点作为雷达的分界线,判断左右两边点数量的多少,找一个最优值

Code


#include <stdio.h>
#include <cmath>
using namespace std;
struct point
{
    int x,y;
}t[101];
int cros(point a,point b,point c)
{
    return (b.x-c.x)*(a.y-c.y)-(a.x-c.x)*(b.y-c.y);
}
double dist(point a,point b)
{
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int main()
{
    point radar;
    double r;
    while(~scanf("%d%d%lf",&radar.x,&radar.y,&r)&&(r>0))
    {
        int n,cnt=0,ans=0;
        scanf("%d",&n);
        for (int i=1;i<=n;i++)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            t[++cnt]=(point){x,y};
            if (dist(t[cnt],radar)>r)
                cnt--;
        }
        for (int i=1;i<=cnt;i++)
        {
            int sumL=0,sumR=0;
            for (int j=1;j<=cnt;j++)
            {
                int tmp=cros(t[i],t[j],radar);
                sumR+=tmp>=0?1:0;
                sumL+=tmp<=0?1:0;
            }
            ans=sumR>ans?sumR:ans;
            ans=sumL>ans?sumL:ans;
        }
        printf("%d\n",ans);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值