让微积分穿梭于工作与学习之间(32):平面上一点到圆弧直线的距离及其在趋于直线时的极限

本文主要是介绍让微积分穿梭于工作与学习之间(32):平面上一点到圆弧直线的距离及其在趋于直线时的极限,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

对CAD圆弧直线不了解的朋友可以先阅读以下博文:

https://blog.csdn.net/iloveas2014/article/details/103837857

https://blog.csdn.net/iloveas2014/article/details/103848611

好久没来写博客了。因为我被人派去研究了别的东西,并且没有什么很独特的心得。

而点到圆弧直线的距离,则是一个比较小的需求(当然底层要经常用),在图形编辑器中用于实现吸附效果。

吸附的规则是,鼠标位置或者被移动对象到线条的距离小于等于某个给定值时,“鼠标”或者物体会被对齐到线条上,因此需要计算点到圆弧直线的距离才能实现。

 

假设直线的方程为

则给定点(x,y)到直线的距离为

 

至于圆弧,书上并没有给出公式。不给出的原因大概是比较简单。给定点P到圆弧的距离正好等于P到圆心的距离和半径的差值,如下图所示。

 

然后,我们把前面圆弧曲线的圆心公式和半径公式搬过来。同时给上图加上更多的标注方便说明。

 

另外给些中间常量会让演算过程看起来简洁点

这样的话,圆心坐标和半径就分别等于

这些公式的推导可以回到15,16篇来回顾。

然后P就是给定点(x,y)

现在我们可以开始代入了

为了避免不必要的麻烦,在展开过程中,我们把绝对值号去掉,即

用有理化法去处理这个式子,发现虽然半径的表达式很简单,但由于格式跟点到圆心的距离公式差别太大,分子有理化后,分母的处理变得相当困难,所以为了这个事情,我一拖再拖,拖了足足一个月,每次难得忙里偷闲去试着推导都以失败告终。

为此我把半径换成起点(用终点也是一样)跟圆心的距离,即

跟OP的区别仅仅是把x换成sx,把y换成了sy。经过这样的一个变通之后,虽然整个式子长了,但是整理起来却简单了不少,十几分钟就演算完了。

此处继续去掉绝对值号进行演算。

这么长的表达式,虽然我在草稿纸上是直接有理化的,但是贴到博客上发现看着蛋疼,所以,既然都用了圆心,那么有理化的时候还是先用Ox和Oy来表示圆心吧。

当然了,Ox和Oy最后还是要替换回去的,因为Ox和Oy都是跟b有关的变量。

经过这样的一波化简后,我们可以把Ox和Oy用带b的表达式套回去了。

在上一篇,我们给出了有理化后分子分母除以x的技巧,那个地方的x是趋于无穷大的,而这里的b是趋于0,所以此处把除改成乘。

分子分母同时乘以b,得到

此时,b没再单独存在于分母里了,可以直接取极限。

这个过程很完美,无需使用夹逼公式,只要对b直接赋值即可得到距离在趋于直线时的极限。

现在我们把中间常量换回已知的条件

然后,我们通过直线的两点式求出直线一般方程的三个系数,看是否跟式子

完全匹配。

把ABC三个值代入,得到

跟前面的结果对照下

发现除了一个绝对值符号以外,其它东西完全一致。而前面我们提到,为了演算过程看起来更清晰,我们把绝对值号去掉了,只要补回去,结果就完全匹配了!

至此,我们正式算出了点到圆弧直线的距离公式,同时兼容直线和圆弧,且无需借助任何条件和夹逼公式。

虽然无需通过条件进行区分,但是它的运算量比分开计算还大,所以在性能要求高的场合,还是不建议合着来写。除非要公式高度统一,或者做更深入的学术研究。

快过年了,祝大家新春快乐,牛气冲天,阖家幸福,我们明年见!

 

 

 

 

 

 

 

 

 

 

这篇关于让微积分穿梭于工作与学习之间(32):平面上一点到圆弧直线的距离及其在趋于直线时的极限的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/247415

相关文章

Vue中组件之间传值的六种方式(完整版)

《Vue中组件之间传值的六种方式(完整版)》组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,针对不同的使用场景,如何选择行之有效的通信方式... 目录前言方法一、props/$emit1.父组件向子组件传值2.子组件向父组件传值(通过事件形式)方

Python实现PDF与多种图片格式之间互转(PNG, JPG, BMP, EMF, SVG)

《Python实现PDF与多种图片格式之间互转(PNG,JPG,BMP,EMF,SVG)》PDF和图片是我们日常生活和工作中常用的文件格式,有时候,我们可能需要将PDF和图片进行格式互转来满足... 目录一、介绍二、安装python库三、Python实现多种图片格式转PDF1、单张图片转换为PDF2、多张图

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

kotlin中的模块化结构组件及工作原理

《kotlin中的模块化结构组件及工作原理》本文介绍了Kotlin中模块化结构组件,包括ViewModel、LiveData、Room和Navigation的工作原理和基础使用,本文通过实例代码给大家... 目录ViewModel 工作原理LiveData 工作原理Room 工作原理Navigation 工

Java对象和JSON字符串之间的转换方法(全网最清晰)

《Java对象和JSON字符串之间的转换方法(全网最清晰)》:本文主要介绍如何在Java中使用Jackson库将对象转换为JSON字符串,并提供了一个简单的工具类示例,该工具类支持基本的转换功能,... 目录前言1. 引入 Jackson 依赖2. 创建 jsON 工具类3. 使用示例转换 Java 对象为

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

java父子线程之间实现共享传递数据

《java父子线程之间实现共享传递数据》本文介绍了Java中父子线程间共享传递数据的几种方法,包括ThreadLocal变量、并发集合和内存队列或消息队列,并提醒注意并发安全问题... 目录通过 ThreadLocal 变量共享数据通过并发集合共享数据通过内存队列或消息队列共享数据注意并发安全问题总结在 J

Java文件与Base64之间的转化方式

《Java文件与Base64之间的转化方式》这篇文章介绍了如何使用Java将文件(如图片、视频)转换为Base64编码,以及如何将Base64编码转换回文件,通过提供具体的工具类实现,作者希望帮助读者... 目录Java文件与Base64之间的转化1、文件转Base64工具类2、Base64转文件工具类3、

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert