Advertisement
TShiva

Draw

Sep 11th, 2015
262
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.63 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include <fstream>
  3.  
  4. //Обход Грэхема
  5. using namespace std;
  6. #define INFILE "input.txt"
  7. #define OUTFILE "outfile.txt"
  8. //#define - для констант
  9.  
  10. struct Vector{
  11.     double x;
  12.     double y;
  13. };
  14.  
  15. int vp_sgn(Vector a, Vector b);
  16. int angle_sgn(Vector *A, int i_a, int i_b, int i_Base);
  17. void bubble_sort(Vector* A, int n, int i_Base, int* arr_index);
  18.  
  19. BOOL DrawLine(HDC hdc, int x1, int y1, int x2, int y2)
  20. {
  21.     POINT pt;
  22.     MoveToEx(hdc, x1, y1, &pt);
  23.     return LineTo(hdc, x2, y2);
  24. }
  25.  
  26. void Draw(HWND hWnd, HDC hdc){
  27.     ifstream in(INFILE);
  28.     ofstream out(OUTFILE);
  29.     int n; // кол-во точек
  30.     in >> n;
  31.     out << " Кол-во точек = " << n << endl;
  32.  
  33.     //посчитаем габариты нашего многоугольника
  34.     double* x = new double[n];
  35.     double* y = new double[n];
  36.     for (int i = 0; i < n; i++){
  37.         in >> x[i] >> y[i];
  38.         out << x[i]<< "  " << y[i] << endl;
  39.         }
  40.     double xmin = x[0];
  41.     double xmax = x[0];
  42.     double ymin = y[0];
  43.     double ymax = y[0];
  44.  
  45.     for (int i = 1; i < n; i++){
  46.         if (x[i] < xmin) {
  47.             xmin = x[i];
  48.         }
  49.         if (x[i] > xmax) {
  50.             xmax = x[i];
  51.         }
  52.  
  53.         if (y[i] < ymin) {
  54.             ymin = y[i];
  55.         }
  56.         if (y[i] > ymax) {
  57.             ymax = y[i];
  58.             }
  59.     }
  60.  
  61.     out << "Min: " << xmin << " " << ymin << endl;
  62.     out << "Max: " << xmax << " " << ymax << endl;
  63.    
  64.  
  65.     RECT rc;
  66.     GetClientRect(hWnd,&rc);
  67.     int Width = rc.right - rc.left + 1;
  68.     int Height = rc.bottom - rc.top + 1;
  69.  
  70.     out << "rc.right" << rc.right << endl;
  71.     out << "rc.left" << rc.left << endl;
  72.     out << "rc.bottom" << rc.bottom << endl;
  73.     out << "rc.top" << rc.top << endl;
  74.     out << "Width = " << Width << " Height = " << Height << endl;
  75.     /*
  76.     Rectangle(hdc, xmin, ymax, xmax, ymin);
  77.    for (int i = 0; i < n;i++)
  78.     Ellipse(hdc, x[i] - 5, y[i]+5, x[i]+5,y[i]-5);
  79.     */
  80.  
  81.  
  82.  
  83.     double W, H,koef;
  84.     W = xmax - xmin;
  85.     H = ymax - ymin;
  86.  
  87.     if ((W*Height) <= (H*Width)) koef = Height / (W*(1 + 0.1));
  88.     else koef = Width / (W*(1 + 0.1));
  89.     Vector X0,x0;//X0 - середина в метрах нашего габарита, x0 - середина в пикселях - центр экрана
  90.     X0.x = 0.5*(xmax + xmin);
  91.     X0.y = 0.5*(ymax + ymin);
  92.     x0.x = 0.5*(Width);
  93.     x0.y = 0.5*(Height);
  94.    
  95.     Vector *A = new Vector[n];                           // Массив точек
  96.     for (int i = 0; i < n; i++){
  97.         A[i].x = koef*(x[i] - X0.x) + x0.x;
  98.         A[i].y = koef*(y[i] - X0.y) + x0.y;
  99.     }
  100.  
  101.  
  102.     double a1 = koef*(xmax - X0.x) + x0.x;
  103.     double a2 = koef*(ymax - X0.y) + x0.y;
  104.     double a3 = koef*(xmin - X0.x) + x0.x;
  105.     double a4 = koef*(ymin - X0.y) + x0.y;
  106.  
  107.     Rectangle(hdc, a3, a2, a1, a4);
  108.  
  109.     for (int i = 0; i < n; i++)
  110.         Ellipse(hdc, (int)A[i].x - 5, (int)A[i].y + 5, (int)A[i].x + 5, (int)A[i].y - 5);
  111.    
  112.     DrawLine(hdc, x0.x, x0.y * 2, x0.x, 0);
  113.     DrawLine(hdc, 0, x0.y, x0.x*2, x0.y);
  114.  
  115.     Vector *Point = new Vector[n];
  116.     Point[0].x = A[0].x;
  117.     Point[0].y = A[0].y;
  118.  
  119.   /*  Vector *Point2 = new Vector[n];
  120.     Point[0].x = A[0].x;
  121.     Point[0].y = A[0].y;
  122.     */
  123.     int i_Base = 0;
  124.     double left_x = A[0].x;
  125.     for (int i = 1; i < n; i++){
  126.             if (A[i].x < left_x){
  127.             left_x =A[i].x;
  128.             i_Base = i;
  129.     }
  130.     }
  131.     /*
  132.     Point[1].x = A[0].x;
  133.     Point[1].y = A[0].y;
  134.  
  135.     for (int i = 1; i < n; i++){
  136.         if (Point[1].x <= A[i].x){
  137.             Point[1].x = A[i].x;
  138.             Point[1].y = A[i].y;
  139.         }
  140.     } out << "array of points" << endl;
  141.     for (int i = 1; i < n; i++){
  142.         out << A[i].x << "   ";
  143.         out<<A[i].y<<endl;
  144.     }*/
  145.  
  146.     //out << "Точка-min x , y" << Point[0].x << "  " << Point[0].y << endl;
  147.    // out << "Точка-max x , y" << Point[1].x << "  " << Point[1].y << endl;
  148.  
  149.  
  150.    
  151.     /*for (int i = 0; i < n - 1; i++){
  152.         Point2[i].x = A[i].x;
  153.         Point2[i].y = A[i].y;
  154.     }
  155.  
  156.     Point2[n].x = Point[1].x;
  157.     Point2[n].y = Point[1].y;
  158.     Point2[0].x = Point[0].x;
  159.     Point2[0].y = Point[0].y;
  160.  
  161.  
  162.     */
  163.             out << "array of points" << endl;
  164.             for (int i = 0; i < n; i++){
  165.                 out << A[i].x << "   ";
  166.                 out << A[i].y << endl;
  167.             }
  168.  
  169.             out << "крайняя левая" << endl;
  170.             out << A[i_Base].x << "   " << A[i_Base].y << "   " << i_Base<<endl;
  171.  
  172.            
  173.         //    int signum = vp_sgn(A[1], A[2]);
  174.         //    out<< signum<<endl;
  175.          
  176.  
  177.             int* arr_index = new int[n];
  178.             for (int i = 0; i < n; i++){
  179.                 arr_index[i] = i;
  180.             }
  181.  
  182.             //поставим i_base на первое место
  183.             arr_index[0] = i_Base;
  184.             arr_index[i_Base] = 0;
  185.  
  186.  
  187.             //пытаемся отсортировать по возрпастанию сверху вниз
  188.          bubble_sort(A, n, i_Base, arr_index);
  189.          out << "array of index" << endl;
  190.          for (int i = 0; i < n; i++){
  191.              out << arr_index[i] << "   ";
  192.  
  193.              
  194.  
  195.              }
  196.          for (int i = 0; i < n; i++){
  197.              DrawLine(hdc, left_x, A[i_Base].y, A[i].x, A[i].y);//чертим
  198.          }
  199.  
  200.          for (int i = 0; i < n; i++){
  201.              DrawLine(hdc, A[arr_index[i]].x, A[arr_index[i]].y, A[arr_index[i + 1]].x, A[arr_index[i + 1]].y);//чертим
  202.          }
  203. }
  204.  
  205. //Знак векторного произведения
  206.  
  207. int vp_sgn(Vector *a, Vector *b){
  208.     double r = a->x*b->y - a->y*b->x;
  209.     if (r > 0.) return 1;
  210.     return -1;
  211. }
  212.  
  213. int vp_sgn(Vector a, Vector b){
  214.     double r = a.x*b.y - a.y*b.x;
  215.     if (r > 0.) return 1;
  216.     return -1;
  217. }
  218.  
  219. //
  220. int angle_sgn(Vector *A, int i_a, int i_b,int i_Base){
  221.     Vector *a = new Vector;
  222.     Vector *b = new Vector;
  223.     a->y = A[i_a].y - A[i_Base].y;
  224.     b->y = A[i_b].y - A[i_Base].y;
  225.     if (a->y < 0.){
  226.         if (b->y >= 0.)
  227.             return 1;
  228.     }
  229.     else{
  230.         if (b->y < 0.)
  231.             return -1;
  232.     }
  233.     a->x = A[i_a].x - A[i_Base].x;
  234.     b->x = A[i_b].x - A[i_Base].x;
  235.     return vp_sgn(a,b);
  236.    
  237. }
  238.  
  239. void bubble_sort(Vector* A,int n,int i_Base,int* arr_index){
  240.     for (int j = 0; j < n - 1; j++){
  241.         for (int i = 1; i < n - j - 1; i++){
  242.             int b = arr_index[i];
  243.             int c = arr_index[i + 1];
  244.             if (angle_sgn(A, b, c, i_Base) == -1){
  245.                 arr_index[i] = c;
  246.                 arr_index[i + 1] = b;
  247.             }
  248.         }
  249.     }
  250. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement