圆的反演 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…

第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年&…

mysql全文检索使用

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

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

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

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…

springBoot防止重复提交

自定义注解AOPRedis 自定义注解 package com.wzw.config.anno;import java.lang.annotation.*;/*** 自定义注解防止表单重复提交*/ Target(ElementType.METHOD) // 注解只能用于方法 Retention(RetentionPolicy.RUNTIME) // 修饰注解的生命周期 Documented public interface …

【微服务学习笔记】认识微服务

【微服务学习笔记】认识微服务 单体架构 分布式架构 微服务架构 SpringCloud 服务拆分和注意事项 服务拆分的案例demo 各个服务之间的数据库都是相互独立的&#xff0c;你不能直接访问对方的数据库&#xff0c;只能从一个服务像另外一个服务发起远程调用 在订单模块的服务中 …

【宝藏系列】一文讲透C语言数组与指针的关系

【宝藏系列】嵌入式 C 语言代码优化技巧【超详细版】 文章目录 【宝藏系列】嵌入式 C 语言代码优化技巧【超详细版】&#x1f468;‍&#x1f3eb;前言1️⃣指针1️⃣1️⃣指针的操作1️⃣2️⃣关于指针定义的争议1️⃣3️⃣对教材错误写法的小看法 2️⃣指针和数组的区别2️⃣…

Azure文件共享

什么是Azure文件共享 Azure文件共享是一种在云中存储和访问文件的服务。它允许用户在不同的计算机、虚拟机和服务之间共享数据&#xff0c;并在应用程序中进行访问、修改和管理。 Azure文件共享可以用于各种用途&#xff0c;例如&#xff1a; 共享文件资源给多个虚拟机或服务…

数学建模大全及优缺点解读

分类模型 1、距离聚类&#xff08;系统聚类&#xff09;&#xff08;常用&#xff0c;需掌握&#xff09; 优点&#xff1a; ①将一批样本数据按照他们在性质上的亲密程度在没有先验知识的情况下自动进行分类 ②是一种探索性的分析方法&#xff0c;分类结果不一定相同 例如&am…

初始C语言(7)——详细讲解有关初阶指针的内容

系列文章目录 第一章 “C“浒传——初识C语言&#xff08;1&#xff09;&#xff08;更适合初学者体质哦&#xff01;&#xff09; 第二章 初始C语言&#xff08;2&#xff09;——详细认识分支语句和循环语句以及他们的易错点 第三章 初阶C语言&#xff08;3&#xff09;——…

NestJS 中的 gRPC 微服务通信

想象一下&#xff0c;你回家过节&#xff0c;你的家人决定聚会。而不是让一个人做所有的烹饪&#xff0c;每个人都同意带上他们擅长制作的特色菜。目标是通过组合所有这些菜肴来制作一顿完整的饭菜。你同意做鸡肉炒饭&#xff0c;你哥哥做甜点蛋糕&#xff0c;妹妹做沙拉。 每…

2022年工作架构分析

mpmw自动化流程工具 schema动态数据 Schema 本身是一个JSON &#xff0c;Schema 通过一些特定字段描述和定义 JSON的数据结构。 最常见的表单通过类XML语法定义。一些库支持通过一些特定结构的 JSON (Schema)来生成类XML标签。 formily 是其中实现之一。 表单设计器通过可视…