Създаване на графични обекти

Методи на класGraphics

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

Можете да рисувате графики на функции и геометрични обекти както директно върху формуляра, така и в такива контроли като:Изображение, Панел, TabPageи други.

Всички геометрични обекти се чертаят с помощта на методите и свойствата на класа Graphics. В контролата първо трябва да създадете платно, което ще показва картината.

За да създадете платно за чертеж, напишете командата в кода:

Graphics canvas_name =form.control.CreateGraphics();

където control_control е елементът, върху който ще бъде създадено платното за рисуване.

Пример.

Графики g = this.pictureBox1.CreateGraphics();

Забележка. Control_element може да отсъства, платното може да бъде поставено директно върху формуляра.

Избор на инструменти за рисуване

Перо

Методите от класаGraphics, които рисуват контура на фигура, трябва да получат писалка - обект от класаPen, с който всички фигури ще бъдат нарисувани върху платното. В конструктора на класPenможете да зададете цвета на писалката и нейната дебелина (по-често се казва "ширина на писалката"). Цветът се задава от обекта на класа (структура)Color.

За да създадете писалка с определени характеристики, напишете командата в кода:

Име на писалка = нова писалка (Цвят.цвят, дебелина);

Пример:

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

Четка

За да рисувате създадения графичен обект, използвайте инструментите от класаЧетка. Товакласът четка е по-сложен от класаPen. КласътBrushе абстрактен клас, така че не можете да създавате четки от този клас, но можете да създавате четки от класове наследници на Brush. Има пет такива класа:

  • SolidBrush - четки за плътно боядисване на зона със зададен цвят;
  • TextureBrush - четки за рисуване на област с зададено изображение (изображение);
  • HatchBrush - четки за боядисване на зона с предварително зададен шаблон;
  • LinearGradientBrush - четки за плътно рисуване с преход от един цвят към друг, където промяната на нюансите се задава от линеен градиент;
  • PathGradientBrush - четки за плътно рисуване с преход от един цвят към друг, където промяната на нюансите е зададена по по-сложен начин.

Първите два класа четки са в пространството на имената System.Drawing, останалите са в System.Drawing.Drawing2D.

За да създадете четка с определени характеристики, напишете командата в кода:

Четка brush_name = нов brush_type (параметри на четката);

Пример:

Четка b = нова SolidBrush(Color.Maroon);

Класификация на методите по обекти, начертани с тяхна помощ

Три групи методи са най-важни за рисуване.

Първият е претовареният методDrawString, който ви позволява да показвате текстове в графичен режим.

· Втората група се състои от методитеDraw:DrawEllipse, DrawLine, DrawArcи други, които позволяват на цветна писалка (обект от класаPen) да рисува геометрични форми: линии, различни криви, правоъгълници, многоъгълници, елипси и т.н.

Третата група включва методитеFill:FillEllipse, FillPie, FillRectangleи други, които ви позволяват да начертаете фигура с цветна писалкаи го нарисувайте с четка (обект от клас, получен отЧетка).

Примери за изграждане на графични обекти

Крива на Безие

Да приемем, че Panel1 е създаден във формуляра в проекта. На този панел начертайте куп криви на Безие, идващи от един център. Центърът на лъча съвпада с точката на контакт на курсора на мишката с панела. Когато натиснете левия бутон на мишката, се появява лъчът. При движение на мишката с натиснат ляв бутон, центърът на лъча се мести след мишката и кривите се преначертават. Щом бутонът на мишката бъде отпуснат, чертежът се фиксира. Двойното щракване изчиства платното.

създаване

За да създадете куп криви от три криви на Безие, които произхождат от точката, в която курсорът на мишката докосва платното, направете следното:

1. Създайте клас от глобални променливи за обекти: писалка, платно, координати на центъра на лъча и неговите краища, индикатор за щракване на мишката.

публичен клас MyMouse

обществена статична графична графика; //платно

публична статична писалка MyPen; //писалка

публична статична точка pt, pt1, pt2, pt3;

2. Създайте манипулатор на щракване на мишката, в който записвайте характеристиките на писалката, инициализация на променливи за координатите на кривите и платното. За да проследите позицията на бутоните на мишката в бъдеще, задайте индикатора на мишката на 1 - „натиснат“. При преместване на мишката с натиснат клавиш (със стойност на индикатора, равна на 1), кривите се преначертават. При движение на мишката с ненатиснат клавиш (със стойност на индикатора 0) кривите няма да бъдат изчертани.

частен празен панел1_MouseDown(изпращащ обект, MouseEventArgs e)

MyMouse.MyPen = нова писалка(Color.Azure, 1);

MyMouse.pt = newPoint(); //център на лъча

MyMouse.pt2 = newPoint();

MyMouse.pt3 = newPoint();

MyMouse.pt1 = newPoint();

3. Създайте манипулатор за освобождаване на мишката, в който задайте индикатора на мишката на 0 - "не е натиснат".

частен празен панел1_MouseUp(изпращащ обект, MouseEventArgs e)

4. Създайте манипулатор за движение на мишката. Ако индикаторът на мишката е равен на единица, тогава е необходимо да напишете в кода: изчистване на платното, координатите на центъра на лъча и координатите на кривите на Безие. Трите допълнителни точки на кривите на Безие са статични точки, разположени на различни граници на платното. Допълнителни точки могат да бъдат създадени и с помощта на генератор на произволни числа.

