让微积分穿梭于工作与学习之间(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

相关文章

C#利用Free Spire.XLS for .NET复制Excel工作表

《C#利用FreeSpire.XLSfor.NET复制Excel工作表》在日常的.NET开发中,我们经常需要操作Excel文件,本文将详细介绍C#如何使用FreeSpire.XLSfor.NET... 目录1. 环境准备2. 核心功能3. android示例代码3.1 在同一工作簿内复制工作表3.2 在不同

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

Python中经纬度距离计算的实现方式

《Python中经纬度距离计算的实现方式》文章介绍Python中计算经纬度距离的方法及中国加密坐标系转换工具,主要方法包括geopy(Vincenty/Karney)、Haversine、pyproj... 目录一、基本方法1. 使用geopy库(推荐)2. 手动实现 Haversine 公式3. 使用py

Java中数组与栈和堆之间的关系说明

《Java中数组与栈和堆之间的关系说明》文章讲解了Java数组的初始化方式、内存存储机制、引用传递特性及遍历、排序、拷贝技巧,强调引用数据类型方法调用时形参可能修改实参,但需注意引用指向单一对象的特性... 目录Java中数组与栈和堆的关系遍历数组接下来是一些编程小技巧总结Java中数组与栈和堆的关系关于

setsid 命令工作原理和使用案例介绍

《setsid命令工作原理和使用案例介绍》setsid命令在Linux中创建独立会话,使进程脱离终端运行,适用于守护进程和后台任务,通过重定向输出和确保权限,可有效管理长时间运行的进程,本文给大家介... 目录setsid 命令介绍和使用案例基本介绍基本语法主要特点命令参数使用案例1. 在后台运行命令2.

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

Java中的xxl-job调度器线程池工作机制

《Java中的xxl-job调度器线程池工作机制》xxl-job通过快慢线程池分离短时与长时任务,动态降级超时任务至慢池,结合异步触发和资源隔离机制,提升高频调度的性能与稳定性,支撑高并发场景下的可靠... 目录⚙️ 一、调度器线程池的核心设计 二、线程池的工作流程 三、线程池配置参数与优化 四、总结:线程