Offer 收割编程练习赛 87B 方圆距离
与坐标轴平行的矩形和圆的位置关系。
分两种情况。
圆与矩形交集不为空
此时答案为零。问题归结为如何判断圆与矩形交集不为空。
先排除矩形顶点在圆内或圆心在矩形内。
此时,若矩形与圆交集不为空,则必有矩形的某条边穿过圆(「穿过圆」也可表述为「割圆」,「线段穿过圆」的确切定义为「线段与圆周有两个交点」)。注意:这样的边可能不止一条。
问题归结为如何判断线段是否割圆。
线段割圆的充要条件是圆心到线段所在直线的垂直投影落在线段上,且圆心到投影的距离小于半径。
矩形的左下顶点为 $(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$ 。
其余边的情形是类似的。
圆与矩形交集为空的情形
此时应当注意到:
- 矩形上距离圆周最近的点必然在边界上。
- 矩形边界上任意一点 $P$ 到圆周的最短距离为 $|PC| - r$,$|PC|$ 表示 $P$ 到圆心 $C$ 的距离。
- 问题归结为求圆心 $C$ 到矩形边界的最短距离,亦即点到线段的最短距离。
备选的点(candidates)是圆心在四条边所在的直线上的垂直投影(即垂足)与边的端点。
如果「圆心在矩形的某条边所在的直线上的垂直投影」落在这条边上则此投影点是这条边上的备选点,否则这条边的两端点是这条边上的备选点。
(这一部分内容还在建设中)
举一反三
- 如果矩形不是坐标轴平行的,通过坐标变换就可以转化到坐标轴平行的情形。
如何进行坐标变换?
首先假设我们想要的坐标变换是一个线性变换。
任取矩形的一个顶点 $A$,作为此线性变换的不动点。设 $A$ 的坐标为 $(x_A, y_A)$ 。
任取 $A$ 的一个邻点 $B$,使得 $\vec{AB}$ 是变换过后的 $x$ 轴正方向,亦即 $B$ 变换过后的坐标为 $(x_A + |AB|, y_A)$,$|AB|$ 表示线段 $AB$ 的长度。
- 将矩形换成任意凸多边形怎么做?
问题归结为求点到线段的最短距离。
Offer 收割编程练习赛 87B 方圆距离的更多相关文章
- hihocoder [Offer收割]编程练习赛4
描述 最近天气炎热,小Ho天天宅在家里叫外卖.他常吃的一家餐馆一共有N道菜品,价格分别是A1, A2, ... AN元.并且如果消费总计满X元,还能享受优惠.小Ho是一个不薅羊毛不舒服斯基的人,他希望 ...
- hihocoder [Offer收割]编程练习赛61
[Offer收割]编程练习赛61 A:最小排列 给定一个长度为m的序列b[1..m],再给定一个n,求一个字典序最小的1~n的排列A,使得b是A的子序列. 贪心即可,b是A的子序列,把不在b中的元素, ...
- [Offer收割]编程练习赛46
[Offer收割]编程练习赛46赛后题解 A.AEIOU 分析
- hihocoder offer收割编程练习赛9 B 水陆距离
思路: 宽搜,多个起点. 实现: #include <iostream> #include <cstdio> #include <algorithm> #inclu ...
- 【[Offer收割]编程练习赛9 B】水陆距离
[题目链接]:http://hihocoder.com/problemset/problem/1478 [题意] [题解] 一开始把所有的水域的位置都加入到队列中去; 然后跑一个bfs. 第一次到达的 ...
- [Offer收割] 编程练习赛63
题目1 : 命名 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 有两个公司想要合并,第一个公司的名字是一个字符串S,第二个公司的名字是一个字符串T. 合并后的新公司是这样 ...
- [Offer收割]编程练习赛9,10
题目1 : 闰秒 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 计算机系统中使用的UTC时间基于原子钟,这种计时方式同“地球自转一周是24小时”的计时方式有微小的偏差. ...
- hihocoder [Offer收割]编程练习赛14
A.小Hi和小Ho的礼物 谜之第1题,明明是第1题AC率比C还要低.题目是求在n个不同重量袋子选4袋,2袋给A,2袋给B,使2人获得重量相同,求问方案数. 我也是一脸懵b...o(n2)暴力枚举发现把 ...
- ACM学习历程—Hihocoder [Offer收割]编程练习赛1
比赛链接:http://hihocoder.com/contest/hihointerview3/problem/1 大概有一个月没怎么打算法了.这一场的前一场BC,也打的不是很好.本来Div1的A和 ...
随机推荐
- 可复用 React 的 HOC 以及的 Render Props
重复是不可能的,这辈子都不可能写重复的代码 当然,这句话分分钟都要被产品(领导)打脸,真的最后一次改需求,我们烦恼于频繁修改的需求 虽然我们不能改变别人,但我们却可以尝试去做的更好,我们需要抽象,封装 ...
- sqlite的sql常用语句(笔记)
1.复制一张表并重命名 比如已经创建好一个表 表名为"28165" 复制这个表. CREATE TABLE [33150] AS SELECT * FROM [28165] 2.根 ...
- ayui弹出层闪退,layer弹出层闪退,layer弹出层坑
今天用layui的弹出层插件,发现两奇怪的问题: 1.弹窗打开事件还未绑定到任何按钮,可是点击form表单中的按钮可以打开我定义的弹出层 2.绑定弹出层到按钮,打开弹窗闪退 后面发现真如参考博文所说: ...
- 内置函数系列之 map
map(映射函数)语法: map(函数,可迭代对象) 可以对可迭代对象中的每一个元素,分别执行函数里的操作 # 1.计算每个元素的平方 lst = [1,2,3,4,5] lst_new = map( ...
- filter() 函数的使用
Python3 filter() 函数 描述 filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list() 来转换. 该接收两个参数,第一个 ...
- 24-webhost的配置
1-新建asp.net core空项目 2-创建setting.json文件 3- 配制Progrom类中CreateWebHostBuilder 4-获取配置的文件 5-显示结果
- INSERT⋯ACCEPTING_DUPLICATE_KEYS
使用ACCEPTING DUPLICATE KEYS时,当插入时发现这条记录已存在时,那么这条记录将不会被insert,后续记录继续执行insert
- DOM事件里封装方法eventUtil
var eventUtil={ //添加句柄 addHandler:function (element,type,handler) { //element相当于btn2,type此时用的是click类 ...
- 内存释放free函数的异常问题
本次在实际应用中遇到一个问题,首先是定义了一个指针,然后这个指针指向某一个地址,但是这个地址不是用malloc分配的.如果后面用free去释放这个指针会产生什么现象. 首先看下指针的声明和使用 uin ...
- Null / Loopback (Null)
参考: http://www.cnblogs.com/caoguoping100/p/3654452.html https://wiki.wireshark.org/NullLoopback 抓包安装 ...