Advertisement
Guest User

графический изометрия новая

a guest
Jun 26th, 2017
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.46 KB | None | 0 0
  1.         //построение изометрии (обновлённый вариант с двумя матрицами)
  2.         private void DrawObject_Isomerism(PictureBox PB)
  3.         {
  4.             Graphics g = PB.CreateGraphics();
  5.             PB.Refresh();
  6.             int horizon_origin = 10, vertical_origin = PB.Height - 10; //смещение начала координат
  7.             int horizon_max = PB.Width - 15, vertical_max = PB.Height - 15; //Максимальное увеличение
  8.             g.TranslateTransform((float)horizon_origin, (float)vertical_origin);
  9.  
  10.             //Векторы координат
  11.             double[] point_one;
  12.             double[] point_two;
  13.             //Точки
  14.             Point p1, p2;
  15.  
  16.  
  17.  
  18.             #region матрицы поворота Rz * Rx
  19.            
  20.             //Перевод градусов в радианы
  21.             double alpha = 180 * Math.PI / 180;
  22.             double beta = 270 * Math.PI / 180;
  23.  
  24.             //Относительно оси Z
  25.             double[,] Rz = new double[4, 4]
  26.             {
  27.                 {Math.Cos(alpha), Math.Sin(alpha), 0, 0 },
  28.                 {-1*Math.Sin(alpha), Math.Cos(alpha), 0, 0 },
  29.                 {0, 0, 1, 0 },
  30.                 {0, 0, 0, 1 }
  31.             };
  32.  
  33.             //Относительно оси X
  34.             double[,] Rx = new double[4, 4]
  35.             {
  36.                 {1, 0, 0, 0 },
  37.                 {0, Math.Cos(beta), Math.Sin(beta), 0 },
  38.                 {0, -1*Math.Sin(beta), Math.Cos(beta), 0 },
  39.                 {0, 0, 0, 1 }
  40.             };
  41.            
  42.             #endregion        
  43.  
  44.             for (int i = 0; i < StartRib.Count; i++)
  45.             {
  46.                 point_one = new double[4] { X_norm[StartRib[i]], Y_norm[StartRib[i]], Z_norm[StartRib[i]], 1 };
  47.                 point_two = new double[4] { X_norm[EndRib[i]], Y_norm[EndRib[i]], Z_norm[EndRib[i]], 1 };
  48.  
  49.                 //Умножение вектора координат на матрицу изометрии
  50.                 vector_multy(point_one, Rz);
  51.                 vector_multy(point_one, Rx);
  52.                 point_one = iso_Multiplicatios(point_one);
  53.  
  54.                 vector_multy(point_two, Rz);
  55.                 vector_multy(point_two, Rx);
  56.                 point_two = iso_Multiplicatios(point_two);
  57.  
  58.                 p1 = new Point((int)(Math.Truncate(horizon_max * 0.5 + point_one[0] * horizon_max * 0.5)), (int)((-1)*(Math.Truncate(vertical_max * 0.5 + point_one[1] * vertical_max * 0.5))));
  59.                 p2 = new Point((int)(Math.Truncate(horizon_max * 0.5 + point_two[0] * horizon_max * 0.5)), (int)((-1)*(Math.Truncate(vertical_max * 0.5 + point_two[1] * vertical_max * 0.5))));
  60.  
  61.                 g.SmoothingMode = SmoothingMode.HighQuality;
  62.                 g.DrawLine(new Pen(Color.Black, 2f), p1, p2);
  63.             }
  64.         }
  65.  
  66.  
  67.         /// <summary>
  68.         /// Функция умножения вектора координат на матрицу изометрии
  69.         /// </summary>
  70.         /// <param name="vector_point"></param>
  71.         /// <returns></returns>
  72.         private double[] iso_Multiplicatios(double[] vector_point)
  73.         {
  74.             //Матрица для построенния изометрии
  75.             double alpha_r = 45 * (Math.PI / 180);
  76.             double beta_r = 35.26439 * Math.PI / 180;
  77.             double[] res_vec = new double[4];
  78.             double[,] iso_matrix = new double[4, 4]
  79.             {
  80.                     {Math.Cos(alpha_r), Math.Sin(alpha_r)*Math.Sin(beta_r), 0, 0 },
  81.                     {0, Math.Cos(alpha_r), 0, 0 },
  82.                     {Math.Sin(alpha_r), -1*Math.Cos(alpha_r)*Math.Sin(beta_r), 0, 0 },
  83.                     {0, 0, 0, 1 }
  84.             };
  85.  
  86.             res_vec[0] = vector_point[0] * iso_matrix[0, 0] + vector_point[1] * iso_matrix[1, 0] + vector_point[2] * iso_matrix[2, 0] + vector_point[3] * iso_matrix[3, 0];
  87.             res_vec[1] = vector_point[0] * iso_matrix[0, 1] + vector_point[1] * iso_matrix[1, 1] + vector_point[2] * iso_matrix[2, 1] + vector_point[3] * iso_matrix[3, 1];
  88.             res_vec[2] = vector_point[0] * iso_matrix[0, 2] + vector_point[1] * iso_matrix[1, 2] + vector_point[2] * iso_matrix[2, 2] + vector_point[3] * iso_matrix[3, 2];
  89.             res_vec[3] = vector_point[0] * iso_matrix[0, 3] + vector_point[1] * iso_matrix[1, 3] + vector_point[2] * iso_matrix[2, 3] + vector_point[3] * iso_matrix[3, 3];
  90.  
  91.             return res_vec;
  92.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement