Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //построение изометрии (обновлённый вариант с двумя матрицами)
- private void DrawObject_Isomerism(PictureBox PB)
- {
- Graphics g = PB.CreateGraphics();
- PB.Refresh();
- int horizon_origin = 10, vertical_origin = PB.Height - 10; //смещение начала координат
- int horizon_max = PB.Width - 15, vertical_max = PB.Height - 15; //Максимальное увеличение
- g.TranslateTransform((float)horizon_origin, (float)vertical_origin);
- //Векторы координат
- double[] point_one;
- double[] point_two;
- //Точки
- Point p1, p2;
- #region матрицы поворота Rz * Rx
- //Перевод градусов в радианы
- double alpha = 180 * Math.PI / 180;
- double beta = 270 * Math.PI / 180;
- //Относительно оси Z
- double[,] Rz = new double[4, 4]
- {
- {Math.Cos(alpha), Math.Sin(alpha), 0, 0 },
- {-1*Math.Sin(alpha), Math.Cos(alpha), 0, 0 },
- {0, 0, 1, 0 },
- {0, 0, 0, 1 }
- };
- //Относительно оси X
- double[,] Rx = new double[4, 4]
- {
- {1, 0, 0, 0 },
- {0, Math.Cos(beta), Math.Sin(beta), 0 },
- {0, -1*Math.Sin(beta), Math.Cos(beta), 0 },
- {0, 0, 0, 1 }
- };
- #endregion
- for (int i = 0; i < StartRib.Count; i++)
- {
- point_one = new double[4] { X_norm[StartRib[i]], Y_norm[StartRib[i]], Z_norm[StartRib[i]], 1 };
- point_two = new double[4] { X_norm[EndRib[i]], Y_norm[EndRib[i]], Z_norm[EndRib[i]], 1 };
- //Умножение вектора координат на матрицу изометрии
- vector_multy(point_one, Rz);
- vector_multy(point_one, Rx);
- point_one = iso_Multiplicatios(point_one);
- vector_multy(point_two, Rz);
- vector_multy(point_two, Rx);
- point_two = iso_Multiplicatios(point_two);
- 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))));
- 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))));
- g.SmoothingMode = SmoothingMode.HighQuality;
- g.DrawLine(new Pen(Color.Black, 2f), p1, p2);
- }
- }
- /// <summary>
- /// Функция умножения вектора координат на матрицу изометрии
- /// </summary>
- /// <param name="vector_point"></param>
- /// <returns></returns>
- private double[] iso_Multiplicatios(double[] vector_point)
- {
- //Матрица для построенния изометрии
- double alpha_r = 45 * (Math.PI / 180);
- double beta_r = 35.26439 * Math.PI / 180;
- double[] res_vec = new double[4];
- double[,] iso_matrix = new double[4, 4]
- {
- {Math.Cos(alpha_r), Math.Sin(alpha_r)*Math.Sin(beta_r), 0, 0 },
- {0, Math.Cos(alpha_r), 0, 0 },
- {Math.Sin(alpha_r), -1*Math.Cos(alpha_r)*Math.Sin(beta_r), 0, 0 },
- {0, 0, 0, 1 }
- };
- 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];
- 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];
- 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];
- 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];
- return res_vec;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement