计算方法实验1:圆形镜面成像问题

二维平面上的镜面反射示意图
在这里插入图片描述
在这里插入图片描述

Algorithm Description

T ( c o s θ , s i n θ ) T(cos\theta,sin\theta) T(cosθ,sinθ),则有
P T + Q T = ( P x − c o s θ ) 2 + s i n 2 θ + ( Q x − c o s θ ) 2 + ( Q y − s i n θ ) 2 PT+QT=\sqrt{(P_x-cos\theta)^2+sin^2\theta}+\sqrt{(Q_x-cos\theta)^2+(Q_y-sin\theta)^2} PT+QT=(Pxcosθ)2+sin2θ +(Qxcosθ)2+(Qysinθ)2
P T + Q T = P x 2 − 2 P x c o s θ + 1 + Q x 2 + Q y 2 + 1 − 2 Q x c o s θ − 2 Q y s i n θ PT+QT=\sqrt{P_x^2-2P_xcos\theta+1}+\sqrt{Q_x^2+Q_y^2+1-2Q_xcos\theta-2Q_ysin\theta} PT+QT=Px22Pxcosθ+1 +Qx2+Qy2+12Qxcosθ2Qysinθ
由费马原理,光线沿 P T + Q T PT+QT PT+QT最短的路径传播,因此只需对上式求导求极小值点。关于 θ \theta θ求导得
P x s i n θ P x 2 − 2 P x c o s θ + 1 + Q x s i n θ − Q y c o s θ Q x 2 + Q y 2 + 1 − 2 Q x c o s θ − 2 Q y s i n θ \frac{P_xsin\theta}{\sqrt{P_x^2-2P_xcos\theta+1}}+\frac{Q_xsin\theta-Q_ycos\theta}{\sqrt{Q_x^2+Q_y^2+1-2Q_xcos\theta-2Q_ysin\theta}} Px22Pxcosθ+1 Pxsinθ+Qx2+Qy2+12Qxcosθ2Qysinθ QxsinθQycosθ
故只需用二分法解非线性方程
P x s i n θ Q x 2 + Q y 2 + 1 − 2 Q x c o s θ − 2 Q y s i n θ + ( Q x s i n θ − Q y c o s θ ) P x 2 − 2 P x c o s θ + 1 = 0 P_xsin\theta\sqrt{Q_x^2+Q_y^2+1-2Q_xcos\theta-2Q_ysin\theta}+(Q_xsin\theta-Q_ycos\theta)\sqrt{P_x^2-2P_xcos\theta+1}=0 PxsinθQx2+Qy2+12Qxcosθ2Qysinθ +(QxsinθQycosθ)Px22Pxcosθ+1 =0
T x = c o s θ T_x=cos\theta Tx=cosθ
T y = s i n θ T_y=sin\theta Ty=sinθ
由对称性易知
R x = 2 Q y − Q x t a n θ − k Q x + k ( 2 T x − Q x ) − 2 T y k − t a n θ Rx=\frac{2Q_y-Qxtan\theta -kQ_x +k(2Tx - Qx) - 2Ty}{k-tan\theta} Rx=ktanθ2QyQxtanθkQx+k(2TxQx)2Ty
R y = Q y − ( Q x − R x ) θ Ry=Qy-(Qx - Rx)\theta Ry=Qy(QxRx)θ

Code

#include<iostream>
#include<cmath>
#include <iomanip>
using namespace std;

