圆的反演 hdu 6097

news2024/10/6 0:32:37

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

题目大意

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.coloradmin.cn/o/913533.html

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

相关文章

mysql 8.0 窗口函数 之 序号函数 与 sql server 序号函数 一样

sql server 序号函数 序号函数 ROW_NUMBER() 顺序排序RANK() 并列排序&#xff0c;会跳过重复的序号&#xff0c;比如序号为1&#xff0c;1&#xff0c;3DENSE_RANK() 并列排序&#xff0c;不会跳过重复的序号&#xff0c;比如 序号为 1&#xff0c;1&#xff0c;2 语法结构…

【树莓派打怪升级】:玩转个人Web世界!

文章目录 概述使用 Raspberry Pi Imager 安装 Raspberry Pi OS设置 Apache Web 服务器测试 web 站点安装静态样例站点 将web站点发布到公网安装 Cpolarcpolar进行token认证生成cpolar随机域名网址生成cpolar二级子域名将参数保存到cpolar配置文件中测试修改后配置文件配置cpola…

MFC——base编码和json数据

目录 1. JSON是什么 2. base64是什么 Base64是一种编解码算法 1. JSON是什么 JSON 是一种数据格式。采用完全独立于语言的文本格式, 因为易读, 易写, 易解析的特性成为理想的数据交换语言。主要有三种类型的值:简单值(字符串, 数字, 布尔, null), 对象, 数组。 长这样的数…

AI Agent在情景猜谜场景下的AgentBench基准测试

目录 AgentBench评估哪些场景? 近日,来自清华大学、俄亥俄州立大学和加州大学伯克利分校的研究者设计了一个测试工具——AgentBench,用于评估LLM在多维度开放式生成环境中的推理能力和决策能力。研究者对25个LLM进行了全面评估,包括基于API的商业模型和开源模型。 他们发现…

什么是eval()?eval是用来干什么的?

一、什么是eval()? eval() 是 JavaScript 中的一个全局函数&#xff0c;用于解析并执行传递给它的字符串作为 JavaScript 代码。 二、eval()是用来干什么的&#xff1f; 当调用 eval() 时&#xff0c;它会将传入的字符串参数视为 JavaScript 代码&#xff0c;并在调用位置执…

KEPServerEX 助力选矿厂生产优化升级

背景 客户是一家系统集成商&#xff0c;在山西某选矿厂项目中为业主提供一系列的设备安装及通讯支持&#xff0c;为了更高效节能的完成选矿环节&#xff0c;客户需要对设备实时状态进行精确监控&#xff0c;并将需要的数据记录到数据库中&#xff0c;方便后期进行数据追溯、大数…

【无标题】 欢迎使用Markdown编辑器

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

继承中的构造与析构

思考 如何初始化父类成员&#xff1f; 父类构造函数和子类构造函数有什么关系&#xff1f; 子类对象的构造 子类中可以定义构造函数 子类构造函数 必须对继承而来的成员进行初始化 直接通过初始化列表或者赋值的方式进行初始化调用父类构造函数进行初始化 父类构造函数在子…

实业兴国 守护种源 —— 白露木實®农业的活力之风

高科技领域&#xff0c;芯片是生命线&#xff1b;而在农业领域&#xff0c;种源与芯片在高科技领域的重要性是相同的。保护、发展、培育我国的种质资源&#xff0c;是中国农业发展至为关键的一环。但是&#xff0c;因为思想、观念、认识、技术等方面的原因&#xff0c;让我们错…

营销系统类型有哪些?广州市营销系统开发推荐

营销系统是能够让企业实现与客户的价值交换&#xff0c;并从中获得销售收入的系统。企业的日常经营离不开营销推广活动&#xff0c;为了让用户获得更好的营销体验、也为了企业更快捷简便地提供营销服务&#xff0c;自然少不了对于营销系统的使用。如开利网络蚓链营销系统拥有70…

3D虚拟数字人定制及数字人影片制作方案

在新消费大环境下&#xff0c;各行业正在向着数字化方向发展&#xff0c;数字人是行业进入数字化的主要入口&#xff0c;因此“数字人品牌”的营销模式不断出现于市场&#xff0c;为何品牌偏爱3D虚拟数字人定制&#xff1f; 因为数字人随着惯性动作捕捉技术的应用&#xff0c;成…

如何将数据从 InfluxDB 无缝接入到 TDengine 中?来看看

现在借助 TDengine 3.0 企业版和 TDengine Cloud&#xff0c;你可以无缝接入不同数据源的数据到 TDengine 中了&#xff0c;为了帮助大家更好地应用此功能&#xff0c;我们还输出了系列的教程文章。上期《TDengine 推出重磅功能&#xff0c;助力 MQTT 无缝数据接入》一文为大家…

中小企业如何搭建在线客服中心?

随着人工智能时代的到来&#xff0c;人工智能在企业服务领域的实际场景尤为迫切&#xff0c;对智能客户服务机器人的需求也出现在历史时刻。同时&#xff0c;随着用户对体验的需求不断提高&#xff0c;传统企业的客户服务部门往往陷入一定的自我矛盾循环。 目前&#xff0c;企…

【技术】百度 LBS 地址转换

百度 LBS 地址转换 LBS 简介LBS 案例注册百度账号开发文档创建应用Java 代码请求参数返回参数 LBS 简介 在移动互联网时代&#xff0c;地理定位服务&#xff08;Location-Based Service, LBS&#xff09;成为了许多应用程序的重要功能之一。百度作为中国最大的互联网公司之一&…

c语言(11)

第一题 第二题 第三题 第四题 第五题 第六题 第七题

【C++】基础:常见错误与异常处理

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍常见错误与异常处理。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&a…

IT运维:使用数据分析平台监控 Linux 节点

监控目标 监控 Linux 服务器的基本信息以及各项性能指标&#xff0c;包括&#xff1a; CPU 内存、Swap 网络 文件系统、磁盘 IO 解决方案 使用 Node exporter 收集硬件以及操作系统内核的指标数据&#xff0c;并通过 HTTP API 提供数据 使用 Vector agent 通过 Node export…

家庭装修设计施工团队进度小程序开发演示

传统装修企业获客难、获客成本高、竞争激烈&#xff0c;我们也是基于整个装修市场整体的需求&#xff0c;从用户角度出发帮助装修设计企业设计制作这款小程序。可以让传统装修企业搭上互联网的快车&#xff0c;形成线上获客裂变&#xff0c;降低获客成本提高客户信任度和签单率…

微信小程序 echarts 画多个横向柱状图

然后是json {"usingComponents": {"ec-canvas": "../../common/ec-canvas/ec-canvas"},"navigationBarTitleText": "主题活动" } ec-canvas获取方式 在链接里下载代码 然后copy ec-canvas文件夹到自己的项目 https://gi…

面试官问:说一说 Redis 的过期淘汰策略和内存淘汰策略 ?

目录 1. Redis 的过期淘汰策略 1.1 说一下定期删除的执行流程 2. Redis 的内存淘汰策略 2.1 LRU 和 LFU 有什么区别 3. Redis 中的过期淘汰策略和内存淘汰策略有什么区别 1. Redis 的过期淘汰策略 在了解过期淘汰策略之前&#xff0c;我们首先要知道 Redis 中的键值过期之后…