求任意一个点到任意函数曲线或曲线方程(参数方程)上最近距离点的通用方法,含Matlab实现代码
一、問(wèn)題提出
假如曲線外有一個(gè)點(diǎn),如果這個(gè)曲線是直線,求這個(gè)點(diǎn)到直線的距離最近的點(diǎn),則比較好求,直接作垂直線,再求交點(diǎn)即可。但是,如果這個(gè)曲線不是直線,而是一個(gè)任意彎曲的函數(shù)曲線甚至是一個(gè)參數(shù)方程形式的曲線,該如何求解呢?
二、解決方案
1、對(duì)于求一個(gè)點(diǎn)到任意函數(shù)曲線這種情況,我是通過(guò)搜索法實(shí)現(xiàn)的。設(shè)有函數(shù)曲線外有一個(gè)點(diǎn),現(xiàn)在以為圓心,半徑依次為(半徑線性遞增或指數(shù)遞增等)畫圓,直到畫出的圓能夠與函數(shù)曲線相交。判斷圓與曲線是否相交的方法如下:如畫一個(gè)半徑為的圓,則對(duì)應(yīng)的范圍為,通過(guò)對(duì)進(jìn)行0.01的細(xì)分,求出每個(gè)細(xì)分點(diǎn)的,當(dāng)出現(xiàn)細(xì)分點(diǎn)到的距離小于所畫的半徑時(shí),則認(rèn)為圓內(nèi)已經(jīng)含有最近的點(diǎn)了,此時(shí)的必有個(gè)細(xì)分點(diǎn)到的距離為最小,我們可以認(rèn)為此細(xì)分點(diǎn)即是所求。下圖形象的表示出了實(shí)現(xiàn)原理。
?
2、對(duì)于一個(gè)點(diǎn)到任意曲線方程最近點(diǎn)的方法,也可以通過(guò)搜索法實(shí)現(xiàn)。但是曲線方程與函數(shù)不同,函數(shù)是y關(guān)于x的函數(shù),只需要通過(guò)搜索x即可找到最近點(diǎn)。但是曲線方程或者說(shuō)參數(shù)方程,它的x,y都是關(guān)于第三個(gè)參數(shù)的函數(shù),假如給定一個(gè)點(diǎn),求它到曲線最近距離的點(diǎn)。此時(shí)提出兩種方法。?
第一種方法,總體仍然仿照上述函數(shù)曲線的方法進(jìn)行搜索,直到找到最近的點(diǎn)。首先求解當(dāng)曲線上點(diǎn)為或?yàn)闀r(shí),參數(shù)t對(duì)應(yīng)的值,然后以為起始點(diǎn)進(jìn)行上下搜索,現(xiàn)在假設(shè)第一次設(shè)定搜索半徑為0.1,通過(guò)對(duì)進(jìn)行上下搜索,確定對(duì)應(yīng)的的范圍,然后仿照函數(shù)曲線的方法依次進(jìn)行搜索即可。需要注意的是,所求或?qū)?yīng)的,它們代表的是橫向搜索或縱向搜索,假如求出的是兩個(gè)或兩個(gè)以上的值,則需要同時(shí)分別對(duì)所求的所有值使用上述方法搜索,哪個(gè)先圈到圓內(nèi),則是哪個(gè)點(diǎn),如果有兩個(gè)以上的t同時(shí)圈到圓內(nèi),則距離最近的那個(gè)點(diǎn)就是所求的點(diǎn)。這種方法實(shí)際上是有局限性的,局限性一,如果的取值范圍不確定,而曲線方程本身所取到的x,y值被限定在了一定的范圍內(nèi),假如此時(shí)距離曲線方程本身的點(diǎn)較遠(yuǎn),這種方法就可能失效。局限性二,需要求求或?qū)?yīng)的值,有的時(shí)候不是很好求解。
第二種方法是,假如已經(jīng)知道距離最近的點(diǎn)所對(duì)應(yīng)值的范圍,則可以直接按一定精度細(xì)分,然后通過(guò)搜索法求距離最短的即可,該方法比較簡(jiǎn)單,不再贅述。
三、Matlab代碼實(shí)現(xiàn)
求函數(shù)曲線外一點(diǎn)(-1.0,-1.5)到函數(shù)曲線最短距離的點(diǎn)。按照第二節(jié)第一部分所述的方法,其Matlab實(shí)現(xiàn)代碼如下:
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);?運(yùn)行結(jié)果如下:
?所得的結(jié)果為[-0.68,0.06936],在為0.01的精度范圍內(nèi)是可信的。
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的求任意一个点到任意函数曲线或曲线方程(参数方程)上最近距离点的通用方法,含Matlab实现代码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Android Sdk 国内镜像下载地址
- 下一篇: 学计算机需要多少内存,电脑内存多大才够用