int main(int argc, char *argv[])
{
    if(argc != 4) {
        cout << "Usage: " << argv[0] << " <Px> <Qx> <Qy>\n";
        return 1;
    }

    long double Px = stold(argv[1]);
    long double Qx = stold(argv[2]);
    long double Qy = stold(argv[3]);

    if(Px >= -1 || Qx >= 0 || Qy <= 0 || Qx * Qx + Qy * Qy <= 1) {
        cout << "输入错误,Px应该小于-1,Qx应该小于0,Qy应该大于0,Qx^2+Qy^2应该大于1\n";
        return 1;
    }
    
    long double Tx = 0;
    long double Ty = 0;
    long double theta = 0;
    long double low = 3.14159265358979323 , high = 1.570796326794896;
    long double k = 0;
    while(1)
    {
        theta = (low + high) / 2;
        long double eq1 = Px * sin(theta);
        long double eq2 = sqrt(Qx * Qx + Qy * Qy +1 - 2 * Qx * cos(theta) - 2 * Qy * sin(theta));
        long double eq3 = (Qx * sin(theta) - Qy * cos(theta));
        long double eq4 = sqrt(Px * Px -2 * Px * cos(theta) + 1);
        long double res = eq1 * eq2 + eq3 * eq4;
        long double absres = abs(res);
        if(absres <= 1e-7)
        {
            Tx = cos(theta);
            Ty = sin(theta);
            k = 1 / tan(3.14159265358979323 - theta);
            break;
        }
        else if(res > 0)
        {
            low = theta;
        }
        else
        {
            high = theta;
        }
    }
    long double eq5 = 2 * Qy - Qx * tan(theta) + k * (2 * Tx - Qx) - 2 * Ty;
    long double eq6 = k - tan(theta); 
    long double Rx = eq5 / eq6;
    long double Ry = Qy - tan(theta) * (Qx - Rx);
    cout << "T = (" << fixed << setprecision(6) << Tx << " , " << fixed << setprecision(6) << Ty << ") , R = (" << fixed << setprecision(6) << Rx << " , " << fixed << setprecision(6) << Ry << ")";
    return 0;
}

Results

P = ( − 2 , 0 ) , Q = ( − 1 , 1 ) : T = ( − 0.885670 , 0.464316 ) , R = ( − 0.380057 , 0.674993 ) P = (-2, 0), Q = (-1, 1):T = (-0.885670, 0.464316), R = (-0.380057, 0.674993) P=(2,0),Q=(1,1):T=(0.885670,0.464316),R=(0.380057,0.674993)

P = ( − 10 , 0 ) , Q = ( − 2 , 1 ) : T = ( − 0.959312 , 0.282350 ) , R = ( 0.304214 , 0.321811 ) P = (-10, 0), Q = (-2, 1): T = (-0.959312, 0.282350), R = (0.304214, 0.321811) P=(10,0),Q=(2,1):T=(0.959312,0.282350),R=(0.304214,0.321811)

P = ( − 1.000001 , 0 ) , Q = ( − 2 , 2 ) : T = ( − 1.000000 , 0.000002 ) , R = ( 0.000007 , 1.999996 ) P = (-1.000001, 0), Q = (-2, 2):T = (-1.000000 , 0.000002) , R = (0.000007 , 1.999996) P=(1.000001,0),Q=(2,2):T=(1.000000,0.000002),R=(0.000007,1.999996)

P = ( − 2 , 0 ) , Q = ( − 1 , 0.000001 ) : T = ( − 1.000000 , 0.000001 ) , R = ( − 1.000000 , 0.000001 ) P = (-2, 0), Q = (-1, 0.000001):T = (-1.000000 , 0.000001) , R = (-1.000000 , 0.000001) P=(2,0),Q=(1,0.000001):T=(1.000000,0.000001),R=(1.000000,0.000001)

P = ( − 2.33 , 0 ) , Q = ( − 3 , 1 ) : T = ( − 0.989279 , 0.146038 ) , R = ( 1.182424 , 0.382590 ) P = (-2.33, 0), Q = (-3, 1):T = (-0.989279 , 0.146038) , R = (1.182424 , 0.382590) P=(2.33,0),Q=(3,1):T=(0.989279,0.146038),R=(1.182424,0.382590)

P = ( − 3 , 0 ) , Q = ( − 1 , 0.5 ) : T = ( − 0.922615 , 0.385721 ) , R = ( − 0.786920 , 0.410917 ) P = (-3, 0), Q = (-1, 0.5):T = (-0.922615 , 0.385721) , R = (-0.786920 , 0.410917) P=(3,0),Q=(1,0.5):T=(0.922615,0.385721),R=(0.786920,0.410917)

P = ( − 3 , 0 ) , Q = ( − 2 , 10 ) : T = ( − 0.827028 , 0.562160 ) , R = ( 8.380296 , 2.944148 ) P = (-3, 0), Q = (-2, 10):T = (-0.827028 , 0.562160) , R = (8.380296 , 2.944148) P=(3,0),Q=(2,10):T=(0.827028,0.562160),R=(8.380296,2.944148)

