1. Теоретические сведения icon

1. Теоретические сведения



Смотрите также:
Пособие для учащихся общеобразовательных учреждений Часть с предисловие Раздел  Текст как...
Водородный показатель вчера, сегодня, завтра...
«Термодинамические процессы в идеальном газе» по курсу «Теоретические основы теплотехники»...
Русский язык готовимся к егэ...
Реферат отчёт по выпускной курсовой работе содержит листов...
Контрольная работа по математике №1 До 1 ноября...
Задачи по физике...
Мориса Метерлинка «Синяя птица»...
Компьютерная графика...
“Последовательный сумматор.”...
Поляризация электромагнитных волн...
Методика выполнения работы открыть рабочее окно программы matlab...



скачать
Лабораторная работа №2

Графические возможности Visual C#. Построение графика функции.


Цель работы: Изучить основные возможности среды разработки для создания графических объектов. Познакомиться с базовым набором графических примитивов.

1. Теоретические сведения

1.1. ОСОБЕННОСТИ GDI+


Для рисования объектов в Windows Forms приложениях язык С# содержит очень богатый набор методов. Пространство имен Drawing содержит множество объектов, которые облегчают программисту работу с графикой. Специально для .NET платформы разработчики Microsoft разработали GDI+ библиотеку, значительно повысив возможности GDI

(Graphic Device Interface). GDI+ включает возможности рисования простейших объектов (линии, эллипсы...), рисование различных объектов 2D графики, отображение файлов различных графических форматов (bmp, jpeg, gif, wmf, ico, tiff...) и многое другое.

Перед началом рисования линий и фигур, вывода текста или отображения изображений с помощью библиотеки GDI+, необходимо создать графический объект. Графический объект представляет собой пространство для рисования и является объектом, используемым для создания изображения.

Для работы с графикой необходимо выполнить два действия:

  1. Создать графический объект.

  2. применить графический объект для рисования линий, фигур, вывода текста или отображения картинки.

Графический объект может быть создан различными способами:

  • Созданием ссылки на графический объект как часть аргументов PaintEventArgs события Paint для формы или объекта управления. Чаще всего этот метод используется, если необходимо запрограммировать рисование для нового объекта управления.

  • Вызовом метода CreateGraphics объекта управления или формы для размещения графического объекта на поверхности объекта управления или формы. Метод используется, если необходимо рисовать на форме или объекте управления, которые уже существуют.

  • Созданием графического объекта из любого объекта, являющегося изображением. Этот подход используется, когда необходимо изменить уже существующее изхображение.



^

1.2. Графический инструментарий


1.2.1 Пространства имен и классы

Весь графический инструментарий расположен в пространствах имен, перечис­ленных в табл. 2.1,

Таблица 2.1. Пространства имен для отрисовки изображений

Пространство

Описание

System.Drawing

Предоставляет простые классы, такие как Pen (карандаш), Brush (кисть), Bitmap (изображение) и т. п.

System.Drawing. Drawing2D

Предоставляет дополнительные классы, такие как Adjustable-ArrowCap (реализует наконечники для линий), Liner-GradientBrush (реализует градиентную заливку), Matrix (реализует аффинные преобразования изображений) и др.

System.Drawing. Imaging

Предоставляет дополнительные классы для работы с изображе­ниями, такие как ColorMap (поверхность для отображения ри­сунков с корректируемыми цветами), ColorMatrix (матрица 5x5 для коррекции цветов), Metafile (класс для работы с метафайлами) и др.

System.Drawing. Printing

Содержит классы для работы с принтером, такие как Margins (управляет полями), PageSettings (задает параметры для од­ной страницы), PreviewPageInfo (содержит информацию для предварительного просмотра изображений) и др.

System.Drawing. Text

Содержит классы для работы с текстом, такие как FontCollection (базовый класс для создания коллекции шрифтов), installedFontCollection (коллекция установленных в систе­ме шрифтов) и др.


1.2.2 Класс Graphics

В CTS для отрисовки компонентов предлагаются классы Pen, Brush, Font, Re­gion, Bitmap, Palette и Graphics. Каждый из них может работать только в рамках заданного контекста графического устройства. Графическими устройст­вами являются дисплей, принтер, плоттер и т. п. Контекст графического устрой­ства (далее — просто контекст устройства) представляет собой набор параметров, характеризующих это устройство и использующихся для вывода изображений, текста, линий и других графических объектов.

