Опубликован: 13.07.2010 | Доступ: свободный | Студентов: 891 / 20 | Оценка: 4.40 / 4.20 | Длительность: 77:34:00
Самостоятельная работа 16:

Рисование графических примитивов средствами GDI+

Упражнение 7. Параметрические уравнения и рисование кривых (рисование эллипса)

Если для практического рисования сложных кривых использовать их обычные уравнения, то возникнут большие проблемы. Например, окружность радиуса r описывается уравнением

x^2+y^2=r^2

Если представить это уравнение в удобном для построения графика виде, то получим

y=\pm \sqrt{r^2-x^2}

которым пользоваться нельзя.

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

x(t) = r*cos(t);
y(t) = r*sin(t);

Для t, изменяющегося от 0 до Pi, получим график окружности. Аналигичным образом можно построить эллипс

x(t) = Rx*cos(t);
y(t) = Ry*sin(t);

Вот программа рисования эллипса, вписанного в экран

using System;
using System.Drawing;
using System.Windows.Forms;
  
namespace Test
{
  public class PolyEllipse : PrintableForm
  {
    public PolyEllipse()
    {
      this.Text = "Рисование эллипса функцией DrawLines()";
      this.Width += 100;
    }
  
    // Перегруженная функция базового класса PrintableForm
    protected override void DoPage(Graphics graphics, Color color, int cx, int cy)
    {
      int iNum = 2 * (cx + cy);
      PointF[] apointf = new PointF[iNum + 1];
      for(int i = 0; i <= iNum; i++)
      {
        double rAng = i * 2 * Math.PI / iNum;
        apointf[i].X = (float)((cx - 1) / 2 * (1 + Math.Cos(rAng)));
        apointf[i].Y = (float)((cy - 1) / 2 * (1 + Math.Sin(rAng)));
      }
  
      graphics.DrawLines(new Pen(color), apointf);
    }
  }
}
Листинг 16.16. Программа рисования эллипса (PolyEllipse.cs)

Изображение экрана для этой программы будет таким


Этот пример мы выполнили для упражнения, поскольку класс Graphics содержит метод рисования эллипса DrawEllipse().

Упражнение 8. Рисование эллипса специализированным методом

Приведем код, который в клиентской области формы рисует вписанный эллипс специализированным методом

using System;
using System.Drawing;
using System.Windows.Forms;
  
namespace Test
{
  public class ClientEllipse : PrintableForm
  {
    public ClientEllipse()
    {
      this.Text = "Рисование эллипса функцией DrawEllipse()";
    }
  
    // Перегруженная функция базового класса PrintableForm
    protected override void DoPage(Graphics graphics, Color color, int cx, int cy)
    {
      graphics.DrawEllipse(Pens.Red, 0, 0, cx - 1, cy - 1);
    }
  }
}
Листинг 16.17. Функция DrawEllipse() рисования эллипса (ClientEllipse.cs)

Выход программы следующий