一、问题提出

假如曲线外有一个点,如果这个曲线是直线,求这个点到直线的距离最近的点,则比较好求,直接作垂直线,再求交点即可。但是,如果这个曲线不是直线,而是一个任意弯曲的函数曲线甚至是一个参数方程形式的曲线,该如何求解呢?

二、解决方案

1、对于求一个点到任意函数曲线这种情况,我是通过搜索法实现的。设有函数曲线外有一个点,现在以为圆心,半径依次为(半径线性递增或指数递增等)画圆,直到画出的圆能够与函数曲线相交。判断圆与曲线是否相交的方法如下:如画一个半径为的圆,则对应的范围为,通过对进行0.01的细分,求出每个细分点的,当出现细分点的距离小于所画的半径时,则认为圆内已经含有最近的点了,此时的必有个细分点到的距离为最小,我们可以认为此细分点即是所求。下图形象的表示出了实现原理。

2、对于一个点到任意曲线方程最近点的方法,也可以通过搜索法实现。但是曲线方程与函数不同,函数是y关于x的函数,只需要通过搜索x即可找到最近点。但是曲线方程或者说参数方程,它的x,y都是关于第三个参数的函数,假如给定一个点,求它到曲线最近距离的点。此时提出两种方法。

第一种方法,总体仍然仿照上述函数曲线的方法进行搜索,直到找到最近的点。首先求解当曲线上点为或为时,参数t对应的值,然后以为起始点进行上下搜索,现在假设第一次设定搜索半径为0.1,通过对进行上下搜索,确定对应的的范围,然后仿照函数曲线的方法依次进行搜索即可。需要注意的是,所求对应的,它们代表的是横向搜索或纵向搜索,假如求出的是两个或两个以上的值,则需要同时分别对所求的所有值使用上述方法搜索,哪个先圈到圆内,则是哪个点,如果有两个以上的t同时圈到圆内,则距离最近的那个点就是所求的点。这种方法实际上是有局限性的,局限性一,如果的取值范围不确定,而曲线方程本身所取到的x,y值被限定在了一定的范围内,假如此时距离曲线方程本身的点较远,这种方法就可能失效。局限性二,需要求求对应的值,有的时候不是很好求解。

第二种方法是,假如已经知道距离最近的点所对应值的范围,则可以直接按一定精度细分,然后通过搜索法求距离最短的即可,该方法比较简单,不再赘述。

三、Matlab代码实现

函数曲线外一点(-1.0,-1.5)到函数曲线最短距离的点。按照第二节第一部分所述的方法,其Matlab实现代码如下:

clear;
clc
close all
K=0.15;
plan_x=-10:0.001:10;
plan_y=K*plan_x.*plan_x;
figure(1)
plot(plan_x,plan_y);real_loc_x=-1.0;
real_loc_y=-1.5;
cycles_count=1;
subdivision_scope=0.1;
subdivision_degree=0.01;
subdivision_x_value=0.0;
point_center_min_distance=99999.0;
point_center_x_min_value=0.0;
while point_center_min_distance>subdivision_scope*cycles_count       for subdivision_x_value=(real_loc_x-cycles_count*subdivision_scope):subdivision_degree:(real_loc_x+cycles_count*subdivision_scope);point_center_distance=sqrt((subdivision_x_value-real_loc_x)^2+(K*subdivision_x_value^2-real_loc_y)^2);if point_center_distance<point_center_min_distancepoint_center_min_distance=point_center_distance;point_center_x_min_value=subdivision_x_value;end                endcycles_count=cycles_count+1;
end
dis_min_xy_buf(1)=point_center_x_min_value;
dis_min_xy_buf(2)=K*dis_min_xy_buf(1)^2;
hold on
plot(dis_min_xy_buf(1),dis_min_xy_buf(2),'b.','MarkerSize',10);
plot(real_loc_x,real_loc_y,'r.','MarkerSize',10);

运行结果如下:

所得的结果为[-0.68,0.06936],在为0.01的精度范围内是可信的。