Класс Graphics определяет набор свойств и методов для отрисовки различных изображений на поверхности контекста устройства. Он передается как параметр вызова обработчикам события Paint, и в этом случае его не нужно создавать или уничтожать. Для самостоятельного создания объекта Graphics могут использо­ваться его методы FromXXX (см. далее). В табл. 2.2 и 2.3 представлены наибо­лее важные свойства и методы класса.

Таблица 2.2. Свойства класса Graphics

Свойство

Описание

public Region Clipfget; set;}

Определяет область отрисовки

public RectangleF ClipBounds{get;};

Возвращает вещественные координаты области отрисовки

public enum CompositingMode = (SourseCopy, SoureseOver);

public CompositingMode CompositingMode{get; set;};

Определяет, будут ли пикселы изображения за­менять (SourseCope) собой пикселы фона или взаимодействовать с ними

public enum CompositingQuality = (AssumeLiner, Default, HighQuality, Highspeed, Invalid);

public CompositingQuality CompositingQuality{get; set;}

Определяет качество отрисовки: AssumeLiner — допускается линеаризация значений; Default — умалчиваемое качество; HighQuality — высо­кое качество, низкая скорость; Highspeed — низкое качество, высокая скорость; invalid — неправильное значение качества

public float DPiX{get;}

Горизонтальная разрешающая способность кон­текста

public float DPiY{get;}

Вертикальная разрешающая способность кон­текста

public enum InterpolationMode = (Bicubic, Bilinear, Default, High, HighQualityBicubic, HighQualityBilinear, Invalid, Low) ; public InterpolationMode InterpolationMode{get; set;}

Определяет режим интерполяции (изменение цвета между двумя точками изображения): Bicubic — бикубическая интерполяция; Bilinear — билинейная интерполяция; Default — умалчиваемая интерполяция; High — интерполяция высокого качества; HighQualityBicubic — бикубическая интерпо­ляция высокого качества; HighQualityBilinear — билинейная интерпо­ляция высокого качества; Invalid — непра­вильное значение; Low — интерполяция низкого качества

public bool IsClipEmpty{get;}

Содержит true, если область отрисовки пуста

public bool IsVisibleClipEmpty{get;}

Содержит true, если видимая часть области от­рисовки пуста

public Matrix Transform{get; set; }

Содержит матрицу преобразования координат отрисовки

Таблица 2.3. Методы класса Graphics

Метод

Описание

public GraphicsContainer BeginContainer();

Начинает работу с графическим контейнером (информацию о перегруженных методах см. в справочной службе)

public void Clear(Color Col);

Очищает поверхность отрисовки и заливает ее указанным цветом

public void Dispose();

Освобождает все ресурсы, связанные с объек­том Graphics

public void DrawArc(Pen P, Rectangle R, Single Start, Single Finish);

Вычерчивает пером Р дугу эллипса, вписанного в прямоугольник R, в секторе, ограниченном углами Start и Finish (информацию о пере­груженных методах см. в справочной службе)

public void DrawBezier(Pen P, Point Tl, Point T2, Point T3, Point T4);

Вычерчивает кривую Безье, проходящую по указанным точкам (информацию о перегружен­ных методах см. в справочной службе)

public void DrawClosedCurve (Pen P. Point[] Points);

Вычерчивает замкнутую кривую, проходящую по заданным точкам (информацию о перегру­женных методах см. в справочной службе)

public void DrawCurve(Pen P, Point[] Points);

Вычерчивает кривую, проходящую по заданным точкам (информацию о перегруженных методах см. в справочной службе)

public void DrawEllipse(Pen P, Rectangle Rect);

Вычерчивает эллипс, вписанный в прямоуголь­ник Rect (информацию о перегруженных мето­дах см. в справочной службе)

public void DrawIcon(Icon Ic, Rectangle Rect);

Вычерчивает значок 1с в области Rect (инфор­мацию о перегруженных методах см. в справоч­ной службе)

public void DrawImage(Image Im, Rectangle Rect);

Вычерчивает изображение im в области Rect (информацию о перегруженных методах см. в справочной службе)

public void DrawLine(Pen P, Point Tl, Point T2);

Вычерчивает линию между указанными точка­ми (информацию о перегруженных методах см. в справочной службе)

