Китай |
Рисование графических примитивов средствами 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)
Результатом работы будет экран