与坐标轴平行的矩形和圆的位置关系。

分两种情况。

圆与矩形交集不为空

此时答案为零。问题归结为如何判断圆与矩形交集不为空。

先排除矩形顶点在圆内或圆心在矩形内。
此时,若矩形与圆交集不为空,则必有矩形的某条边穿过圆(「穿过圆」也可表述为「割圆」,「线段穿过圆」的确切定义为「线段与圆周有两个交点」)。注意:这样的边可能不止一条。

问题归结为如何判断线段是否割圆。

线段割圆的充要条件是圆心到线段所在直线的垂直投影落在线段上,且圆心到投影的距离小于半径。

矩形的左下顶点为 $(x_1, y_1)$,右上顶点为 $(x_2, y_2)$,圆心为 $(x, y)$,半径为 $r$ 。
不失一般性,考虑矩形的底边 $(x_1, y_1) , (x_2, y_1)$ 割圆的条件。

性质

在排除了矩形的某个顶点在圆内或圆心在矩形内的条件下,矩形的底边上有点在圆内当且仅当
$x_1 < x < x_2$ 且 $|y - y_1| \le r$ 。

其余边的情形是类似的。

圆与矩形交集为空的情形

此时应当注意到:

  1. 矩形上距离圆周最近的点必然在边界上。
  2. 矩形边界上任意一点 $P$ 到圆周的最短距离为 $|PC| - r$,$|PC|$ 表示 $P$ 到圆心 $C$ 的距离。
  3. 问题归结为求圆心 $C$ 到矩形边界的最短距离,亦即点到线段的最短距离

备选的点(candidates)是圆心在四条边所在的直线上的垂直投影(即垂足)与边的端点。
如果「圆心在矩形的某条边所在的直线上的垂直投影」落在这条边上则此投影点是这条边上的备选点,否则这条边的两端点是这条边上的备选点。


这一部分内容还在建设中

举一反三

  • 如果矩形不是坐标轴平行的,通过坐标变换就可以转化到坐标轴平行的情形。
    如何进行坐标变换?

首先假设我们想要的坐标变换是一个线性变换。

任取矩形的一个顶点 $A$,作为此线性变换的不动点。设 $A$ 的坐标为 $(x_A, y_A)$ 。
任取 $A$ 的一个邻点 $B$,使得 $\vec{AB}$ 是变换过后的 $x$ 轴正方向,亦即 $B$ 变换过后的坐标为 $(x_A + |AB|, y_A)$,$|AB|$ 表示线段 $AB$ 的长度。

  • 将矩形换成任意凸多边形怎么做?

问题归结为求点到线段的最短距离。

Offer 收割编程练习赛 87B 方圆距离的更多相关文章

  1. hihocoder [Offer收割]编程练习赛4

    描述 最近天气炎热,小Ho天天宅在家里叫外卖.他常吃的一家餐馆一共有N道菜品,价格分别是A1, A2, ... AN元.并且如果消费总计满X元,还能享受优惠.小Ho是一个不薅羊毛不舒服斯基的人,他希望 ...

  2. hihocoder [Offer收割]编程练习赛61

    [Offer收割]编程练习赛61 A:最小排列 给定一个长度为m的序列b[1..m],再给定一个n,求一个字典序最小的1~n的排列A,使得b是A的子序列. 贪心即可,b是A的子序列,把不在b中的元素, ...

  3. [Offer收割]编程练习赛46

    [Offer收割]编程练习赛46赛后题解 A.AEIOU 分析

  4. hihocoder offer收割编程练习赛9 B 水陆距离

    思路: 宽搜,多个起点. 实现: #include <iostream> #include <cstdio> #include <algorithm> #inclu ...

  5. 【[Offer收割]编程练习赛9 B】水陆距离

    [题目链接]:http://hihocoder.com/problemset/problem/1478 [题意] [题解] 一开始把所有的水域的位置都加入到队列中去; 然后跑一个bfs. 第一次到达的 ...

  6. [Offer收割] 编程练习赛63

    题目1 : 命名 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 有两个公司想要合并,第一个公司的名字是一个字符串S,第二个公司的名字是一个字符串T. 合并后的新公司是这样 ...

  7. [Offer收割]编程练习赛9,10

    题目1 : 闰秒 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 计算机系统中使用的UTC时间基于原子钟,这种计时方式同“地球自转一周是24小时”的计时方式有微小的偏差. ...

  8. hihocoder [Offer收割]编程练习赛14

    A.小Hi和小Ho的礼物 谜之第1题,明明是第1题AC率比C还要低.题目是求在n个不同重量袋子选4袋,2袋给A,2袋给B,使2人获得重量相同,求问方案数. 我也是一脸懵b...o(n2)暴力枚举发现把 ...

  9. ACM学习历程—Hihocoder [Offer收割]编程练习赛1

    比赛链接:http://hihocoder.com/contest/hihointerview3/problem/1 大概有一个月没怎么打算法了.这一场的前一场BC,也打的不是很好.本来Div1的A和 ...

随机推荐

  1. Oracle Like、Instr以及正则表达式

    查看测试数据 select * from student; 1. like 在where字句中使用like可以达到模糊查询的效果,常用通配符如下 ▶ %: 使用 % 有三种情况 ① 字段 like ‘ ...

  2. SpringBoot学习14:springboot异常处理方式4(使用SimpleMappingExceptionResolver处理异常)

    修改异常处理方法3中的全局异常处理Controller即可 package bjsxt.exception; import org.springframework.context.annotation ...

  3. proteus中蜂鸣器不响的原因

        本文参考自https://blog.csdn.net/gin_love/article/details/51168369 此网站.在用proteus仿真报警电路时,发现蜂鸣器不响.后在网上找了 ...

  4. 安装python 第三方库遇到的安装问题 microsoft visual studio c++ 10.0 is required,Could not find function xmlCheckVersion in library libxml2. Is libxml2 installed?

    问题一: microsoft visual studio c++ 10.0 is required 安装scrapy时候出现需要vc c++ 10,有时安装其他也会有. 解决方法:安装vc 2010, ...

  5. python re模块实现计算器

    def mul_div(exp): #计算乘除 while True: ret = re.search('[\d\.]+[\*\/]-?[\d\.]+', exp) if ret: atom_exp ...

  6. Docker构建nginx+uwsgi+flask镜像(二)

    Dockerfile搭建环境并打包应用 在上一章Docker构建nginx+uwsgi+flask镜像(一)的学习中,我们学会用命令行一句一句在alpine环境中搭建nginx+uwsgi+flask ...

  7. MySQL之查询性能优化(四)

    优化特定类型的查询 COUNT()的作用 COUNT()是一个特殊函数,有两个非常不同的作用:它可以统计某个列值的数量,也可以统计行数.在统计列值时要求列值是非空的(不统计NULL). 如果在COUN ...

  8. 读json文件发生错误,所遇到的坑

    当我们生产者生产json 文件的时候   消费时用JSON读文件时,如下: val values = kafkardd.map(t=>JSON.parseObject(t._2)) 如果发生以下 ...

  9. laravel5.5门面

    Facades为应用程序的 服务容器 中可用的类提供了一个 静态接口 . 最直观的好处 就是需记住必须手动注入或配置的长长的类名.因此有人也理解Facades就是一个"快捷别名" ...

  10. 《Cracking the Coding Interview》——第11章:排序和搜索——题目4

    2014-03-21 21:28 题目:给定一个20GB大小的文本文件,每一行都是一个字符串.请设计方法将这个文件里的字符串排序. 解法:请看下面的注释. 代码: // 11.4 Given a fi ...