частен празен панел1_MouseMove(изпращащ обект, MouseEventArgs e)

//Прочетете координатите на мишката и ги присвоете на централните координати

MyMouse.pt.X = e.X; MyMouse.pt.Y = e.Y;

//Задайте цвета на първата крива

// Задайте допълнителни точки

MyMouse.pt1.X = 0; MyMouse.pt1.Y = 0;

MyMouse.pt2.X = 0; MyMouse.pt2.Y = panel1.Height;

MyMouse.pt3.X = panel1.Width; MyMouse.pt3.Y = panel1.Height;

// Начертайте първата крива

MyMouse.graph.DrawBezier(MyMouse.MyPen, MyMouse.pt, MyMouse.pt1,

MyMouse.pt1.X = panel1.Width; MyMouse.pt1.Y = 0;

MyMouse.pt2.X = panel1.Width; MyMouse.pt2.Y = panel1.Height;

MyMouse.pt3.X = 0; MyMouse.pt3.Y = panel1.Height;

MyMouse.graph.DrawBezier(MyMouse.MyPen, MyMouse.pt, MyMouse.pt1,

MyMouse.pt1.X = panel1.Width/3; MyMouse.pt1.Y = panel1.Height / 2;

MyMouse.pt2.X = 2*panel1.Width/3; MyMouse.pt2.Y = panel1.Height/2;

MyMouse.pt3.X = MyMouse.pt.X; MyMouse.pt3.Y = MyMouse.pt.Y;

MyMouse.graph.DrawBezier(MyMouse.MyPen, MyMouse.pt, MyMouse.pt1,

5. Създайте манипулатор за двойно щракване на мишката, в който напишете командата за изчистване на платното

частен празен панел1_MouseDoubleClick(изпращащ обект, MouseEventArgs e)

Построяване на триъгълник

В този пример нека създадем кода за начертаване на триъгълник. Координатите на триъгълника се генерират на случаен принцип:

За да създадете триъгълник:

1. Координатите на върховете на триъгълника ще бъдат в структурата “Treyg”. За целта ще създадем променливи за работа със структурата и самата структура.

публичен статичен клас tr

публична статична писалка MyPen;

публична структура Treyg

публична структура B

публична структура C

2. Използвайки генератор на произволни числа, ще създадем координатите на върховете на триъгълника. В този пример размерът на панела е фиксиран: 270x240.

private void treyg(изпращащ обект)

label1.Visible = невярно; Random r = new Random();

tr.MyPen = нова писалка (Color.Blue, 1);

tr.Treyg.A.x = r.Next(80)+10; tr.Treyg.A.y = r.Next(70)+10;

tr.Treyg.B.x = r.Next(80) + 80; tr.Treyg.B.y = r.Next(70) + 160;

tr.Treyg.C.x = r.Next(80) + 180; tr.Treyg.C.y = r.Next(70) + 80;

tr.graph.DrawEllipse(tr.MyPen, tr.Treyg.A.x, tr.Treyg.A.y, 2, 2);

tr.graph.DrawEllipse(tr.MyPen, tr.Treyg.B.x, tr.Treyg.B.y, 2, 2);

tr.graph.DrawEllipse(tr.MyPen, tr.Treyg.C.x, tr.Treyg.C.y, 2, 2);

// свързвайки ги с линии

tr.graph.DrawLine(tr.MyPen, tr.Treyg.A.x, tr.Treyg.A.y, tr.Treyg.B.x,

tr.graph.DrawLine(tr.MyPen, tr.Treyg.B.x, tr.Treyg.B.y, tr.Treyg.C.x,

tr.graph.DrawLine(tr.MyPen,tr.Treyg.C.x, tr.Treyg.C.y, tr.Treyg.A.x,

3. Ще начертаем триъгълник с щракване на мишката върху панела:

private void panel1_Click(object sender, EventArgs e)

Създаване на функционална графика

В този пример ще създадем код за начертаване на функционална графика на интервала.

създаване

За да начертаете функция, имате нужда от:

1. Създайте обекти на платно и писалка:

публична графика на статичен клас

публична статична писалка MyPen;

2. Задайте характеристиките на платното и писалката. Може да има няколко писалки: за начертаване на оси и графики.

graphic.MyPen = new Pen(Color.Blue, 1);

Определете позицията на началото на координатите и границите на областта на чертане: X,Y - началото на координатите, Xmax, Ymax - границите на областта.

int X, Y, Xmax, Ymax;

Xmax = panel1.Size.Width; Ymax = panel1.Size.Height;

X = Xmax / 2; Y = Ymax / 2;

3. Изградете осите на декартовата координатна система:

graphic.graph.DrawLine(graphic.MyPen, 0, Y, Xmax, Y);

graphic.graph.DrawLine(graphic.MyPen, X, 0, X, Ymax);

4. Задайте стъпката за изчисляване на точките по оста Ox в декартовата координатна система и началната точка, в това:

double h = 0,1, Xdec = -4, Ydec = Xdec*Xdec/2-4;

Задайте мащаба и преобразувайте координатите на точката в декартовата координатна система в C# координатната система:

int d = 10, Xp = Convert.ToInt16(Xdec*d)+X, Yp =- Convert.ToInt16(Ydec*d)+Y;

5. Създайте променливи за изчисляване на следващата точка и задайте цикъл за чертане: