NickAndNick

Расстояние от точки до прямой на плоскости

Jan 8th, 2013
257
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <string>
  3. #include <iomanip>
  4.  
  5. using namespace std;
  6.  
  7. struct POINT {
  8.     double x;
  9.     double y;
  10. };
  11. typedef POINT * PPOINT;
  12.  
  13. struct LINE {
  14.     double Ax;
  15.     double By;
  16.     double C;
  17. };
  18. typedef LINE * PLINE;
  19.  
  20. struct minimum_distance {
  21.     POINT ptr;
  22.     LINE lin;
  23.     double dist;
  24. };
  25. typedef minimum_distance MINDIST;
  26.  
  27. double distance(const PLINE, const PPOINT);
  28. MINDIST min_distance(PLINE, const size_t, PPOINT, const size_t);
  29.  
  30. int main () {
  31.     wcout.imbue(locale("rus_rus.866"));
  32.  
  33.     wcout << L"\n Введите количество точек: ";
  34.     size_t qpt;
  35.     cin >> qpt;
  36.    
  37.     wcout << L" Введите значения точек:\n\n";
  38.     PPOINT ppt = new POINT [qpt];
  39.     for (size_t n = 0; n < qpt; n++) {
  40.         cout << " x" << n + 1 << ": "; cin >> ppt[n].x;
  41.         cout << " y" << n + 1 << ": "; cin >> ppt[n].y;
  42.         cout << endl;
  43.     }
  44.  
  45.     wcout << L"\n Введите количество линий: ";
  46.     size_t qln;
  47.     cin >> qln;
  48.  
  49.     wcout << L" Введите значения линий:\n\n";
  50.     PLINE pln = new LINE [qln];
  51.     for (size_t n = 0; n < qln; n++) {
  52.         cout << " Ax" << n + 1 << ": "; cin >> pln[n].Ax;
  53.         cout << " Ay" << n + 1 << ": "; cin >> pln[n].By;
  54.         cout << " C" << n + 1 << ": ";  cin >> pln[n].C;
  55.         if (!pln[n].Ax && !pln[n].By) --n;
  56.         cout << endl;
  57.     }
  58.  
  59.     MINDIST md = min_distance(pln, qln, ppt, qpt);
  60.  
  61.     delete[] ppt;
  62.     delete[] pln;
  63.  
  64.     streamsize dist = 14, coord = 3;
  65.     wcout << L"\n Минимальное расстояние: "
  66.           << fixed << setprecision(dist) << md.dist
  67.           << L"\n между точкой с координатами x: "
  68.           << fixed << setprecision(coord) << md.ptr.x << L", y: " << md.ptr.y
  69.           << L"\n и прямой, заданной коэффициентами Ax: "
  70.           << md.lin.Ax << L", By: " << md.lin.By << L", C: " << md.lin.C << endl;
  71.  
  72.     cin.get(); cin.get();
  73.     return 0;
  74. }
  75.  
  76. double distance(const LINE _ln, const POINT _pt) {
  77.     return abs(_ln.Ax * _pt.x + _ln.By * _pt.y - _ln.C) / sqrt(pow(_ln.Ax, 2) + pow(_ln.By, 2));
  78. }
  79.  
  80. MINDIST min_distance(PLINE _pln, const size_t _lines, PPOINT _ppt, const size_t _points) {
  81.     double min = DBL_MAX, eps = 1e-15;
  82.     bool flag = false;
  83.     MINDIST md;
  84.  
  85.     for (size_t line = 0; line < _lines; line++) {
  86.         for (size_t point = 0; point < _points; point++) {
  87.             double temp = distance(_pln[line], _ppt[point]);
  88.             if (min > temp) {
  89.                 md.dist = min = temp;
  90.                 md.lin = _pln[line];
  91.                 md.ptr = _ppt[point];
  92.  
  93.                 if (min <= eps) {
  94.                     min = 0;
  95.                     flag = true;
  96.                     break;
  97.                 }
  98.             }
  99.         }
  100.  
  101.         if (flag) break;
  102.     }
  103.  
  104.     return md;
  105. }
RAW Paste Data