当前位置:   article > 正文

C++求点到线段和任意曲线的最短距离_c语言 点 到 曲线 的 距离 代码

c语言 点 到 曲线 的 距离 代码

 

(2)C++基本数据类型和函数的定义和使用

编写C++程序,实现:

给定任意一个点P和一条线段AB,计算点P到AB的最短距离

图1 点到直线最短距离示意图

计算点到线段最短距离的算法描述:

1)计算向量A->P,A->B;

2)定义r1=|AP|cos(a) = dot((A->P)( A->B))/|AB|,表示向量A->P在A->B方向上的投影长度;其中,a是向量A->P与A->B的夹角;dot()是向量点乘;

3)定义r2=r1/|AB|,如果r2<=0,则P为图1中中间情形,即点P到AB的最短距离记为|AP|;

4)如果r2>=1,即P为图1中最右边的情形,即点P到AB的最短距离记为|PB|;

5)r2为其他取值时,P为图1中最左边情形,即点P到AB的最短距离记为sqrt(|AP|2-r12)。

基于以上函数,实现给定任意一个点计算起到任意多段线(即线段的集合,polyline)的最短距离。

  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <ctime>
  4. using namespace std;
  5. #define random(x) (rand()%x)
  6. typedef struct tagPoint
  7. {
  8. double x;
  9. double y;
  10. }Point;
  11. double PFT(Point a,Point b,Point p)
  12. {
  13. double ap = (b.x - a.x) * (p.x - a.x) + (b.y - a.y) * (p.y - a.y);
  14. if (ap <= 0)
  15. return sqrt((p.x - a.x) * (p.x - a.x) + (p.y - a.y) * (p.y - a.y));//最短为ap
  16. double ab = (b.x - a.x) * (b.x - a.x) + (b.y - a.y) * (b.y - a.y);
  17. if (ap >= ab)
  18. return sqrt((p.x - b.x) * (p.x - b.x) + (p.y - b.y) * (p.y - b.y));//最短为bp
  19. double r = ap / ab;
  20. double px = a.x + (b.x - a.x) * r;
  21. double py = a.y + (b.y - a.y) * r;
  22. double L1=sqrt((p.x - px) * (p.x - px) + (p.y - py) * (p.y - py));//垂线距离
  23. cout << "点到线段最小距离为:" << L1<<endl;
  24. }
  25. double QFT(Point q)
  26. {
  27. srand((unsigned)time(NULL));
  28. int point_num = 20;
  29. Point* Polyline = new Point[point_num];
  30. for (int i = 0; i < point_num; i++)
  31. {
  32. Polyline[i].x = random(100);
  33. Polyline[i].y = random(100);
  34. }
  35. double d1, d2;
  36. for (int i = 0; i < point_num; i++)
  37. {
  38. d1 = PFT(Polyline[i], Polyline[i + 1], q);
  39. d2 = PFT(Polyline[i + 1], Polyline[i + 2], q);
  40. if (d1 < d2)
  41. return d1;
  42. else
  43. return d2;
  44. }
  45. delete []Polyline;
  46. }
  47. int main()
  48. {
  49. double L2;
  50. Point a, b, c, q;
  51. cout << "请输入A点的坐标" << endl;
  52. cin >> a.x >> a.y;
  53. cout << "请输入B点的坐标" << endl;
  54. cin >> b.x >> b.y;
  55. cout << "请输入C点的坐标" << endl;
  56. cin >> c.x >> c.y;
  57. PFT(a, b, c);
  58. cout << "请输入点的坐标" << endl;
  59. cin >> q.x >> q.y;
  60. L2 = QFT(q);
  61. cout <<"点到多线段的最短距离为:"<< L2;
  62. return 0;
  63. }

我的思路

  1. 先用一个函数1求点到线段的最短距离
  2. 构建一个数组,里面存n个线段的端点,n个线段构成一个多段线,用随机函数生成任意的端点坐标。(即任意曲线)
  3. 调用函数1求点到不同的线段的最短距离,其中最短距离的最小值即点到多段线的最短距离
  4. 缺点:考虑的不够完善,有待进一步改进
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/562797
推荐阅读
相关标签
  

闽ICP备14008679号