计算几何学习
程序员文章站
2022-03-02 10:48:48
...
一、计算几何基础
1.圆
P1652
给出 n个圆,保证任意两个圆都不相交。 然后给出两个点(x1,y1),(x2,y2),保证均不在某个圆上,要从 (x1,y1) 到
(x2,y2)画条曲线,问这条曲线最少穿过多少次圆的边界?
输入格式
第一行为一个整数 n,表示圆的个数;
第二行是 n 个整数,表示 n个圆的 x 坐标;
第三行是 n 个整数,表示 n个圆的 y 坐标;
第四行是 n 个整数,表示 n 个圆的半径 r;
第五行是四个整数x1,y1,x2,y2;
输出格式
仅一个整数,表示最少要穿过多少次圆的边界。
输入
7
1 -3 2 5 -4 12 12
1 -1 2 5 5 1 1
8 1 2 1 1 1 2
-5 1 12 1
输出
3
对于 100% 的数据,1≤n≤50,∣x∣,∣y∣≤1000,1≤r≤1000。保证圆之间没有公共点。
因为是曲线是任意画的,所以只要一个点在圆内,一个点在圆外,不管怎么画,总要从穿过这个圆的边界。
判断一个在圆内,另一个在圆外时,可以用异或,看两点到圆心的距离是否小于(不能等于)半径。
#include<bits/stdc++.h>
using namespace std;
double dis(int x1,int y1,int x2,int y2)
{
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
int main()
{
int n,x[55],y[55],r[55],ans=0,x1,x2,y1,y2;
scanf("%d",&n);
for(int i = 0; i < n; i++)
scanf("%d",&x[i]);
for(int i = 0; i < n; i++)
scanf("%d",&y[i]);
for(int i = 0; i < n; i++)
scanf("%d",&r[i]);
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
for(int i = 0; i < n; i++)
{
if((dis(x[i],y[i],x1,y1) < r[i] ) ^ dis(x[i],y[i],x2,y2)<r[i]) ans++;
}
printf("%d\n",ans);
return 0;
}