求任意一个点到任意函数曲线或曲线方程(参数方程)上最近距离点的通用方法,含Matlab实现代码相关推荐

  1. C语言编程练习 6.验证卡布列克运算。即:任意一个四位数,只要它们各个位上的数字是不全相同的,就有这样的规律

    题目描述: *验证卡布列克运算.即:任意一个四位数,只要它们各个位上的数字是不全相同的,就有这样的规律: (1)将组成该四位数的四个数字由大到小排列,形成由这四个数字构成的最大的四位数: (2)将组成 ...

  2. Bellman_Ford算法(求一个点到任意一点的最短距离)

    单源最短路问题是固定一个起点,求它到任意一点最短路的问题. 记从起点出发到顶点 i 的最短距离为d[i],则有以下等式成立 d[i]=min{d[j]+(从j到 i 的边的权值) 看代码 #inclu ...

  3. 编写一个带有main函数的类,调用上面的汽车类,实例化奔驰、大众、丰田等不同品牌和型号,模拟开车过程:启动、加速、转弯、刹车、息火,实时显示速度。...

    //程序入口     public static void main(String[] args) {         // TODO Auto-generated method stub       ...

  4. linux c sort 函数,关于算法:Linux上的“快速选择”(或类似方法)实现? (而不是sort | uniq -c | sort -rn | head-$ N)...

    问题:我经常需要查看特定日志的最后一天中最频繁重复的"模式".就像这里的一小部分tomcat日志一样: GET /app1/public/pkg_e/v3/555413242345 ...

  5. 算法动画 - 理解函数曲线

    这篇梳理一些有关算法动画的生成思路. 用算法生成动画,大致可分成两类.一类是基于时间( time-based ),一类是基于帧( frame-based ).其中有何区别,我们先通过两段 Proces ...

  6. c语言中scanf(%7.2f,a);合法吗,C语言,语句scanf(7.2f,a);是一个合法的scanf函数?...

    首先,这个语句显然是有问题的,但是能编译通过,说明是合法的.那么我们就需要弄清楚编译器是怎么理解这条语句的,以及运行时这条语句做了什么. 原问题是"C语言,语句scanf("7.2 ...

  7. C语言计算数字乘积根,c语言,求任意一个整数各位数字之积

    点击查看c语言,求任意一个整数各位数字之积具体信息 答:求整数各位和,将整数各个位分离出来的方法(除10取模)很常用. 函数如下 int intsum(int n) { int sum = 0; wh ...

  8. [置顶] C语言实验:输入任意一个日期的年、月、日的值,求出从公元1年1月1日到这一天总共有多少天,并求出这一天是星期几。...

    要求:输入任意一个日期的年.月.日的值,求出从公元1年1月1日到这一天总共有多少天,并求出这一天是星期几. 简单的循环结构,并结合基姆拉尔森公式,注意月份转换. 下面是源码,仅供参考: #includ ...

  9. 动画函数,为任意一个元素移动到指定的目标位置

    一.动画缓冲函数 /*** 动画函数* 任意一个元素移动到指定的目标位置* @param {*} element 任意一个元素* @param {*} target 目标位置(number类型)*/ ...

  10. c语言编程求百位和个位的差,对任意一个键盘输入的3位整数,求出它的个位、十位和百位。 一道c语言题目?...

    #include int main(){ int n; int d=0,t=0,h=0,m; scanf("%d",&n); m=n; d=n%10; n=n/10; t= ...

最新文章

  1. node mysql 批量写入_请问如何使用node.js在MySQL中进行批量插入
  2. Douglas-Peucker算法
  3. 【为自己相亲】单身小姐姐你在哪里,我是书豪,我在等你
  4. Asterisk学习进阶-3
  5. MySQL—修改数据库root用户密码
  6. mac应用打包成为dmg的方法
  7. [转]用C++实现插件体系结构
  8. Scala 隐式转换和隐式参数
  9. latex 导出的pdf生成书签 目录
  10. 封装自己的DB类(PHP)
  11. 无人机起降(2):AcFly飞控模块与M8N GPS模块的接口修改
  12. 语音验证码api 手机接听验证码
  13. 《Redis视频教程》(p5)
  14. 山海经电子书古文/翻译白话文版发布,免费电子书。
  15. 鲁四海解读中国大数据发展10大趋势5大挑战
  16. ES自动化集群搭建脚本shell
  17. 胶装一般多少钱一本?网上打印资料胶装便宜的地方
  18. 简单到出人意料的CNN图像分类策略
  19. 毫米波雷达在无人机避障系统中的应用
  20. org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acce

热门文章

  1. Google Chrome Top60 实用插件集合
  2. ccf中文期刊目录_中国计算机学会CCF推荐中文科技期刊目录
  3. 天知道-网络应用-Vue小案例-黑马程序员
  4. java课程设计实验报告_《java课程设计实验报告.doc
  5. 在dw中它只能对html文件进行编辑,DreamWeaver期末考试试卷
  6. 一文读懂什么是硬件开发、智能硬件、硬件系统?
  7. 主题:一个成功的RIA技术需要满足的条件(转)
  8. CentOS7 安装 oracle 10g
  9. 计算机毕业论文数据挖掘,数据挖掘论文范文
  10. 几个不错的网站(转)