P = ( − 3 , 0 ) , Q = ( − 3 , 1 ) : T = ( − 0.987408 , 0.158192 ) , R = ( 1.187435 , 0.329136 ) P = (-3, 0), Q = (-3, 1):T = (-0.987408 , 0.158192) , R = (1.187435 , 0.329136) P=(3,0),Q=(3,1):T=(0.987408,0.158192),R=(1.187435,0.329136)

P = ( − 10 , 0 ) , Q = ( − 2 , 1 ) : T = ( − 0.959312 , 0.282350 ) , R = ( 0.304214 , 0.321811 ) P = (-10, 0), Q = (-2, 1):T = (-0.959312 , 0.282350) , R = (0.304214 , 0.321811) P=(10,0),Q=(2,1):T=(0.959312,0.282350),R=(0.304214,0.321811)

P = ( − 1024 , 0 ) , Q = ( − 8 , 4 ) : T = ( − 0.970066 , 0.242842 ) , R = ( 7.000894 , 0.244735 ) P = (-1024, 0), Q = (-8, 4):T = (-0.970066 , 0.242842) , R = (7.000894 , 0.244735) P=(1024,0),Q=(8,4):T=(0.970066,0.242842),R=(7.000894,0.244735)

Conclusion

本实验提高精度的主要措施:

  1. 使用long double 类型;

  2. 用较多位数来表示 π \pi π

  3. 将含有除法的方程交叉相乘,通过乘法代替除法,以减少在求商时的误差;

  4. 在用二分法解非线性方程时,限制条件是结果的绝对值 ≤ 1 0 − 7 \leq10^{-7} 107

但由于本实验的方程较为复杂,含有三角函数、根式、平方等易造成误差放大的因素,暂时还未找到其他较好的减少误差的办法,但还尝试了另一种思路,叙述如下:

设OT的延长线交PQ于R,则由角平分线定理,有 Q T P T = Q R R P = Q y R y − 1 \frac{QT}{PT}=\frac{QR}{RP}=\frac{Q_y}{R_y}-1 PTQT=RPQR=RyQy1
T ( x , y ) , k = Q y Q x − P x T(x,y),k=\frac{Qy}{Qx-Px} T(x,y),k=QxPxQy,带入上述方程化简得:
Q y 2 ( k x − y ) 2 + k 2 P x 2 y 2 − 2 k Q y P x y ( k x − y ) k 2 P x 2 y 2 = Q y 2 + Q x 2 + 1 − 2 y Q y − 2 x Q x 1 + P x 2 − 2 x P x \frac{Q_y^2(kx-y)^2+k^2P_x^2y^2-2kQ_yPxy(kx-y)}{k^2Px^2y^2}=\frac{Q_y^2+Q_x^2+1-2yQ_y-2xQ_x}{1+P_x^2-2xP_x} k2Px2y2Qy2(kxy)2+k2Px2y22kQyPxy(kxy)=1+Px22xPxQy2+Qx2+12yQy2xQx
故只需用for循环遍历或二分法解非线性方程 ( Q y 2 ( k x − y ) 2 + k 2 P x 2 y 2 − 2 k Q y P x y ( k x − y ) ) ( 1 + P x 2 − 2 x P x ) − ( k 2 P x 2 y 2 ) ( Q y 2 + Q x 2 + 1 − 2 y Q y − 2 x Q x ) = 0 (Q_y^2(kx-y)^2+k^2P_x^2y^2-2kQ_yPxy(kx-y))(1+P_x^2-2xP_x)-(k^2Px^2y^2)(Q_y^2+Q_x^2+1-2yQ_y-2xQ_x)=0 (Qy2(kxy)2+k2Px2y22kQyPxy(kxy))(1+Px22xPx)(k2Px2y2)(Qy2+Qx2+12yQy2xQx)=0
y = 1 − x 2 y=\sqrt{1-x^2} y=1x2

由对称性易知
R x = Q x T y T x + T x ( 2 T x − Q x ) T y + 2 T y − 2 Q y T x T y + T y T x Rx=\frac{\frac{QxTy}{Tx} + \frac{Tx(2Tx - Qx)}{Ty} + 2Ty -2Qy}{\frac{Tx}{Ty}+\frac{Ty}{Tx}} Rx=TyTx+TxTyTxQxTy+TyTx(2TxQx)+2Ty2Qy
R y = Q y − T y T x ( Q x − R x ) Ry=Qy-\frac{Ty}{Tx(Qx - Rx)} Ry=QyTx(QxRx)Ty
但验证结果时发现,上述方法在遇到一些极端情况如 P = ( − 1.000001 , 0 ) , Q = ( − 2 , 2 ) P = (-1.000001, 0), Q = (-2, 2) P=(1.000001,0),Q=(2,2)时,中间的运算过程会出现极小的浮点数导致无法继续运算,所以这种思路在细节上仍有待改进。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

苹果Apple Watch将有更多新手势,智能穿戴将被赋予Find My功能

根据美国商标和专利局&#xff08;USPTO&#xff09;公示的清单&#xff0c;苹果公司获得了一项 Apple Watch 相关技术专利&#xff0c;表明苹果公司正在探索更多的交互手势。 苹果在 watchOS 10.1 更新中&#xff0c;为 Apple Watch 引入了全新的“双指互点两下”手势&#…

智慧公厕对于智慧城市管理的意义

近年来&#xff0c;智慧城市的概念不断被提及&#xff0c;而智慧公厕作为智慧城市管理的重要组成部分&#xff0c;其在监测、管理和养护方面发挥着重要的作用。智慧公厕不仅是城市市容提升的重要保障&#xff0c;还能提升城市环境卫生管理的质量&#xff0c;并有效助力创造清洁…

unity学习(61)——hierarchy和scene的全新认识+模型+皮肤+动画controller

刚刚开始&#xff0c;但又结束的感觉&#xff1f; 1.对hierarchy和scene中的内容有了全新的认识 一定要清楚自己写过几个scene&#xff1b;每个scene之间如何跳转&#xff1b;build setting是add当前的scene。 2.此时的相机需要与模型同级&#xff0c;不能在把模型放在相机下…

服务器开机不输入密码自动进系统, 与设置开机启动项

打开运行[win R ] 输入&#xff1a; control Userpasswords2设置开机启动项 运行 输入 shell:startup在这里插入图片描述

java垃圾回收-三色标记法

三色标记法 引言什么是三色标记法白色灰色黑色 三色标记过程三色标记带来的问题多标问题漏标问题 如何弥补漏标问题增量更新原始快照总结 引言 在CMS,G1这种并发的垃圾收集器收集对象时&#xff0c;假如一个对象A被GC线程标记为不可达对象&#xff0c;但是用户线程又把A对象做…

【C++】手撕红黑树

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;能直接手撕红黑树。 > 毒鸡汤&#xff1a;行到…

Armv8状态寄存器

Processor state AArch64没有与ARMv7当前程序状态寄存器直接对应的寄存器(CPSR)。在AArch64中&#xff0c;传统CPSR的组件以字段的形式提供可独立访问。这些统称为处理器状态(PSTATE)。 在AArch64中&#xff0c;通过执行ERET指令从异常中返回&#xff0c;这会导致要拷贝到PSTAT…

软件测试相关内容第四弹 -- 测试用例与测试分类

写在前&#xff1a;我们已经掌握了关于软件测试的相关内容&#xff0c;知道了基本的测试过程&#xff0c;在做了一段时间的基础测试&#xff0c;熟悉了相关的业务后&#xff0c;测试人员会进行测试用例的编写&#xff0c;在日常测试中&#xff0c;也需要补充测试用例到现有的案…

PyTorch深度学习实战(39)——小样本学习

PyTorch深度学习实战&#xff08;39&#xff09;——小样本学习 0. 前言1. 小样本学习简介2. 孪生网络2.1 模型分析2.2 数据集分析2.3 构建孪生网络 3. 原型网络3. 关系网络小结系列链接 0. 前言 小样本学习 (Few-shot Learning) 旨在解决在训练集中只有很少样本的情况下进行分…

常见的十大网络安全攻击类型

