圆的反演 hdu 6097

欢迎关注更多精彩
关注我,学习常用算法与数据结构,一题多解,降维打击。

题目大意

http://acm.hdu.edu.cn/showproblem.php?pid=6097

有一个圆C,它的圆心是O(0,0), 半径是r。
在C内部或边界上有两点P和Q,OP=OQ。
求解圆C上一点D,使得PD+QD最小。图中红色相加最短。
请添加图片描述

错解

直觉上感觉D是PQ中垂线与圆的交点。
这个直觉是错误的。

一个特殊例子,当PQ是直径时,显然D点是P或Q时取得最值。
请添加图片描述

利用圆的反演及相似三角形转化圆外点问题

反演定义:有一个圆C以O为圆心半径为r,那么任意点P对于圆C的反演点P'存在于射线OP方向上,且OP' = r*r/OP

寻找相似三角形

请添加图片描述

图中P’是P关于圆O的反演点。
则存在圆上 1 点 D 使得 △ P ′ D O ∼ △ D P O 相似比为 r O P 则存在圆上1点D使得 \triangle P'DO \sim \triangle DPO 相似比为\frac {r}{OP} 则存在圆上1D使得PDODPO相似比为OPr

证明也很简单:
根据已知条件,P’是P的反演点可得到
OP’ = r*r/OP => OP’/r=r/OP = OD/OP
根据两边之比相等且夹角相等,可以得到上述相似三角形的结论。

问题转化

请添加图片描述
根据上述结论,Q’D/DQ=P’D/DP=r/OP(已知量)
得到 Q ′ D + P ′ D D Q + D P = r O P \frac {Q'D+P'D}{DQ+DP} = \frac {r}{OP} DQ+DPQD+PD=OPr
那么想要 DQ+DP 最小只要保证Q’D+P’D最小即可,问题就转化成求Q’D+P’D的最小值。

问题求解

对Q’和P’作边线可以发现下述两种情况。

相交

请添加图片描述
当与圆相交时,最短就是两点的连线,那么D就是圆上与连线的交点。

相离

请添加图片描述
直觉D点是Q’P’中垂线与圆的交点。
证明如下:
假设Q’P’平等于Y轴,引入辅助线l平行于Q’P’与圆相切。

设向量P’D=(x,-y), Q’D = (x,y), 引入变量y*表示D在直线l上移动。

距离之和可以表示为关于 y ∗ 的函数 f ( y ∗ ) = x 2 + ( − y + y ∗ ) 2 + x 2 + ( y + y ∗ ) 2 距离之和可以表示为关于y*的函数 f(y*) = \sqrt{x^2+(-y+y*)^2}+\sqrt{x^2+(y+y*)^2} 距离之和可以表示为关于y的函数f(y)=x2+(y+y)2 +x2+(y+y)2

对f(y*)求导等于0

f ′ ( y ∗ ) = − y + y ∗ x 2 + ( − y + y ∗ ) 2 + y + y ∗ x 2 + ( y + y ∗ ) 2 f'(y*) = \frac {-y+y*}{\sqrt{x^2+(-y+y*)^2}}+\frac {y+y*}{\sqrt{x^2+(y+y*)^2}} f(y)=x2+(y+y)2 y+y+x2+(y+y)2 y+y
当y*=0时,f’(y*)=0。
在圆上移动会比直线上更远。
上述结论得证。

如何求P’D+Q’D。
设P’Q’中点为M, 则DM = OM-r。
根据勾股定理可求得P’D。

代码实现

