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题的更多相关文章

  1. HDU 1221 Rectangle and Circle(判断圆和矩形是不是相交)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1221 Rectangle and Circle Time Limit: 2000/1000 MS (J ...

  2. libgdx学习记录25——Rectangle与Circle是否重叠

    Rect与Circle重叠有三种情况: 1. Rect至少有一个角在Circle里面 2. Circle与Rect的左边或右边相交,或者Circle在Rect内 3. Circle与Rect的顶边或底 ...

  3. Leaflet:Path、Polyline、Polygon、Rectangle、Circle、CircleMarker

    下边介绍Vector Layer Path(Layer) Path是其他Vector Layer的父类,比如Polyline.Polygon.Rectangle.Circle.CircleMarker ...

  4. hdu 5288||2015多校联合第一场1001题

    pid=5288">http://acm.hdu.edu.cn/showproblem.php?pid=5288 Problem Description OO has got a ar ...

  5. 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形成的不 ...

  6. 判断圆和矩形是否相交C - Rectangle and Circle

    Description Given a rectangle and a circle in the coordinate system(two edges of the rectangle are p ...

  7. HDU 5343 MZL's Circle Zhou

    MZL's Circle Zhou Time Limit: 1000ms Memory Limit: 131072KB This problem will be judged on HDU. Orig ...

  8. opencv —— line、ellipse、rectangle、circle、fillPoly、putText 基本图形的绘制

    绘制线段:line 函数 void line(Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness=1, ...

  9. 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 ...

随机推荐

  1. hive增加Update、Delete支持

    一.配置hive-site.xml二.建表三.操作四.总结 一.配置hive-site.xml CDH版本先进入Hive配置页 选择高级,找到hive-site.xml 的 Hive 客户端高级配置代 ...

  2. nodejs的request模块

    request模块让http请求变的更加简单.(作为客户端,去请求.抓取另一个网站的信息) request的GitHub主页: https://github.com/request/request 最 ...

  3. 数据库DCL、DDL、DML、DQL

    SQL三部分:data manipulation language      DCL: (控制)管理用户权限(GRANT.REVOKE),数据库整体配置      DDL: (定义)作用于数据库,表, ...

  4. vue实现单选多选反选全选全不选

    单选 当我们用v-for渲染一组数据的时候,我们可以带上index以便区分他们我们这里利用这个index来简单地实现单选 <li v-for="(item,index) in radi ...

  5. easyui 日期范围前后台的设置以及实现

    1.页面部分(引入相应的js) <td class="w40 tl pl10">从日期:</td> <td> <input class=& ...

  6. pyspark 日期格式

    1. 获取当前日期 from pyspark.sql.functions import current_date spark.range(3).withColumn('date',current_da ...

  7. SideBar---fixed定位

      <style> /*外层fixed*/ body{ width:2000px; height:2000px; background:#000; } .wrap { position: ...

  8. rcfile

    转自:http://flyingdutchman.iteye.com/blog/1871025 在当前的基于Hadoop系统的数据仓库中,数据存储格式是影响数据仓库性能的一个重要因素.Facebook ...

  9. codeforces 690D2 D2. The Wall (medium)(组合数学)

    题目链接: D2. The Wall (medium) time limit per test 2 seconds memory limit per test 256 megabytes input ...

  10. Java 给Thread传递参数

    一开始我想把run()函数写成有参函数来传值,后来发现行不通.经过查找,最终用如下方法传递了参数: 也就是用另外一个有参函数setTar()传递参数. 调用的时候用这4行code传递参数: 上面是用i ...