public void DrawLines(P: Pen; Points: array of Point);

Вычерчивает линии, соединяющие указанные точки (информацию о перегруженных методах см. в справочной службе)

public void DrawPath(Pen P, GraphicsPath Path);

Вычерчивает пером р объект Path

public void DrawPie(Pen P, Rectangle Rect, int StartAngle, int FinishAngle);

Вычерчивает сектор эллипса, вписанного в пря­моугольник Rect, ограниченный радиальными лучами StartAngle, FinishAngle (информа­цию о перегруженных методах см. в справочной службе)

public void DrawPolygon(Pen P, Point[] Points);

Вычерчивает полигон — замкнутую ломанную линию, соединяющую заданные точки (инфор­мацию о перегруженных методах см. в справоч­ной службе)

public void DrawRectangle(Pen P, Rectanle Rect);

Вычерчивает прямоугольник (информацию о пе­регруженных методах см. в справочной службе)

public void DrawString(string S, Font F, Brush B, Single Start);

Выводит строку S текста: F — шрифт; в — кисть; start — начальная точка (информацию о перегруженных методах см. в справочной службе)

public void EndContainer ( GraphicsContainer Container);

Заканчивает работу с графическим контейне­ром

public void ExcludeClip( Rectangle Rect);

Исключает из области отрисовки прямоуголь­ник Rect (информацию о перегруженных мето­дах см. в справочной службе)

public void FillClosedCurve ( Brush B, Point[] Points);

Закрашивает кистью В внутреннюю область замкнутой кривой, проходящей через точки Points (информацию о перегруженных методах см. в справочной службе)

public void FillEllipse(Brush B, Rectangle Rect);

Закрашивает кистью в внутреннюю область эл­липса (информацию о перегруженных методах см. в справочной службе)

public void FillPath(Brush В, GraphicsPath Path);

Закрашивает внутреннюю область объекта Path

public void FillPie(B: Brush; Rect: Rectangle; StartAngle, FinishAngle: Single);

Закрашивает внутреннюю область сектора эл­липса (информацию о перегруженных методах см. в справочной службе)

public void FillPolygon(Brush В Point [] Points);

, Закрашивает внутреннюю область полигона (информацию о перегруженных методах см. в справочной службе)

public void FillRectangle (Brush B, Rectangle Rect);

Закрашивает внутреннюю область прямоуголь­ника (информацию о перегруженных методах см. в справочной службе)

public void FillRectangles (Brush B, Rectangle[]] Rects);

Закрашивает внутренние области нескольких прямоугольников (информацию о перегружен­ных методах см. в справочной службе)

public void FillRegion(Brush B, Region Reg);

Закрашивает область Reg (информацию о пере­груженных методах см. в справочной службе)

public Graphics FromHdc(IntPtr DC) ;

Создает объект Graphics по заданному контек­сту устройства DC

public Graphics FromHWND(IntPtr HWND);

Создает объект Graphics по заданному деск­риптору окна hwnd

public Graphics FromImage (Image Img) ;

Создает объект Graphics но заданному объекту Img

public IntPtr GetHDCO;

Возвращает контекст устройства объекта

public bool isClipEmpty();

Возвращает true, если объект пуст

public bool IsVisible(Point T) ;

Возвращает true, если точка T принадлежит видимой области объекта (информацию о перегруженных методах см. в справочной службе)

public Region[] MeasureCharacterRanges (string S, Font F. Rectangle Layout, StringFormat[] SF) ;

Метод возвращает объект Region, который содержит заданную подстроку строки s

public SizeF MeasureString (string S, Font F);

Метод возвращает размеры строки S (информа­цию о перегруженных методах см. в справочной службе)

public void ReleaseHdc(IntPtr Hdc) ;

Освобождает контекст устройства, полученный методом GetHDC

public void ResetClip();

Восстанавливает бесконечные границы области отрисовки

public void

Restore(GraphicsObject GS);

Восстанавливает состояние объекта, сохранен­ное в объекте GS методом Save

public GraphicsState Save();

Сохраняет текущее состояние объекта

public void SetClip(Graphics G);

Устанавливает размеры области отрисовки те­кущего объекта равными указанным в свойстве Clip объекта G (информацию о перегруженных методах см. в справочной службе)

public void TransformPoints (CoordinatSpace CS1, CoordinatSpace CS2,Point [] Points);

Преобразует массив точек Points из одной координатной системы в другую (информацию о перегруженных методах см. в справочной службе)

public void TranslateClip (int X, int Y) ;

Изменяет размеры области отрисовки (инфор­мацию о перегруженных методах см. в справоч­ной службе)

public void TranslateTransform (Single X, Single Y);

Изменяет начало координат области отрисовки (информацию о перегруженных методах см. в справочной службе)

Класс Graphics является базовым классом для отрисовки изображений.

1.2.3 Отрисовка линий

Для отрисовки линий CTS предоставляет два класса — Реn и Brush, а также ме­тод DrawLine класса Graphics.

Класс Реn позволяет выбирать толщину линий, добавлять к ним наконечники, а также нужным образом соединять линии. Класс Brush обеспечивает раскраску линии, в том числе заполнение ее градиентным цветом, узором или текстурой. Метод DrawLine осуществляет собственно отрисовку линии, используя нужные перо Реn и кисть Brush.

Методами BeginContainer () и EndContainer () создается и уничтожается графический контейнер — специальный объект класса GraphicsContainer (про­странство имен System.Drawing.Drawing2D), в котором сохраняются текущие параметры объекта Graphics.

При вызове BeginContainer () параметры помещаются в стек. Любые измене­ния параметров до вызова EndContainer () уничтожаются и восстанавливают­ся сохраненные в стеке. Контейнеры могут быть вложенными, но каждый вызов EndContainer () уничтожает самый последний контейнер (количество вызовов EndContainer () может быть меньше вызовов BeginContainer () ).

В следующем примере со­здается контейнер, затем начало координат смещается на 100 пикселов влево и вниз, вычерчивается черной утолщенной линией прямоугольник и контейнер уничтожается. После этого вычерчивается синий прямоугольник того же размера (рис. 2.1).

В листинге 2.1 представлен обработчик события Form. Paint описанного при­мера.



Рис. 2.1. Демонстрация работы с контейнером

Листинг 2.1. Демонстрация работы с контейнером

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Drawing.Drawing2D;

namespace ContainerDemo {

public partial class Forml : Form {

public Forml() {

InitializeComponent(); }

private void Forml_Paint(object sender, PaintEventArgs e)

{

// Создаем контейнер:

GraphicsContainer GS = e.Graphics.BeginContainer();

// Смещаем начало координат:

e.Graphics.TranslateTransform(100, 100);

// Вычерчиваем черный прямоугольник:

Pen P = new Pen(Color.Black, 2);

e.Graphics.DrawRectangle(P, 0, 0, 200, 200);

e.Graphics.EndContainer(GS); // Удаляем контейнер

// Заливаем синий прямоугольник:

SolidBrush В = new SolidBrush(Color.Blue);

e.Graphics.FillRectangle(В, 0, 0, 200, 200);

}

}

}

Аналогично работают методы Save () и Restore ().

В методах DrawArc () и DrawPie () используются ограничивающие углы Start и Finish. Начало отсчета углов соответствует радиальной горизонтальной ли­нии, направленной вправо. Положительные углы отсчитываются по часовой стрел­ки, отрицательные — против.

Методы SetClip () , IntersectClip () и ResetClip () управляют размерами и положением области отрисовки.

Класс Graphics обеспечивает возможность использования графических объек­тов класса GraphicsPath (пространство имен System.Drawing.Drawing2D). Эти объекты имеют методы, позволяющие наполнять их графическими прими­тивами, линиями и кривыми. Метод DrawPath () вычерчивает все содержимое объекта GraphicsPath разом. Рисунок 2.4 получен с помощью показанного в листинге 2.3 обработчика события Paint .



Рис. 2.4. Демонстрация метода DrawPath

Листинг 2.3. Демонстрация метода DrawPath

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Drawing.Drawing2D;

namespace GraphicPath {

public partial class Forml : Form

{

public Forml() {

InitializeComponent() ; }

private void Forml_Paint(object sender, PaintEventArgs e) {

// Создаем объект GraphicsPath:

GraphicsPath GP = new GraphicsPath();

// Наполняем его эллипсами:

GP.AddEllipse(60, 0, 60, 40);

GP.AddEllipse(60, 40, 60, 80);

GP.AddEllipse(31, 60, 30, 30);

GP.AddEllipse(119, 60, 30, 30);

GP.AddEllipse(55, 120, 30, 20);

GP.AddEllipse(95, 120, 30, 20);

e.Graphics.TranslateTransform(60, 60);

// Отрисовываем все содержимое объекта GpahicsPath:

Pen P = new Pen(Color.Black, 3);

e.Graphics.DrawPath(P, GP) ;

} } }

Методы DrawBezier() и DrawCurve() рисуют кривые линии. Кривая Безье определяется начальной и конечной, а также несколькими промежуточными точ­ками (в методе DrawBezier() две промежуточные точки). В методе DrawCurve () используется сплайн-интерполяция между произвольным количеством точек. На рис. 2.5 показаны примеры кривых, создаваемых этими методами.

Листинг 2.4. Демонстрация вычерчивания кривых линий

private void Forml_Paint(object sender, PaintEventArgs e) {

// Точки излома для метода Curve:

Point [] Curve = new Point [7];

Curve[0] = new Point (50, 50);

Curve[1] = new Point(100, 25);

Curve[2] = new Point(200, 50);

Curve[3] = new Point (100, 150);

Curve[4] = new Point(300, 100);

Curve[5] = new Point (350, 200);

Curve[6] = new Point(250, 150);

// Рисуем кривую:

Pen P = new Pen(Color.Black, 2);

e.Graphics.DrawCurve(P, Curve);

// Рисуем ломаную линию по координатам кривой:

Реп р = new Pen(Color.Blue, 1);

е.Graphics.DrawLines(p, Curve);

// Точки излома для метода Bezier:

Point[] Bezier = new Point[4];

Bezier[0] = new Point(500, 50);

Bezier [1] = new Point(350, 100);

Bezier[2] = new Point(650, 150);

Bezier[3] = new Point(500, 200);

// Рисуем кривую Безье:

e.Graphics.DrawBezier(P,

Bezier[0], Bezier[l], Bezier [2], Bezier[3]);

// Рисуем ломаную линию по координатам кривой Безье:

е.Graphics.DrawLines(p, Bezier); }



Рис. 2.5. Демонстрация методов DrawLines, DrawCurve и DrawBezier

Этот рисунок создан обработчиком из листинга 2.4 .


Метод MeasureCharacterRanges () возвращает объекты типа Region, поло­жение и размеры которых соответствуют положению и размерам некоторых под­строк в заданной строке. Параметр обращения SF класса StringFormat имеет метод SetMeasurableCharacterRanges (), с его помощью задаются порядковый номер символа (нумерация начинается с нуля) и количество символов, поло­жение которых нужно определить.

ПРИМЕЧАНИЕ Описываемые методы правильно работают только со строками, созданными шрифтами типа Courier, в которых ширина знакоместа не изменяется (такие шрифты называются моноширинными).

В листинге 2.5 представлен обработчик события Paint формы, создающий окно, показанное на рис. 2.6.



Рис. 2.6. Демонстрация метода MeasureCharacterRanges

Листинг 2.5. Демонстрация метода MeasureCharacterRanges

private void Forml_Paint(object sender, PaintEventArgs e) {

// Создаем моноширинный шрифт:

Font F = new Font("Courier New", 22, FontStyle.Bold);

// Выводим строку:

string S = "First and Second ranges";

SolidBrush В = new SolidBrush(Color.Black);

e.Graphics.Drawstring(S, F, B, 50.OF, 50.OF);

// Определяем прямоугольник строки:

float w = e.Graphics.MeasureString(S, F).Width; // Ширина

float h = e.Graphics.MeasureString (S, F).Height; // Высота

// Прямоугольник строки:

RectangleF Layout = new RectangleF(50.Of, 50.Of, w, h);

// Готовим измерение:

StringFormat SF = new StringFormat();

SF.FormatFlags = StringFormatFlags.DirectionRightToLeft;

CharacterRange[] CR = new CharacterRange[2];

CR[0] = new CharacterRange(0, 5); // Параметры 1-й подстроки

CR[1] = new CharacterRange(10, 6); // Параметры 2-й подстроки

// Измеряем:

SF.SetMeasurableCharacterRanges(CR);

// Обрабатываем результат:

Region[] Reg = new Region[2]; // Области для подстрок

Reg = e.Graphics.MeasureCharacterRanges(S, F, Layout, SF) ;

RectangleF MR = Reg[0].GetBounds(e.Graphics); // 1-я подстрока

Pen P = new Pen(Color.Red);

е.Graphics.DrawRectangle (P, Rectangle.Round(MR)); // Очерчиваем

MR = Reg[1].GetBounds(e.Graphics); // 2-я подстрока

e.Graphics.DrawRectangle(P, Rectangle.Round(MR)); // Очерчиваем

}

Вызовом Rectangle .Round (MR) прямоугольник с вещественными координата­ми преобразуется в прямоугольник с целочисленными координатами.

ПРИМЕЧАНИЕ Вещественные константы в С# принадлежат типу double. Для приведения их к типу float можно ставить символ F или f за последней цифрой константы.

Свойство Transform содержит объект класса Matrix (пространство имен Sys­tem . Drawing. Drawing2D). Этот объект определяет матрицу 3x3 для так назы­ваемых аффинных преобразований координат. При аффинных преобразованиях поворот и масштабирование изображений осуществляются путем нужного измене­ния системы координат. Для этого в состав класса включены методы Translate () (смещение начала координат), Scale () (масштабирование) и RotateAt () (поворот на заданный угол).



Рис. 2.7. Смещение начала координат

В листинге 2.6 демонстрируется метод Translate: сначала создается квад­рат со стороной 100 пикселов и выводит­ся синим цветом в левом верхнем углу эк­рана; затем начало координат смещается на 100 пикселов вниз и вправо, после чего квад­рат вычерчивается вновь красным цветом. В результате в окне формы оказываются два квадрата: синий в левом верхнем углу и сме­щенный на 100 пикселов вправо и вниз крас­ный (рис. 2.7).

Листинг 2.6. Демонстрация метода Transform

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Drawing.Drawing2D;

namespace TransformDemo {

public partial class Forml : Form {

public Forml() {

InitializeComponent() ;

}

private void Form1_Paint(object sender, PaintEventArgs e)

{

// Создаем квадрат:

Rectangle R = new Rectangle (0, 0, 100, 100);

// Выводим его:

Pen P = new Pen(Color.Blue, 2);

e.Graphics.DrawRectangle(P, R);

// Создаем матрицу:

Matrix M = new Matrix();

// Смещаем начало координат:

M.Translate (100, 100);

// Вставляем в контекст устройства:

е.Graphics.Transform = М;

// Вновь выводим квадрат:

P.Color = Color.Red;

е.Graphics.DrawRectangle(P, R);

} } }

Для демонстрации метода Scale () поместите на форму два компонента Track-Bar (для этого в окне Toolbox раскройте узел All Windows Forms) и назовите их tbHor и tbVer. В свойство Orientation компонента tbVer поместите значе­ние Vertical и разместите компоненты на форме примерно так, как показано на рис. 2.8 .



Рис. 2.8. Масштабирование изображения

В свойства Maximum, Minimum, TickFrequency и Value компонентов поме­стите значения 100, 1, 10, 10 соответственно. Создайте для их события Value-

Change и для события Paint формы обработчики (для события tbVer_Value-Change назначьте обработчик события tbHor_ValueChange), показанные в лис­тинге 2.7.

Листинг 2.7. Масштабирование изображений

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Drawing.Drawing2D;

namespace ScaleDemo {

public partial class Forml : Form

{

public Forml() {

InitializeComponent (); }

private void tbHor_ValueChanged(object sender, EventArgs e)

// При изменении значения свойства Value отрисовываем форму заново

{

Refresh (); }

private void Forml_Paint(object sender, PaintEventArgs e)

{

// Создаем матрицу:

Matrix M = new Matrix();

// Масштабируем с учетом положения ползунков TrackBar:

М.Scale(tbHor.Value / 10, tbVer.Value /10);

// Вставляем матрицу в контекст устройства:

е.Graphics.Transform = М;

// Вычерчиваем прямоугольник:

Реп Р = new Pen (Color.Blue, 2);

е.Graphics.DrawRectangle(P, 70, 70, 200, 200) ; } } }

При масштабировании в матрицу помещаются два коэффициента (dX и dY), на которые будут умножаться значения, соответственно, горизонтальной и вертикаль­ной осей. Если коэффициент меньше 1, изображение сжимается, если больше — растягивается. Так как значения свойства Value компонента TrackBar не могут быть меньше единицы, эти значения при формировании матрицы делятся на 10.

Метод RotateAt () класса Matrix создает матрицу, поворачивающую оси коор­динат на заданный угол относительно указанной точки. На рис. 2.9 показана форма с надписями, повернутыми на разные углы относительно горизонтального направления.



Рис. 2.9. Поворот изображения

Эту форму создала программа, представленная в листинге 2.8.

Листинг 2.8. Поворот изображений

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Drawing.Drawing2D;

namespace RotateDemo {

public partial class Forml : Form

{

public Forml()

{

InitializeComponent();

}

private void Forml_Paint(object sender, PaintEventArgs e)

{

// Строка для вывода:

string S = " Visual C# v.2.0";

// Создаем графический путь:

GraphicsPath GP = new GraphicsPath();

// Создаем семейство шрифтов:

FontFamily FF = new FontFamily("Courier");

// Точка вывода - середина формы:

Point Р = new Point(Width / 2, Height 12);

// Помещаем строку в ГП:

StringFormat SF = new StringFormat(StringFormat.GenericDefault);

GP.AddString(S, FF, (int)FontStyle.Bold, 20, P, SF) ;

// Создаем матрицу поворота:

Matrix M = new Matrix();

// Цикл вывода:

Pen p = new Pen(Color.Black, 1);

for (int k = 1; k < 9; k++)

{

// Выводим надпись с текущим поворотом осей:

е.Graphics.DrawPath(p, GP);

// Поворачиваем оси для следующего прохода:

M.RotateAt(45, Р);

}}

При добавлении в графический путь строки помимо собственно строки нужно задать семейство шрифтов, стиль шрифта, его размер, точку старта строки и фор­мат строки. Для задания начертания (полужирный, курсив и т. п.) можно приме­нить перечисление FontStyle. Однако для совместимости элемент перечисления необходимо явно привести к типу int. Объект класса StringFormat содержит всю необходимую информацию о формате надписи: центрирование по осям, рас­стояние между символами и строками и т. п.

Обратите внимание: при отрисовке графического пути заданным пером р очерчи­ваются все находящиеся в нем объекты. Надпись очерчивается по периметру букв, поэтому буквы получились «пустыми».

^

1.3. Рисование текста


Для рисования текста используется метод DrawText. Для прорисовки сначала создается объект Font со шрифтом типа Lucida Sans Unicode размером 15 единиц. Затем при помощи метода DrawString строка текста «Программирование на С#» выводится на экран.


// создаем объект Graphics

Graphics g = this.CreateGraphics ();

// создаем объект Font

Font titieFont = new Font("Lucida Sans Unicode", 15);

// рисуем текст красным цветом

g.DrawString("Программирование на С#",titleFont, new SolidBrush{Color.Red), point.X, point.Y);

^

1.4. Рисование графических примитивов


Для рисования линий или контуров фигур

  1. Создайте ссылку на графический объект, который будет использоваться для рисования.

Graphics g = button1.CreateGraphics();

  1. Создайте экземпляр класса Pen, который будет использоваться для рисования линий

Pen myPen = new Pen(Color.Red, 2);

  1. Вызовите метод, изображающий необходимую фигуру. Наиболее часто используемые методы.

g.DrawLine(myPen, 1, 1, 45, 65); //линия

g.DrawBezier(myPen, 15, 15, 30, 30, 45, 30, 87, 20); //кривая Безье

g.DrawEllipse(myPen, Rectangle(33, 45, 40, 50)); //эллипс

g.DrawRectangle(myPen, Rectangle(33, 45, 40, 50));

Для рисования закрашенных фигур

  1. Объявите графический объект

Graphics g = button1.CreateGraphics();

  1. Создайте экземпляр кисти Brush.

SolidBrush myBrush = new SolidBrush(Color.Red);

  1. Вызовите метод, изображающий необходимую фигуру.

g.FillRectangle(myBrush, Rectangle(50, 50, 100, 100)); //прямоугольник

g.FillPie(myBrush, Rectangle(110, 110, 300, 300), 0, 90); //четверть круга


Для того, чтобы нарисовать линию, необходимо выполнить следующие действия:


// создаем объект Реn

Реп BlaсkРеn = new Pen (Color.Black, 3) ;

// создаем объект Graphics

Graphics g = this.CreateGraphics();

// рисуем линию

g. DrawLine (BlaсkРеn, PreviousPoint, point);


Для того, чтобы нарисовать эллипс, необходимо выполнить следующие действия:


// создаем объект Pen

Pen BlaсkРеn = new Pen (Color .Black, 3);

// создаем объект Graphics

Graphics g = this.CreateGraphics();

// рисуем эллипс

g. DrawEllipse (BlaсkРеn, PreviousPoint.X, PreviousPoint.Y, point.X — PreviousPoint.X, point.Y — PreviousPoint.Y)

^

3. Задания для самостоятельного выполнения


Выполнить задание согласно варианту:

    1. Выбрать необходимые компоненты.

    2. Разработать алгоритм решения задачи.

    3. Разработать приложение.

Построить график функции согласно варианту задания. Предусмотреть ввод параметров функции. График должен занимать все отведенное для него место с указанием числовой разметки на осях координат.

^ Декартовая система координат

1. Улитка Паскаля:

  x=A·cos2(t)+B·cos(t)
  y=A·cos(t)·sin(t)+B·sin(t)

Коэффициенты: A>B, B>0;

Область определения функции: 0t<2·;

Рассмотреть случаи, когда B2·A; AB.


2. Спирограф

  x=(A-B)·cos(t)+D·cos(w)
  y=(A-B)·sin(t)-D·sin(w),

Коэффициенты: w=A·t/B, D
Область определения функции: 0t2··n, n равно B, деленному на наибольший общий делитель (НОД) B и A.


3. Кардиоида

  x=A·cos(t)·(1+cos(t))
  y=A·sin(t)·(1+cos(t))

Область определения функции: 0t<2·;

Коэффициенты: A>0.


4. Эпициклоида

  x=(A+B)·cos(t)-A·cos((A+B)·t/A)
  y=(A+B)·sin(t)-A·sin((A+B)·t/A),

Коэффициенты: A>0, B>0;

Рассмотреть следующие случаи:

а) если В/А есть целое, положительное число, то  0t<2·);

в) если В/А=p/q, где p и q - целые положительные взаимно простые числа, то 0t<2·q·.


^ 5. Конхоида Никомеда

  x=A+L·cos(t)
  y=A·tg(t)+L·sin(t),

Область определения функции: при -/2
Коэффициенты: A>0, L>0;

Рассмотреть случаи, когда LA, L=A.


6. “Бабочка”

  x=sin(A·t+B)·cos(C·t)
  y=sin(A·t+B)·sin(D·t),

Область определения функции: 0t2·;

Коэффициенты: A>0, B>0, C>0, D>0.


^ 7. Декартов лист

  x =3·A·t/(t3+1)
  y=3·A·t2/(t3+1)

Область определения функции: -∞

8. Циклоида

  x=A·t-B·sin(t)
  y=A-B·cos(t)

Область определения функции: 0t2·;

Рассмотреть случаи: B>A, B

9. Гипоциклоида

  x=(B-A)·sin(A·t/B)-C·sin((B-A)·t/B)
  y=(B-A)·cos(A·t/b)+C·cos((B-A)·t/B),

Область определения функции: 0t2·.


10. Трактриса

  x=A·(cos(t)+ln(tg(t/2))
  y=A·sin(t)

Область определения функции: 0t2·.


11. Цепная линия

  y=A·(ex/2+e-x/2)/2.


Полярная система координат


12. Циссоида Диоклеса

  =A·(cos-1(φ)-cos(φ)).


13. Диаграмма направленности

  =L·(1+cos(φ))·sin(·A·sin(φ)/L)/(2··A·sin(φ)), A>0, 0φ<2·.


14. Крест "Cruciform"

  =2·A·sin-1(2φ).


15. Триссектриса

  =A·(4·cos(φ)-cos-1(φ)).




Скачать 352,92 Kb.
оставить комментарий
Дата29.09.2011
Размер352,92 Kb.
ТипЛабораторная работа, Образовательные материалы
Добавить документ в свой блог или на сайт

хорошо
  1
отлично
  1
Ваша оценка:
Разместите кнопку на своём сайте или блоге:
rudocs.exdat.com

Загрузка...
База данных защищена авторским правом ©exdat 2000-2017
При копировании материала укажите ссылку
обратиться к администрации
Анализ
Справочники
Сценарии
Рефераты
Курсовые работы
Авторефераты
Программы
Методички
Документы
Понятия

опубликовать
Документы

наверх