#include<stdio.h>
#include<cmath>class Point {
public:double x, y;Point() {}Point(double a, double b) :x(a), y(b) {}void in() {scanf(" %lf %lf", &x, &y);}double dis() {return sqrt(x * x + y * y);}void operator -=(Point& p) {x -= p.x;y -= p.y;}void operator +=(Point& p) {x += p.x;y += p.y;}void operator *=(double d) {x *= d;y *= d;}void operator /=(double d) {this ->operator*= (1 / d);}
};class Circle
{
public:Point center;double r;Circle(Point &c, double a):center(c), r(a){}Circle();void in() {center.in();scanf("%lf", &r);}};Circle::Circle()
{
}void solve() {Point P, Q, P1, Q1, M;int T;Circle c;scanf("%d", &T);while (T--) {scanf("%lf", &c.r);c.center = Point(0, 0);int a, b;scanf("%d %d", &a, &b);P.x = a;P.y = b;scanf("%d %d", &a, &b);Q.x = a;Q.y = b;if (P.dis() < 1e-6) {printf("%8f\n", 2*c.r);continue;}// 求反演点double k = c.r * c.r / P.dis() / P.dis();P1 = P;P1 *= k;Q1 = Q;Q1 *= k;// 计算中点M = P1;M += Q1;M /= 2;P1 -= Q1;double d = P1.dis();// 判断相离情况if (M.dis() > c.r) {double md = M.dis() - c.r;Q1 = Point(md, d/2);d = Q1.dis() * 2;}d *= P.dis() / c.r;printf("%.8f\n", d);}
}int main() {solve();return 0;
}/*
4
4
4 0
0 4
4
0 3
3 0
4
0 2
2 0
4
0 1
1 0*/

本人码农,希望通过自己的分享,让大家更容易学懂计算机知识。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/48093.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软考高级架构师下篇-12层次式架构设计理论与实践

目录 1. 考情分析2. 层次式体系结构概述3. 表现层框架设计4. 中间层框架设计5. 数据访问层设计6. 数据架构规划与设计7. 物联网层次架构设计8. 前文回顾1. 考情分析 根据考试大纲,层次式架构设计理论与实践知识点会涉及单选题型(约占2~5分)和案例题(25分),本小时内容偏重于方…

三分钟解决AE缓存预览渲染错误、暂停、卡顿问题

一、清除RAM缓存&#xff08;内存&#xff09; 你应该做的第一件事是清除你的RAM。这将清除当前存储在内存中的所有临时缓存文件。要执行此操作&#xff0c;请导航到编辑>清除>所有内存。这将从头开始重置RAM缓存 二、清空磁盘缓存 您也可以尝试清空磁盘缓存。执行此操作…

实现chatGPT 聊天样式

效果图 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Chat Example</title&g…

SpringBoot解决mysql 连接8小时问题

SpringBoot解决mysql 连接8小时问题 问题&#xff1a; 服务连接mysql数据库&#xff0c;8小时没有数据库的操作时候&#xff0c;数据库会主动断开连接释放资源 解决办法总共4种方法 MySQL 5版本之前可以通过在URL后面加入autoReconnecttrue application.properties文件中加入…

第6天----【位运算进阶之-----位与()】七夕特别版

今天我们来学习C语言的位与。 ❤️C语言的位与&#xff08;&&#xff09;操作是一种按位运算符&#xff0c;用于对两个操作数的每个对应位执行逻辑与操作。它的操作规则如下&#xff1a; 如果两个操作数的对应位都为1&#xff0c;则结果的对应位也为1。&#xff08;全1才…

【Cadence】差分管噪声贡献差别很大的可能原因

举例&#xff1a;M2 M3是一对差分管&#xff0c;噪声贡献差别很大。 理想电感下二者贡献相同&#xff0c; 但在实际电磁仿真后&#xff0c;一个17.6%&#xff0c;一个5.6% 原因是&#xff1a; 电磁仿真存在交叉&#xff0c;不对称&#xff0c;中心抽头不是理想的交流地&#x…

初识C语言

目录 一、C语言的概念 二、第一个C语言程序 三、数据类型 四、变量和常量 4.1 变量定义方法 4.2 变量的命名 4.3 变量的分类 4.4 变量的作用域和生命周期 4.5 常量 五、字符串和转义字符 5.1 字符串 5.2 转义字符 六、注释 七、选择语句 八、循环语句 九、函数 十、数…

如何使用CSS实现一个全屏滚动效果(Fullpage Scroll)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 实现全屏滚动效果的CSS和JavaScript示例⭐ HTML 结构⭐ CSS 样式 (styles.css)⭐ JavaScript 代码 (script.js)⭐ 实现说明⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦…

node_modules.cache是什么东西

一开始没明白这是啥玩意&#xff0c;还以为是npm的属性&#xff0c;网上也没说过具体的来源出处 .cache文件的产生是由webpack4的插件cache-loader生成的&#xff0c;node_modules里下载了cache-loader插件&#xff0c;很多朋友都是vuecli工具生成的项目&#xff0c;内置了这部…

以创新点亮前路,戴尔科技开辟数实融合新格局

编辑&#xff1a;阿冒 设计&#xff1a;沐由 2023年&#xff0c;对于戴尔科技而言是特殊的一年&#xff0c;这是戴尔科技进入中国市场第25个年头——“巧合”的是&#xff0c;这25年也是中国产业经济发展最快&#xff0c;人们工作与生活发生变化最大的四分之一个世纪。 2023年&…

《Go 语言第一课》课程学习笔记(九)

常量&#xff1a;Go 在“常量”设计上的创新有哪些&#xff1f; Go 语言在常量方面的创新包括下面这几点&#xff1a; 支持无类型常量&#xff1b;支持隐式自动转型&#xff1b;可用于实现枚举。 常量 Go 语言的常量是一种在源码编译期间被创建的语法元素。这是在说这个元素…

mysql全文检索使用

数据库数据量10万左右&#xff0c;使用like %test%要耗费30秒左右&#xff0c;放弃该办法 使用mysql的全文检索 第一步:建立索引 首先修改一下设置: my.ini中ngram_token_size 1 可以通过 show variables like %token%;来查看 接下来建立索引:alter table 表名 add f…

RocketMQ与Kafka对比(18项差异)

淘宝内部的交易系统使用了淘宝自主研发的Notify消息中间件,使用MySQL作为消息存储媒介,可完全水平扩容,为了进一步降低成本,我们认为存储部分可以进一步优化,2011年初,Linkin开源了Kafka这个优秀的消息中间件,淘宝中间件团队在对Kafka做过充分Review之后,Kafka无限消息…

Python 离线环境下批量安装第三方模块

当前环境&#xff1a;Win10 x64 Python 3.7 ,准备将这些包安装到 Win7 x86 Python 3.7 机器上。 1 查看安装好 Python 后的包C:\Users\lenovo>pip list Package Version ---------- ------- pip 23.2.1 setuptools 47.1.0 wheel 0.40.02 pip 安装所需要的…

8.18 校招 内推 面经

绿泡泡&#xff1a; neituijunsir 交流裙&#xff0c;内推/实习/校招汇总表格 1、校招 | 小米集团2024届全球校园招聘正式启动&#xff08;内推&#xff09; 校招 | 小米集团2024届全球校园招聘正式启动&#xff08;内推&#xff09; 2、2023校招总结--软件测试岗位 - 2 2…

.Net程序调试时接受外部命令行参数方式

1.对项目右键&#xff0c;属性 2.在调试中打开常规&#xff0c;打开调试启动配置文件UI 3.输入需要的命令行参数

el-table数据更新了,但是展示并没有更新

这是因为有时候vue无法监听到数据的变化&#xff0c;导致数据变化但是视图没有变化 解决办法&#xff1a;&#xff08;可以从上往下一条一条进行尝试&#xff09; 法一&#xff1a;使用this.$set进行数据的更新 法二&#xff1a;在数据更新完后执行this.$forceUpdate();进行强制…

交叉编译工具链arm-linux-gnueabihf的安装-ubuntu 20.04

前面下载安装步骤参考该博主的文章 http://t.csdn.cn/ZbjFX 另&#xff1a;本人对所遇到的环境变量的配置问题作补充 1.修改环境变量 建议直接在.bashrc文件作修改 &#xff0c;修改方式相同 ( vi :视自己的编辑器而定) sudo vi ~/.bashrc 2.修改环境变量后&#xff0c;可…

网络安全领域的常见攻击方式及防御手段

目录 重放攻击&#xff08;Replay Attack&#xff09;防御手段 SQL 注入&#xff08;SQL Injection&#xff09;防御手段 跨站脚本攻击&#xff08;Cross-Site Scripting&#xff0c;XSS&#xff09;防御手段 跨站请求伪造&#xff08;Cross-Site Request Forgery&#xff0c;C…

idea 左下角的Git(Version Control)中显示Local Changes窗口

打开Local Changes窗口来查看当前Git仓库的本地变更。 使用快捷键: - Windows: Alt9 - Mac: Cmd9 解决&#xff1a; &#xff08;1&#xff09;idea打开settings &#xff08;2&#xff09;点击Version Control窗口选项卡&#xff0c;选择Commit选项&#xff0c;对 Use.... in…