netlib.narod.ru< Назад | Оглавление | Далее >

Комбинирование преобразований

Теоретически преобразовывать страницу не нужно. Преобразование лишь масштабирует изображение, что вполне можно сделать при мировом преобразовании. Однако часто удобно объединить два преобразования, особенно если требуется нарисовать фигуры определенного размера, которые затем подвергаются мировому преобразованию.

Эта программа рисует 36 дюймовых квадратов, повернутых вокруг центра области экрана.

RotatedRectangles.cs

  //--------------------------------------------------
  // RotatedRectangles.cs (C) 2001 by Charles Petzold
  //--------------------------------------------------
  using System;
  using System.Drawing;
  using System.Drawing.Drawing2D;
  using System.Windows.Forms;

  class RotatedRectangles: PrintableForm
  {
      public new static void Main()
      {
          Application.Run(new RotatedRectangles());
      }
      public RotatedRectangles()
      {
          Text = "Rotated Rectangles";
      }
      protected override void DoPage(Graphics grfx, Color clr, int cx, int cy)
      {
          Pen      pen   = new Pen(clr);
          grfx.PageUnit  = GraphicsUnit.Pixel;
          PointF[] aptf  = { (PointF) grfx.VisibleClipBounds.Size };
          grfx.PageUnit  = GraphicsUnit.Inch;
          grfx.PageScale = 0.01f;

          grfx.TransformPoints(CoordinateSpace.Page, 
                               CoordinateSpace.Device, aptf);

          grfx.TranslateTransform(aptf[0].X / 2, aptf[0].Y / 2);
          
          for (int i = 0; i < 36; i++)
          {
               grfx.DrawRectangle(pen, 0, 0, 100, 100);
               grfx.RotateTransform(10);
          }
     }
}

Самое сложное здесь — расчет аргументов метода TranslateTransform для сдвига начала мировых координат в центр области экрана. Метод DoPage задает измерения страницы в пикселах, чтобы получить значение свойства VisibleClipBounds в пикселах. После этого DoPage устанавливает измерение страницы в единицах 1/100 дюйма, затем преобразует ширину и высоту области экрана к координатам страницы. Метод TranslateTransform использует эти значения вполовину уменьшенными.

Самое простое в этой программе — цикл for: он рисует прямоугольник шириной в 100 единиц, расположенный сверху в точке (0, 0). После этого метод RotateTransform поворачивает его на 10°, готовясь к следующему обороту цикла. Вот результат:


Рис. 7.12.

Умение вращать объекты вокруг начала координат пригодится нам в главе 10 — в программе, рисующей аналоговые часы.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz