Сделайте программу калейдоскопа в C#
Когда вы нажимаете и рисуете форму этой программы, код рисует другие кривые, связанные с вашим, для создания эффекта калейдоскопа. Например, он может нарисовать зеркальное изображение того, что вы рисуете, или он может повторить ваш рисунок, повернутый на кратные 30 градусов.
Обработчики событий MouseDown, MouseMove и MouseUp выполняют большую часть работы. Программа сохраняет информацию о чертеже в List & lt; List & lt; Point & gt; & gt; & gt; & lt; / tt>. Каждый элемент в списке дает список точек для рисования, чтобы сделать кривую. Обработчики событий MouseDown, MouseMove и MouseUp создают списки точек.
Обработчик событий MouseMove обновляет PictureBox программы, который использует следующий обработчик событий для рисования ваших кривых и измененных версий.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
private void picCanvas_Paint(object sender, PaintEventArgs e) { e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; List<Matrix> matrices = new List<Matrix>(); matrices.Add(new Matrix()); int wid = picCanvas.ClientSize.Width; int hgt = picCanvas.ClientSize.Height; Rectangle src_rect = new Rectangle(0, 0, wid, hgt); if (mnuStyleReflectX.Checked || mnuStyleReflectXY.Checked) { Point[] pts = { new Point(wid, 0), new Point(0, 0), new Point(wid, hgt) }; Matrix mat = new Matrix(src_rect, pts); matrices.Add(mat); } if (mnuStyleReflectY.Checked || mnuStyleReflectXY.Checked) { Point[] pts = { new Point(0, hgt), new Point(wid, hgt), new Point(0, 0) }; Matrix mat = new Matrix(src_rect, pts); matrices.Add(mat); } if (mnuStyleReflectXY.Checked) { Point[] pts = { new Point(wid, hgt), new Point(0, hgt), new Point(wid, 0) }; Matrix mat = new Matrix(src_rect, pts); matrices.Add(mat); } if (mnuStyleRotate2.Checked) { Matrix mat = new Matrix(); mat.RotateAt(180, new PointF(wid / 2, hgt / 2)); matrices.Add(mat); } if (mnuStyleRotate4.Checked) { for (int i = 1; i <= 3; i++) { Matrix mat = new Matrix(); mat.RotateAt(i * 90, new PointF(wid / 2, hgt / 2)); matrices.Add(mat); } } if (mnuStyleRotate8.Checked) { for (int i = 1; i <= 7; i++) { Matrix mat = new Matrix(); mat.RotateAt(i * 45, new PointF(wid / 2, hgt / 2)); matrices.Add(mat); } } foreach (Matrix mat in matrices) { e.Graphics.Transform = mat; foreach (List<Point> pline in Polylines) { e.Graphics.DrawLines(Pens.Blue, pline.ToArray()); } } } |
Код создает List & lt; Matrix & gt; для хранения матриц преобразования. Он инициализирует список, добавляя преобразование идентичности, которое оставляет рисунок неизменным. Затем, в зависимости от стиля калейдоскопа, выбранного в меню программы, код добавляет в список другие матрицы преобразования.
После того, как был составлен список преобразований, программа проходит через них. Для каждого преобразования программа проходит через List & lt; List & lt; Point & gt; & gt;, соединяющая точки для рисования кривых, которые вы сделали. Результатом является несколько преобразованных копий ваших кривых, что делает калейдоскопический результат.