Заполните эллипс случайными строками в C#

Как следует из названия, этот пример рисует эллипс, заполненный случайными строками. Однако он не может просто нарисовать эллипс в обработчике событий Paint формы. Это заставило бы программу генерировать новый набор случайных строк каждый раз, когда форма обновляется и создает странный результат.

Программа использует следующий код для генерации данных линии, когда форма загружается или изменяется.

// Рисование объектов.
private const int EllipseMargin = 10;
private int EllipseCx, EllipseCy, EllipseWidth, EllipseHeight;
private List LinePoints = null;

// Перерисовать по размеру.
private void Form1_Load(object sender, EventArgs e)
{
    this.ResizeRedraw = true;

    // Создаем исходные объекты рисования.
    MakeDrawingObjects();
}

// Форма изменилась. Создайте объекты рисования.
private void Form1_Resize(object sender, EventArgs e)
{
    MakeDrawingObjects();
}

// Создаем объекты рисования.
private void MakeDrawingObjects()
{
    // Вычислить параметры эллипса.
    EllipseWidth = this.ClientSize.Width - 2 * EllipseMargin;
    EllipseHeight = this.ClientSize.Height - 2 * EllipseMargin;

    // Создание случайных линий, соединяющих точки
    // на краю эллипса.
    EllipseCx = this.ClientSize.Width / 2;
    EllipseCy = this.ClientSize.Height / 2;
    Random rand = new Random();
    double circumference = 2 * Math.PI * Math.Sqrt(
        (EllipseWidth * EllipseWidth +
            EllipseHeight * EllipseHeight) / 2);
    int num_points = (int)(circumference / 40);
    LinePoints = new List();
    for (int i = 0; i < num_points; i++)
    {
        double theta1 = 2 * Math.PI * rand.NextDouble();
        float x1 = (float)(EllipseCx +
            Math.Cos(theta1) * EllipseWidth / 2);
        float y1 = (float)(EllipseCy +
            Math.Sin(theta1) * EllipseHeight / 2);
        LinePoints.Add(new PointF(x1, y1));

        double theta2 = 2 * Math.PI * rand.NextDouble();
        float x2 = (float)(EllipseCx +
            Math.Cos(theta2) * EllipseWidth / 2);
        float y2 = (float)(EllipseCy +
            Math.Sin(theta2) * EllipseHeight / 2);
        LinePoints.Add(new PointF(x2, y2));
    }
}

Метод MakeDrawingObjects выполняет всю работу. Он начинается с вычисления размеров эллипса. Затем он использует формулу C = 2 * Pi * Sqrt (ширина 2 + Height 2 ), чтобы приблизить окружность эллипса. Затем он делит окружность на 40, чтобы определить, сколько генерируемых случайных строк.

Для каждой строки программа генерирует две случайные точки на краю эллипса. См. Приведенный выше код для используемых им формул. Это в основном уравнения для точек на окружности, масштабируемые по ширине и высоте эллипса в направлениях X и Y.

Поскольку эта программа генерирует точки на краю эллипса, строки не выходят за пределы краев эллипса, поэтому коду не нужно устанавливать какой-либо области рисования перед рисованием линий.

Следующий код показывает, как программа рисует эллипс и строки.

// Рисуем эллипс и линии.
private void Form1_Paint(object sender, PaintEventArgs e)
{
    if ((EllipseWidth <= 0) || (EllipseHeight <= 0)) return;

    e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;

    // Заполните и нарисуйте эллипс.
    e.Graphics.FillEllipse(Brushes.LightBlue,
        EllipseMargin, EllipseMargin, EllipseWidth, EllipseHeight);
    e.Graphics.DrawEllipse(Pens.Blue,
        EllipseMargin, EllipseMargin, EllipseWidth, EllipseHeight);

    // Нарисуем линии.
    e.Graphics.DrawLines(Pens.Blue, LinePoints.ToArray());
}

Этот код заполняет эллипс и очерчивает его. Затем он вызывает DrawLines для рисования строк.

Источник: http://csharphelper.com/blog/2016/06/fill-an-ellipse-with-random-lines-in-c/

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