常见的十大网络安全攻击类型 网络攻击是一种针对我们日常使用的计算机或信息系统的行为&#xff0c;其目的是篡改、破坏我们的数据&#xff0c;甚至直接窃取&#xff0c;或者利用我们的网络进行不法行为。你可能已经注意到&#xff0c;随着我们生活中越来越多的业务进行数字化&…

python知识点总结(三)

python知识点总结三 1、有一个文件file.txt大小约为10G&#xff0c;但是内存只有4G&#xff0c;如果在只修改get_lines 函数而其他代码保持不变的情况下&#xff0c;应该如何实现? 需要考虑的问题都有那些?2、交换2个变量的值3、回调函数4、Python-遍历列表时删除元素的正确做…

3/14/24数据结构、线性表

目录 数据结构 数据结构三要素 逻辑结构 存储结构 数据运算 时间复杂度 空间复杂度 线性表 线性表定义 静态分配 动态分配 线性表插入 线性表删除 十天的时间学完了C语言督学课程&#xff0c;最后终于是可以投入到408的科目学习当中。关于数据结构和算法的学习很多部…

智慧城市物联网建设:提升城市管理效率与居民生活品质

目录 一、智慧城市物联网建设的意义 1、提升城市管理效率 2、改善居民生活品质 3、促进城市可持续发展 二、智慧城市物联网建设面临的挑战 1、技术标准与互操作性问题 2、数据安全与隐私保护问题 3、投资与回报平衡问题 三、智慧城市物联网建设的实施策略 1、制定统一…

【Qt】Qt中的常用属性

需要云服务器等云产品来学习Linux可以移步/-->腾讯云<--/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;新用户首次下单享超低折扣。 目录 一、QWidget属性一览 二、属性enabled(可用状态) 三、属性geometry(修改位置和尺寸) 1、QRect类型的结构 2、geome…

实用工具推荐----Mocreak Win Office 自动部署(激活+安装)

Mocreak 该工具包含功能 一键快速下载、安装、激活最新版 Microsoft Office 软件。用户可在安装 Word、PPT、Excel 的同时&#xff0c;根据软件提示&#xff0c;自助安装其它组件&#xff0c;包括&#xff1a; Outlook、OneNote、Access、Visio、Project、Publisher、Teams、…

Python图像处理:3.七种图像分割方法

一、常见图像分割方法 (1)传统算法 阈值分割&#xff08;Thresholding&#xff09;&#xff1a;这是最简单也是应用最广泛的一种分割方法&#xff0c;通过选定一个阈值将图像转换为二值图像&#xff0c;从而分割出目标区域。这种方法适用于图像的前景和背景对比明显的情况。 …

PWM驱动舵机

PWM驱动舵机 接线图 程序结构图&#xff1a; pwm.c部分代码 #include "stm32f10x.h" // Device headervoid PWM_Init(void){// 开启时钟&#xff0c;这里TIM2是通用寄存器RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);// GPIO初始化代…

基于JavaWeb+SSM+Vue“鼻护灵”微信小程序系统的设计和实现

基于JavaWebSSMVue“鼻护灵”微信小程序系统的设计和实现 滑到文末获取源码Lun文目录前言主要技术系统设计功能截图 滑到文末获取源码 Lun文目录 摘 要 3 Abstract 1 1 绪 论 1 1.1研究背景 1 工作的效率。 1 1.2 研究意义 1 1.3研究现状 1 1.4本文组织结构 2 2 技术介绍 3 2…

华为配置终端定位基本实验配置

配置终端定位基本示例 组网图形 图1 配置终端定位基本服务示例 组网需求数据准备配置思路配置注意事项操作步骤配置文件 组网需求 如图1所示&#xff0c;某公司网络中&#xff0c;中心AP直接与RU连接。 管理员希望通过RU收集Wi-Fi终端信息&#xff0c;并提供给定位服务器进行定…

面试知识汇总——Redis高可用(主从、哨兵、集群)

我们在项目中使用Redis&#xff0c;肯定不会是单点部署Redis服务的。因为&#xff0c;单点部署一旦宕机&#xff0c;就不可用了。为了实现高可用&#xff0c;通常的做法是&#xff0c;将数据库复制多个副本以部署在不同的服务器上&#xff0c;其中一台挂了也可以继续提供服务。…