Сделайте программу калейдоскопа в C#
Когда вы нажимаете и рисуете форму этой программы, код рисует другие кривые, связанные с вашим, для создания эффекта калейдоскопа. Например, он может нарисовать зеркальное изображение того, что вы рисуете, или он может повторить ваш рисунок, повернутый на кратные 30 градусов.
Обработчики событий MouseDown, MouseMove и MouseUp выполняют большую часть работы. Программа сохраняет информацию о чертеже в List & lt; List & lt; Point & gt; & gt; & gt; & lt; / tt>. Каждый элемент в списке дает список точек для рисования, чтобы сделать кривую. Обработчики событий MouseDown, MouseMove и MouseUp создают списки точек.
Обработчик событий MouseMove обновляет PictureBox программы, который использует следующий обработчик событий для рисования ваших кривых и измененных версий.
private void picCanvas_Paint(object sender, PaintEventArgs e) { e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; Listmatrices = new List (); 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 pline in Polylines) { e.Graphics.DrawLines(Pens.Blue, pline.ToArray()); } } }
Код создает List & lt; Matrix & gt; для хранения матриц преобразования. Он инициализирует список, добавляя преобразование идентичности, которое оставляет рисунок неизменным. Затем, в зависимости от стиля калейдоскопа, выбранного в меню программы, код добавляет в список другие матрицы преобразования.
После того, как был составлен список преобразований, программа проходит через них. Для каждого преобразования программа проходит через List & lt; List & lt; Point & gt; & gt;, соединяющая точки для рисования кривых, которые вы сделали. Результатом является несколько преобразованных копий ваших кривых, что делает калейдоскопический результат.