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

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

Упражнение 9. Рисование спирали

Используя метод DrawLines() рисования линий по их параметрическим уравнениям, приведем еще один код, рисующий спираль.

using System;
using System.Drawing;
using System.Windows.Forms;
  
namespace Test
{
  public class Spiral : PrintableForm
  {
    public Spiral()
    {
      this.Text = "Рисование спирали функцией DrawLines()";
      this.Width += 100;
    }
  
    // Перегруженная функция базового класса PrintableForm
    protected override void DoPage(Graphics graphics, Color color, int cx, int cy)
    {
      const int iNumRevs = 10;
      int iNumPoints = iNumRevs * 2 * (cx + cy);
      PointF[] apointf = new PointF[iNumPoints];
      double rAngle, rScale;
  
      for(int i = 0; i < iNumPoints; i++)
      {
        rAngle =  iNumRevs * i * 2 * Math.PI / iNumPoints;
        // Когда хотя-бы один операнд вещественный, то автоматически преобразуется
        rScale = 1 - i / Convert.ToDouble(iNumPoints);
        apointf[i].X = (float)(Convert.ToDouble(cx) / 2 * (1 + rScale * Math.Cos(rAngle)));
        apointf[i].Y = (float)(Convert.ToDouble(cy) / 2 * (1 + rScale * Math.Sin(rAngle)));
      }
  
      graphics.DrawLines(new Pen(color), apointf);
    }
  }
}
Листинг 16.18. Код программы, рисующей спираль (Spiral.cs)

Экран программы будет таким


Обратите внимание, что когда мы вычисляем масштабный коэффициент rScale, то в операции деления один из операндов приводим к вещественному типу. В этом случае перед делением процессор автоматически приводит к вещественному и второй операнд, соответственно, и вычитание будет выполняться на уровне вещественных чисел. Если этого не сделать, то результатом деления целых будет ноль и вместо спирали получим многократно повторенный эллипс.

Упражнение 10. Рисование прямоугольников

Прямоугольник можно нарисовать при помощи функций DrawLine() и DrawLines(), что мы и делали ранее, вписывая его в клиентскую область формы. Но проще сделать это методом DrawRectangle() объекта Graphics. Имеются три перегруженных версии метода DrawRectangle() и две DrawRectangles():


В каждой из версий прямоугольник определяется точкой левого верхнего угла, шириной и высотой. Аналогично определяется структура Rectangle в одной из версий DrawRectangle(). Ширина и высота прямоугольника должны быть положительными. Прямоугольник с отрицательными шириной и высотой не вызовут исключения, но и не будут нарисованы.

При рисовании прямоугольников часто возникает ошибка смещения на 1 пиксел. При использовании свойства пера по умолчанию методу DrawRectangle() передаются значения ширины и высоты, равные 3. Если задать ширине и высоте значение 2, будет нарисован прямоугольник размером 3x3 пиксела, внутренняя область которого состоит лишь из одного пиксела.

Вот программа, которая рисует прямоугольник по краю клиентской области методом DrawRectangle()

using System;
using System.Drawing;
using System.Windows.Forms;
  
namespace Test
{
  public class OutlineClientRectangle : PrintableForm
  {
    public OutlineClientRectangle()
    {
      this.Text = "Рисование прямоугольника DrawRectangle()";

    }
  
    // Перегруженная функция базового класса PrintableForm
    protected override void DoPage(Graphics graphics, Color color, int cx, int cy)
    {
      graphics.DrawRectangle(new Pen(Color.Red, 20), 0, 0, cx - 1, cy - 1);
    }
  }
}
Листинг 16.19. Рисование прямоугольника функцией DrawRectangle() (OutlineClientRectangle.cs)

Результатом работы будет экран