Сделайте программу калейдоскопа в 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;
List matrices = 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;, соединяющая точки для рисования кривых, которые вы сделали. Результатом является несколько преобразованных копий ваших кривых, что делает калейдоскопический результат.
