/// <summary> /// Масштабирование многогранника /// </summary> /// <param name="scaleInProcents">Значение нового масштаба в процентах относительно старого</param> void ScaleFromCenter(int scaleInProcents) { Point3D center = currentPolyhedron.Center; double newScale = scaleInProcents / 100.0; Polyhedron res; res = AffineTransform.getMoved(currentPolyhedron, -(int)center.X, -(int)center.Y, -(int)center.Z); res = AffineTransform.getScaled(res, newScale, newScale, newScale); res = AffineTransform.getMoved(res, (int)center.X, (int)center.Y, (int)center.Z); currentPolyhedron = res; }
private void transformationRadioButton_Click(object sender, EventArgs e) { if (currentPolyhedron == null) { MessageBox.Show("Задайте фигуру", "Ошибка", MessageBoxButtons.OK); } else { if (moveRadioButton.Checked) { var dialogFirst = new CoordinateBox("Введите смещение по координатам:"); if (dialogFirst.ShowDialog() == DialogResult.OK) { currentPolyhedron = AffineTransform.getMoved( currentPolyhedron, dialogFirst.X, dialogFirst.Y, dialogFirst.Z ); } } else if (turnRadioButton.Checked) { var dialogX = new InputBox("Введите поворот по оси X \n(градусы)"); var dialogY = new InputBox("Введите поворот по оси Y \n(градусы)"); var dialogZ = new InputBox("Введите поворот по оси Z \n(градусы)"); if (dialogX.ShowDialog() == DialogResult.OK && dialogY.ShowDialog() == DialogResult.OK && dialogZ.ShowDialog() == DialogResult.OK) { currentPolyhedron = AffineTransform.getRotated( currentPolyhedron, int.Parse(dialogX.ResultText), int.Parse(dialogY.ResultText), int.Parse(dialogZ.ResultText) ); } } else if (scaleRadioButton.Checked) { var dialogX = new InputBox("Введите увеличение по X"); var dialogY = new InputBox("Введите увеличение по Y"); var dialogZ = new InputBox("Введите увеличение по Z"); if (dialogX.ShowDialog() == DialogResult.OK && dialogY.ShowDialog() == DialogResult.OK && dialogZ.ShowDialog() == DialogResult.OK) { currentPolyhedron = AffineTransform.getScaled( currentPolyhedron, double.Parse(dialogX.ResultText.Replace('.', ',')), double.Parse(dialogY.ResultText.Replace('.', ',')), double.Parse(dialogZ.ResultText.Replace('.', ',')) ); } } else if (scaleAroundCenterRadioButton.Checked) { var dialogScale = new InputBox("Введите целое значение для \nмасштабирования в процентах"); if (dialogScale.ShowDialog() == DialogResult.OK) { int scale; if (int.TryParse(dialogScale.ResultText, out scale)) { ScaleFromCenter(scale); } else { MessageBox.Show("Было введено неверное значение. \nПожалуйста, попробуйте еще раз.", "", MessageBoxButtons.OK, MessageBoxIcon.Information); } } } else if (reflectionRadioButton.Checked) { var dialog = new InputBox("Введите плоскость, относительно \nкоторой будет происходить \nотражение. Например, xy или yz"); if (dialog.ShowDialog() == DialogResult.OK) { var surface = dialog.ResultText.ToLower(); if (surface.Length == 2 && (surface.Contains("x") || surface.Contains("y") || surface.Contains("z"))) { if (surface == "xy" || surface == "yx") { surface = "xy"; } else if (surface == "xz" || surface == "zx") { surface = "xz"; } else if (surface == "yz" || surface == "zy") { surface = "yz"; } else { MessageBox.Show("Было введено неверное значение. \nПожалуйста, попробуйте еще раз.", "", MessageBoxButtons.OK, MessageBoxIcon.Information); } } ReflectionFromSurface(surface); } } else if (rotateAroundLineRadioButton.Checked) { var dialog = new InputBox("Введите название координатной \nоси, параллельно которой \nбудет проходит ось вращения. \nНапример, Oy."); string surface; if (dialog.ShowDialog() == DialogResult.OK) { surface = dialog.ResultText.ToLower(); if (surface.Length == 2 && (surface.Contains("x") || surface.Contains("y") || surface.Contains("z"))) { if (surface == "ox" || surface == "xo") { surface = "x"; } else if (surface == "oy" || surface == "yo") { surface = "y"; } else if (surface == "oz" || surface == "zo") { surface = "z"; } else { MessageBox.Show("Было введено неверное значение. \nПожалуйста, попробуйте еще раз.", "", MessageBoxButtons.OK, MessageBoxIcon.Information); } } dialog = new InputBox("Введите целое значение угла \nповорота в градусах"); if (dialog.ShowDialog() == DialogResult.OK) { int angle; if (int.TryParse(dialog.ResultText, out angle)) { RotateWithLine(surface, angle); } else { MessageBox.Show("Было введено неверное значение. \nПожалуйста, попробуйте еще раз.", "", MessageBoxButtons.OK, MessageBoxIcon.Information); } } } } else if (turnAroundLineRadioButton.Checked) { var dialogFirst = new CoordinateBox("Введите координаты первой точки прямой:"); if (dialogFirst.ShowDialog() == DialogResult.OK) { var first = new Point3D(dialogFirst.X, dialogFirst.Y, dialogFirst.Z); var dialogSecond = new CoordinateBox("Введите координаты второй точки прямой:"); if (dialogSecond.ShowDialog() == DialogResult.OK) { var second = new Point3D(dialogSecond.X, dialogSecond.Y, dialogSecond.Z); var dialogAngle = new InputBox("Введите целое значение угла поворота в градусах:"); if (dialogAngle.ShowDialog() == DialogResult.OK) { int angle; if (int.TryParse(dialogAngle.ResultText, out angle)) { RotateAroundLine(new Line3D(first, second), angle); } else { MessageBox.Show("Было введено неверное значение. \n Пожалуйста, попробуйте еще раз.", "", MessageBoxButtons.OK, MessageBoxIcon.Information); } } } } } drawFigure(); } }