Нарисуйте звезды внутри полигонов в C#

В этом примере показано, как рисовать звезды внутри многоугольника, подключая каждую M-ю вершину по мере ее рисования. Если многоугольник имеет N сторон, а N и M взаимно просты (не имеют общих факторов, кроме 1), то линии посещают каждую вершину, а результат - звезду. Обратите внимание, если M равно 1, то линии рисуют многоугольник.

PictureBox Paint цикл обработчика событий для i = 1 до N - 1, звезда в центре PictureBox. Он также рисует каждую звезду возле i-й вершины.

// Нарисуем звезды.
private void picCanvas_Paint(object sender, PaintEventArgs e)
{
    if (NumPoints < 3) return;
    e.Graphics.Clear(picCanvas.BackColor);
    e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;

    // Получим радиусы.
    int r1, r2, r3;
    r3 = Math.Min(
        picCanvas.ClientSize.Width,
        picCanvas.ClientSize.Height) / 2;
    r1 = r3 / 2;
    r2 = r3 / 4;
    r3 = r1 + r2;

    // Позиционные переменные.
    int cx = picCanvas.ClientSize.Width / 2;
    int cy = picCanvas.ClientSize.Height / 2;

    // Поместите исходные точки.
    PointF[] pts1 = new PointF[NumPoints];
    PointF[] pts2 = new PointF[NumPoints];
    double theta = -Math.PI / 2;
    double dtheta = 2 * Math.PI / NumPoints;
    for (int i = 0; i < NumPoints; i++)
    {
        pts1[i].X = (float)(r1 * Math.Cos(theta));
        pts1[i].Y = (float)(r1 * Math.Sin(theta));
        pts2[i].X = (float)(r2 * Math.Cos(theta));
        pts2[i].Y = (float)(r2 * Math.Sin(theta));
        theta += dtheta;
    }

    // Рисуем звезды.
    int max = NumPoints - 1;
    if (chkHalfOnly.Checked) max = (int)(NumPoints / 2);
    for (int skip = 1; skip <= max; skip++)
    {
        // Посмотрим, если они относительно простые.
        bool draw_all = !chkRelPrimeOnly.Checked;
        if (draw_all || GCD(skip, NumPoints) == 1)
        {
            // Нарисуем большую версию звезды.
            DrawStar(e.Graphics, cx, cy, pts1, skip);

            // Нарисуем меньшую версию.
            theta = -Math.PI / 2 + skip * 2 * Math.PI / NumPoints;
            int x = (int)(cx + r3 * Math.Cos(theta));
            int y = (int)(cy + r3 * Math.Sin(theta));

            DrawStar(e.Graphics, x, y, pts2, skip);
        }
    }
}

Обработчик событий Paint начинается с создания массивов, удерживающих точки, для рисования центральных и внешних звезд. Эти точки будут рисовать многоугольник, центрированный в начале координат, если они были нарисованы так, как они находятся в массивах.

Далее код запускает цикл for для рисования меньших полигонов. Если вы проверите CheckBox «Только половина», программа будет проходить от 1 до N / 2. Если вы не установите этот флажок, программа пропустит все значения между 1 и N - 1. (Вам нужно всего лишь нарисовать половину из них, чтобы сделать все возможные шаблоны, но их рисование создает хороший симметричный результат .)

Если вы проверите флажок «Относительно простой только» CheckBox, программа вызывает функцию GCD, чтобы решить, является ли значение пропуска и число сторон относительно простым, и оно только рисует линию, если они есть.

Наконец, после всей этой работы, чтобы решить, следует ли рисовать линии, программа вызывает метод DrawStar. Затем он вычисляет, где должен быть нарисован меньший многоугольник, и снова вызывает DrawStar, чтобы нарисовать его там.

См. пример Вычислите наибольший общий делитель (GCD) и наименьшее общее число (LCM) двух целых чисел в C# для получения дополнительной информации о функции GCD.

Метод DrawStar, показанный в следующем коде показывает, рисует многоугольник и линии, соединяющие вершины.

// Нарисуем звезду с центром в (x, y), используя это значение пропуска.
private void DrawStar(Graphics gr, int x, int y,
    PointF[] orig_pts, int skip)
{
    // Создаем массив PointF с точками в правильном порядке.
    PointF[] pts = new PointF[NumPoints];
    for (int i = 0; i < NumPoints; i++)
    {
        pts[i] = orig_pts[(i * skip) % NumPoints];
    }

    // Нарисуем звезду.
    gr.TranslateTransform(x, y);
    gr.DrawPolygon(Pens.Blue, pts);
    gr.ResetTransform();
}

Источник: http://csharphelper.com/blog/2015/05/draw-stars-inside-polygons-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector