Advertisement
Guest User

Untitled

a guest
Jul 24th, 2019
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.18 KB | None | 0 0
  1. #include <algorithm>
  2. #include <cmath>
  3. #include "RectConvex.h"
  4.  
  5. bool cmp(const std::pair<int, int>& a, const std::pair<int, int>& b) {
  6.     if (a.first == b.first) {
  7.         return a.second < b.second;
  8.     } else {
  9.         return a.first < b.first;
  10.     }
  11. }
  12.  
  13. std::vector<std::pair<double, double>> RectConvex::getMinRect(std::vector<std::pair<int, int>>& contour) {
  14.     std::sort(contour.begin(), contour.end(), cmp);
  15.  
  16.     std::pair a(contour[0].first, contour[0].second);
  17.     std::pair b(contour[contour.size() - 1].first, contour[contour.size() - 1].second);
  18.     std::pair<double, double> c;
  19.     std::pair<double, double> d;
  20.  
  21.     std::vector<int> base_line;
  22.     std::vector<int> perpendicular_1;
  23.     std::vector<int> perpendicular_2;
  24.     std::vector<int> parallel_1;
  25.     std::vector<int> parallel_2;
  26.  
  27.     base_line.emplace_back(b.second - a.second);
  28.     base_line.emplace_back(a.first - b.first);
  29.     base_line.emplace_back(a.second * b.first - b.second * a.first);
  30.  
  31.     double max = 0;
  32.     double min = 0;
  33.     for (int i = 1; i < contour.size() - 1; ++i) {
  34.         int a_ = contour[i].first;
  35.         int b_ = contour[i].second;
  36.         double dist = ((double) (base_line[0] * a_ + base_line[1] * b_ + base_line[2])) / sqrt(a_ * a_ + b_ * b_);
  37.         if (dist > max) {
  38.             max = dist;
  39.             c = contour[i];
  40.         } else if (dist < min) {
  41.             min = dist;
  42.             d = contour[i];
  43.         }
  44.     }
  45.  
  46.     int tmp_coef1 = b.first - a.first;
  47.     int tmp_coef2 = b.second - a.second;
  48.     perpendicular_1.emplace_back(tmp_coef1);
  49.     perpendicular_1.emplace_back(tmp_coef2);
  50.     perpendicular_1.emplace_back((-1) * (tmp_coef1 * a.first + tmp_coef2 * a.second));
  51.  
  52.     perpendicular_2.emplace_back(tmp_coef1);
  53.     perpendicular_2.emplace_back(tmp_coef2);
  54.     perpendicular_2.emplace_back((-1) * (tmp_coef1 * b.first + tmp_coef2 * b.second));
  55.  
  56.     parallel_1.emplace_back(base_line[0]);
  57.     parallel_1.emplace_back(base_line[1]);
  58.     parallel_1.emplace_back((-1) * (base_line[0] * c.first + base_line[1] * c.second));
  59.  
  60.     parallel_2.emplace_back(base_line[0]);
  61.     parallel_2.emplace_back(base_line[1]);
  62.     parallel_2.emplace_back((-1) * (base_line[0] * d.first + base_line[1] * d.second));
  63.  
  64.     std::vector<std::pair<double, double>> res;
  65.  
  66.     //parallel_1 and perpendicular_1
  67.     {
  68.         int A1 = parallel_1[0];
  69.         int A2 = perpendicular_1[0];
  70.         int B1 = parallel_1[1];
  71.         int B2 = perpendicular_1[1];
  72.         int C1 = parallel_1[2];
  73.         int C2 = perpendicular_1[2];
  74.  
  75.         double x_angle = ((double) (B1 * C2 - B2 * C1)) / (B2 * A1 - A2 * B1);
  76.         double y_angle = ((double) (A2 * C1 - A1 * C2)) / (B2 * A1 - A2 * B1);
  77.         res.emplace_back(std::pair(x_angle, y_angle));
  78.     }
  79.  
  80.     //parallel_1 and perpendicular_2
  81.     {
  82.         int A1 = parallel_1[0];
  83.         int A2 = perpendicular_2[0];
  84.         int B1 = parallel_1[1];
  85.         int B2 = perpendicular_2[1];
  86.         int C1 = parallel_1[2];
  87.         int C2 = perpendicular_2[2];
  88.  
  89.         double x_angle = ((double) (B1 * C2 - B2 * C1)) / (B2 * A1 - A2 * B1);
  90.         double y_angle = ((double) (A2 * C1 - A1 * C2)) / (B2 * A1 - A2 * B1);
  91.         res.emplace_back(std::pair(x_angle, y_angle));
  92.     }
  93.  
  94.     //parallel_2 and perpendicular_1
  95.     {
  96.         int A1 = parallel_2[0];
  97.         int A2 = perpendicular_1[0];
  98.         int B1 = parallel_2[1];
  99.         int B2 = perpendicular_1[1];
  100.         int C1 = parallel_2[2];
  101.         int C2 = perpendicular_1[2];
  102.  
  103.         double x_angle = ((double) (B1 * C2 - B2 * C1)) / (B2 * A1 - A2 * B1);
  104.         double y_angle = ((double) (A2 * C1 - A1 * C2)) / (B2 * A1 - A2 * B1);
  105.         res.emplace_back(std::pair(x_angle, y_angle));
  106.     }
  107.  
  108.     //parallel_2 and perpendicular_2
  109.     {
  110.         int A1 = parallel_2[0];
  111.         int A2 = perpendicular_2[0];
  112.         int B1 = parallel_2[1];
  113.         int B2 = perpendicular_2[1];
  114.         int C1 = parallel_2[2];
  115.         int C2 = perpendicular_2[2];
  116.  
  117.         double x_angle = ((double) (B1 * C2 - B2 * C1)) / (B2 * A1 - A2 * B1);
  118.         double y_angle = ((double) (A2 * C1 - A1 * C2)) / (B2 * A1 - A2 * B1);
  119.         res.emplace_back(std::pair(x_angle, y_angle));
  120.     }
  121.  
  122.     return res;
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement