HDU 1221 Rectangle and Circle 考虑很多情况,good题
http://acm.hdu.edu.cn/showproblem.php?pid=1221
1
14 92 31 95 13 96 3
这题只需要判断圆和矩形是否相交,然后在里面是不算相交的。
那么就有好几种情况了。
1、整个矩形在圆形里,NO,(我的做法是所有点到圆心距离小于半径)
2、整个圆在矩形里,NO,一个圆选出5个点,圆心,和最上下左右,如果这些点都在,则不行。我的做法直接PointInPolygon。
3、否则,只要有公共点,就直接YES。然后,如果圆那5个点有一个在矩形,或者矩形的4个点到圆心的距离小于半径,即可。


#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#define IOS ios::sync_with_stdio(false)
#define MY "H:/CodeBlocks/project/CompareTwoFile/DataMy.txt", "w", stdout
#define ANS "H:/CodeBlocks/project/CompareTwoFile/DataAns.txt", "w", stdout
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL; #include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
const double eps = 1e-;
bool same(double x, double y) {
return fabs(x - y) < eps;
}
struct coor {
double x,y;
coor() {}
coor(double xx,double yy):x(xx),y(yy) {}
double operator ^(coor rhs) const { //计算叉积(向量积),返回数值即可
return x*rhs.y - y*rhs.x;
}
coor operator -(coor rhs) const { //坐标相减,a-b得到向量ba,返回一个向量(坐标形式)
return coor(x-rhs.x,y-rhs.y);
}
double operator *(coor rhs) const { //数量积,返回数值即可
return x*rhs.x + y*rhs.y;
}
bool operator ==(coor rhs) const {
return same(x,rhs.x)&&same(y,rhs.y); //same的定义其实就是和eps比较
}
} a[], cir[];
double dis(coor a, coor b) {
return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
} bool OnSegment (coor a,coor b,coor cmp) { //判断点cmp是否在线段ab上
double min_x = min(a.x,b.x), min_y = min(a.y,b.y);
double max_x = max(a.x,b.x), max_y = max(a.y,b.y);
if (cmp.x>=min_x && cmp.x<=max_x && cmp.y>=min_y && cmp.y<=max_y) return true;
else return false;
} int PointInPolygon (coor p[],int n,coor cmp) {
int cnt = ; //记录单侧有多少个交点,这里的p[],必须有顺序
for (int i=; i<=n; ++i) {
int t = (i+)>n ? :(i+); //下标为1要这样MOD
coor p1=p[i],p2=p[t];
//printf ("%lf %lf %lf %lf***\n",p1.x,p1.y,p2.x,p2.y);
if (OnSegment(p1,p2,cmp)) {
coor t1 = p1-cmp,t2 = p2-cmp; //同时要叉积等于0,这是在线段上的前提
if ((t1^t2)==) return ;// 2表明在多边形上,可以适当省略
}
if (cmp.y >= max(p1.y,p2.y)) continue;//交点在延长线上和在凸顶点上的都不要
if (cmp.y < min(p1.y,p2.y)) continue;//交点在凹顶点上就要,这里没取等
if (same(p1.y,p2.y)) continue; //与cmp.y是平行的
double x = (cmp.y-p1.y)*(p1.x-p2.x)/(p1.y-p2.y) + p1.x; //求交点 p1.y != p2.y不会除0
if (x>cmp.x) cnt++;//只统计一侧的交点
}
return cnt&;//0表明点在多边形外,1表明点在多边形内
} void work() {
double x, y, R;
scanf("%lf%lf%lf", &x, &y, &R);
double xx1, xx2, yy1, yy2;
scanf("%lf%lf%lf%lf", &xx1, &yy1, &xx2, &yy2);
int lena = ;
a[++lena] = coor(xx1, yy1);
a[++lena] = coor(xx1, yy2);
a[++lena] = coor(xx2, yy2);
a[++lena] = coor(xx2, yy1); int lencir = ;
cir[++lencir] = coor(x + R, y);
cir[++lencir] = coor(x, y + R);
cir[++lencir] = coor(x - R, y);
cir[++lencir] = coor(x, y - R);
cir[++lencir] = coor(x, y);
int up = ;
for (int i = ; i <= lencir; ++i) {
if (PointInPolygon(a, , cir[i])) {
up++;
}
if (PointInPolygon(a, , cir[i]) == && i != lencir) {
printf("YES\n");
return;
}
}
if (up == lencir) {
printf("NO\n");
return;
}
up = ;
for (int i = ; i <= lena; ++i) {
double tdis = dis(a[i], coor(x, y));
if (same(tdis, R)) {
printf("YES\n");
return;
}
if (tdis < R) up++;
}
if (up == lena) {
printf("NO\n");
return;
} for (int i = ; i <= lena; ++i) {
double tdis = dis(a[i], coor(x, y));
if (same(tdis, R) || tdis < R) {
printf("YES\n");
return;
}
} for (int i = ; i <= lencir; ++i) {
if (PointInPolygon(a, , cir[i])) {
printf("YES\n");
return;
}
}
printf("NO\n");
// cout << dis(coor(5,5), coor(7, 7)) << endl;
return;
}
int main() {
#ifdef local
freopen("data.txt","r",stdin);
freopen(MY);
#endif
int t;
scanf("%d", &t);
while (t--) {
work();
}
return ;
}
开始的时候,判断有一个点在就行的时候,(就是相切的时候),把圆心也算进去了,坑了半天。
https://www.desmos.com/calculator 分享个画图工具,矩形的话,就直接是x>=10 x <= 99这样画
HDU 1221 Rectangle and Circle 考虑很多情况,good题的更多相关文章
- HDU 1221 Rectangle and Circle(判断圆和矩形是不是相交)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1221 Rectangle and Circle Time Limit: 2000/1000 MS (J ...
- libgdx学习记录25——Rectangle与Circle是否重叠
Rect与Circle重叠有三种情况: 1. Rect至少有一个角在Circle里面 2. Circle与Rect的左边或右边相交,或者Circle在Rect内 3. Circle与Rect的顶边或底 ...
- Leaflet:Path、Polyline、Polygon、Rectangle、Circle、CircleMarker
下边介绍Vector Layer Path(Layer) Path是其他Vector Layer的父类,比如Polyline.Polygon.Rectangle.Circle.CircleMarker ...
- hdu 5288||2015多校联合第一场1001题
pid=5288">http://acm.hdu.edu.cn/showproblem.php?pid=5288 Problem Description OO has got a ar ...
- hdu 5343 MZL's Circle Zhou SAM
MZL's Circle Zhou 题意:给定两个长度不超过a,b(1 <= |a|,|b| <= 90000),x为a的连续子串,b为y的连续子串(x和y均可以是空串):问x+y形成的不 ...
- 判断圆和矩形是否相交C - Rectangle and Circle
Description Given a rectangle and a circle in the coordinate system(two edges of the rectangle are p ...
- HDU 5343 MZL's Circle Zhou
MZL's Circle Zhou Time Limit: 1000ms Memory Limit: 131072KB This problem will be judged on HDU. Orig ...
- opencv —— line、ellipse、rectangle、circle、fillPoly、putText 基本图形的绘制
绘制线段:line 函数 void line(Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness=1, ...
- HDU 5343 MZL's Circle Zhou 后缀自动机+DP
MZL's Circle Zhou Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
随机推荐
- SpringCloud遇到的坑
1. 今天使用Feign 调用其他项目,结果一直跳转到断路器,跟踪发现是接口响应时间较长,解决方案 解决:# 在 Feign 模块中,单独设置这个超时时间不行,还要额外设置 Ribbon 的超时时间, ...
- Ruby中任务构建工具rake的入门学习教程
参考:http://www.jb51.net/article/81476.htm Rake简介 Rake的意思是Ruby Make,一个用ruby开发的代码构建工具. 但是,为什么Ruby需要Rake ...
- iOS中城市定位功能的实现
引入框架:CoreLocation .h文件 引入CoreLocation/CoreLocation.h @interface WeatherViewController :UIViewControl ...
- iOS webView的常见属性和方法
一.初始化与三种加载方式 UIWebView继承与UIView,因此,其初始化方法和一般的view一样,通过alloc和init进行初始化,其加载数据的方式有三种: 第一种: - (void)load ...
- codeforcfes Codeforces Round #287 (Div. 2) B. Amr and Pins
B. Amr and Pins time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- LoadRunner检查点使用小结
LR中检查点有两种:图片和文字. 常用检查点函数如下: 1)web_find()函数用于从 HTML 页中搜索指定的文本字符串: 2)web_reg_find()函数注册一个请求,以在下一个操作函数( ...
- 如何反编译silverlight
@years(945060991) 15:10:28问一下 如何反编译silverlight观,一世沧桑如画♥(752816388) 15:10:46解压就行@years(945060991) ...
- POJ 1236 Network of Schools (校园网)
Description 一些学校连入一个电脑网络.那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作“接受学校”).注意如果 B 在 A 学校的分发列表中,那么 A 不必也在 B 学校的 ...
- [原创]JAVA获取word表格中数据的方案
上一个项目的开发中需要实现从word中读取表格数据的功能,在JAVA社区搜索了很多资料,终于找到了两个相对最佳的方案,因为也得到了不少网友们的帮助,所以不敢独自享用,在此做一个分享. 两个方案分别是: ...
- codeforces 673D D. Bear and Two Paths(构造)
题目链接: D. Bear and Two Paths time limit per test 2 seconds memory limit per test 256 megabytes input ...