求空间中一个点的坐标,这个坐标到n多个直线的距离和最短,n已知,直线方程已知
这个是NP hard的问题,除非死算,没有什么好的办法,但是如果你只是需要近似最优解,可以用启发式算法,比如模拟退火、遗传算法之类。
所谓启发算法,就是说结果很好算,但是算法本身很难,可以通过随机和试探逼近最优解的方法。
也就是先随机选取一些点,然后向某个方向移动,看距离是否缩小,如果是,那么就移动到那个点,再选取周围点,继续。直到选取的点往四周都增大。
直接用高中时所学习到的解析几何知识对点到线段的距离进行求解。其基本思想是先判断点在线段端点、点在线上等等的特殊情况,逐步的由特殊到一般,当忽略点在线段上的特殊情况时,判断点到线段方向的垂线是否落在线段上的方法是通过比较横纵坐标的方式来判断,最后把不同的判断情况用不同的几何方式来进行处理计算得出结果
点到直线的距离是存在平行的直线经过该点,这两条平行直线之间的距离就是点到直线的距离。换个说法就是将假设点的坐标带入原先的直线方程,将原先直线方程的常量值设定为新的数值。
新的数值和原先的直线方程的数值,以及直线的斜率可以计算出距离来。这样多个直线方程会得到一个确定的点的。超过三维之后的坐标系计算量会暴涨。如果在三维坐标系里面,
记得用投影化简直线方程到平面上。
#include
int main() {
double x0, y0, x1, y1;
double a, b, c;
double x;
printf("x0 = ");
scanf("%lf", &x0);
printf("y0 = ");
scanf("%lf", &y0);
printf("x1 = ");
scanf("%lf", &x1);
printf("y1 = ");
scanf("%lf", &y1);
printf("\n\n");
b = x1 - x0;
a = y0 - y1;
c = x0 * y1 - x1 * y0;
a /= b;
c /= b;
while (1) {
printf("x = ");
scanf("%lf", &x);
printf("y = %lf\n\n", -c - a * x);
}
}
如果知道直线方程,可以把方程转换为斜截式,又因为你要求该点到直线距离最短则为垂直于改直线距离最短,垂直线的斜率和原直线斜率相乘等于-1,那么新直线斜率就知道了,对于y=kx+b这个方程,只有b一个未知数,很容易求出新的直线方程,再求两直线相交于一点,最后求两点间的距离即可~求采纳
三圆定位,百度一下 微信的三点定位,有详细的介绍,还有 rssi的三点定位算法,都可以借鉴一下,