HDU 3561 How many times 【计算几何】

41 篇文章 0 订阅
2 篇文章 0 订阅

判断任两圆的交点和每个圆的圆心即可

#include<iostream>
#include<vector>
#include<math.h>
using namespace std;
#define eps 1e-8
const int maxn=105;
struct point
{
    double x,y;
};
struct circle
{
    point p;
    double r;
}c[maxn];
vector<point>v;
double dis(point p1,point p2)
{
    return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}

point intersection(point u1,point u2,point v1,point v2)
{
    point ret=u1;
    double t=((u1.x-v1.x)*(v1.y-v2.y)-(u1.y-v1.y)*(v1.x-v2.x))/((u1.x-u2.x)*(v1.y-v2.y)-(u1.y-u2.y)*(v1.x-v2.x));
    ret.x+=(u2.x-u1.x)*t;
    ret.y+=(u2.y-u1.y)*t;
    return ret;
}


int intersect_circle_circle(point c1,double r1,point c2,double r2)
{
    return dis(c1,c2)<r1+r2+eps&&dis(c1,c2)>fabs(r1-r2)-eps;
}

void intersection_line_circle(point c,double r,point l1,point l2,point &p1,point &p2)
{
    point p=c;
    double t;
    p.x+=l1.y-l2.y;
    p.y+=l2.x-l1.x;
    p=intersection(p,c,l1,l2);
    t=sqrt(r*r-dis(p,c)*dis(p,c))/dis(l1,l2);
    p1.x=p.x+(l2.x-l1.x)*t;
    p1.y=p.y+(l2.y-l1.y)*t;
    p2.x=p.x-(l2.x-l1.x)*t;
    p2.y=p.x-(l2.y-l1.y)*t;
}
void intersection_circle_circle(point c1,double r1,point c2,double r2,point &p1,point &p2)
{
    point u,v;
    double t;
    t=(1+(r1*r1-r2*r2)/dis(c1,c2)/dis(c1,c2))/2;
    u.x=c1.x+(c2.x-c1.x)*t;
    u.y=c1.y+(c2.y-c1.y)*t;
    v.x=u.x+c1.y-c2.y;
    v.y=u.y-c1.x+c2.x;
    intersection_line_circle(c1,r1,u,v,p1,p2);
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        int cnt=0;
        v.clear();
        for(int i=0;i<n;i++)
        {
            cin>>c[i].p.x>>c[i].p.y>>c[i].r;
            v.push_back(c[i].p);
        }
        for(int i=0;i<n;i++)
            for(int j=0;j<i;j++)
                if(intersect_circle_circle(c[i].p,c[i].r,c[j].p,c[j].r))
                {
                    point x,y;
                    intersection_circle_circle(c[i].p, c[i].r, c[j].p, c[j].r, x, y);
                    v.push_back(x);v.push_back(y);
                }
        int maxt=-1;
        for(int i=0;i<v.size();i++)
        {
            int cnt=0;
            for(int j=0;j<n;j++)
                cnt+=dis(v[i],c[j].p)<c[j].r+eps;
            maxt=max(cnt,maxt);
        }
        cout<<maxt<<endl;
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
准备工作   1、安装 SP_Flash_Tool,MTK 驱动.(掌讯方案MTK3561大屏导航ROOT固件:http://www.gpsmap.cc/caryindao/2488.html)。   2、准备好线刷版固件,以及自制 Recovery.img ,使用自制 Recovery.img 替换掉线刷版固件中的 Recovery.img 。   3、U 盘一个,格式化为 fat32 格式,在根目录放置 OTA 升级固件 xxx_evb3561sv_ct_66_m0-ota-xxx.zip ,以及 ROOT.zip 。 Recovery 安装   1、车机断电,从车机后侧的 microusb 口(非普通 usb 口)接电脑。   2、电脑会检测到 mtk preloader usb vcom,自动安装驱动,驱动安装完成后从电脑拔开 usb。   3、打开 SP_Flash_Tool,选择 scatter-loading file 为固件文件夹中的 mt3561T_Android_scatter.txt 。   4、仅勾选 Recovery,然后点击 download 开始刷机。   5、插入 usb,正常的话会开始刷入,底部横条走动。   6、刷机完毕拔开 usb,启动车机Root 安装   1、插入 u 盘将 ROOT.zip 复制到车机内置 sd 卡下。   2、在车机设置-导航设置中选择 Android 升级。   或者在导航中选择电话,输入*#*#5678#后会跳出设置。点击其他标签后选择 device 模式,此时导航可在电脑中识别为 adb 设备,使用 abd 程序 adb reboot recovery 即可。   3、车机重启后,将进入我们自制的 recovery。不成功的话可以多尝试几次。   4、进入 install,选择 sdcard 下的 ROOT.zip 进行安装。   5、安装完毕重启机器,Root 安装完毕。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值