Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Волченков Проектирование WИНДОWС-приложениы на языке ВИСУАЛ БАСИЦ 2015

.pdf
Скачиваний:
7
Добавлен:
12.11.2022
Размер:
2.37 Mб
Скачать

6.Как импортируется двумерная графика (Drawing2D) для то-

го, чтобы на форме или на элементах управления (например, на объектах PictureBox) изображать многогранники, кривые линии, проходящие через заданное множество точек, и т.д.? Какие графические методы становятся доступными для этого?

7.Что представляют собой объекты двумерной графики

LinearGradientBrush (линейная градиентная кисть) и HatchBrush

(штрихованная кисть)?

Задания

В ходе выполнения данной работы студенту необходимо выполнить три задания.

4.1. Создать и отладить проект Windows приложения «Построение графиков функций в декартовой системе координат».

4.2. Создать и отладить проект Windows приложения «Построение графиков функций в полярной системе координат».

4.3. Создать и отладить проект Windows приложения «Построение изображений геометрических тел».

Проекты создать в системе проектирования Visual Studio 2005 (2010 на языке Visual Basic 2005 (2010). Для каждого из проектов

скомпилировать исполняемый файл приложения.

Пример выполнения работы

Задание 4.1. Создать и отладить проект Windows приложения «Построение графиков функций в декартовой системе координат».

Рассмотрим приложение «Построение графиков функций». На рис. 4.1 показан результат работы данного приложения при выборе одной из трёх математических функций.

Перечень формул для всех трёх функций демонстрируется во «фрейме» – элементе класса GroupBox в левой части формы. Каждой формуле соответствует элемент RichTextBox, в который загружается файл формата rtf (созданный в редакторе MS Word) с данной формулой – при старте приложения. Справа от указанных

41

элементов – радиокнопки, с помощью которых выбирается та или иная функция. При этом автоматически, «по умолчанию», в текстовые поля вносятся подходящие для выбранной функции значения параметров a1, a2 и a3.

Рис. 4.1. Форма приложения «Построение графиков функций», работающего в режиме построения синусоиды

График функции строится на объекте класса PictureBox (в графическом окне).

В данном приложении четыре команды меню: Сетка, Оси, График и Exit (завершение работы).

Продемонстрируем этапы разработки проекта приложения для построения графика только одной функции – синусоиды: y = sin(x).

Этап создания интерфейса – это установка на форме указанных элементов: двух элементов GroupBox, трех полей RichTextBox и трех обычных текстовых полей TextBox, трех радиокнопок RadioButton, графического окна PictureBox, а также элементов MenuStrip и OpenFileDialog для команд меню и для открытия файлов с формулами.

Более подробно рассмотрим этап построения программного кода – процедур загрузки формы, построения сетки и координатных

42

осей (две команды меню) и графика функции – ещё одной команды меню.

1.Загрузка формы. На этом этапе устанавливаются значения ширины w и высоты h графического окна в пикселях. Для большей наглядности предусматривается выделение более тёмным

цветом каждой пятой линии сетки – для этого вводятся переменные nw и nh.

2.Рисование сетки. Рисование линий сетки – это циклическое применение метода DrawLine: два цикла для светлых линий (верти-

кальных и горизонтальных) пером pen1 и два цикла для более редких тёмных линий (вертикальных и горизонтальных) пером pen2.

Для масштабирования окна (изменения направления оси y и пе-

ренесения начала координат в центр окна) используются методы: gr.ScaleTransform(1, -1) и gr.TranslateTransform(w / 2, -h / 2).

3.Рисование координатных осей. Чтобы оси выглядели стрел-

ками с заострёнными концами используется 2D-свойство пера: pen3.EndCap = LineCap.ArrowAnchor.

Печать чисел вдоль осей координат необходимо проводить

только после «обратного масштабирования»: gr.ScaleTransform(1, -1) и gr.TranslateTransform(-w / 2, -h / 2).

Иначе числа будут напечатами перевёрнутыми. Для печати используется метод DrawString.

4.Рисование графика функции. Используется метод

DrawCurve, аргументом которого является массив точек pp(np), где np – ширина окна в пикселях. Этот метод позволяет рисовать

кривую линию, проходящую через заданные точки. Координаты точек pp(i).X и pp(i).Y вычисляются в цикле For x = -w / 2 To w / 2.

Код модуля формы следующий:

Код 4.1

Imports

System.Drawing.Drawing2D

 

Imports

System.Math

 

 

 

 

 

Public Class Form1

 

Dim

w, h, nw, nh, x, y As Integer

 

Dim

i, np As Short

 

Dim

gr As Graphics

 

Dim

pp() As Point

 

Dim

pen1 As New Pen(Color.FromArgb(255, _

 

 

 

 

 

43

 

200, 200, 200))

Dim pen2 As New Pen(Color.FromArgb(255, _ 150, 150, 150))

Dim pen3 As New Pen(Color.FromArgb(255, _ 220, 180, 180), 5)

Dim penG As New Pen(Color.FromArgb(255, _ 50, 50, 200), 2)

Dim a1, a2, a3 As Double

Dim brs As New SolidBrush(Color.Black)

Private Sub Form1_Load(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Me.Load

w = 400 : h = 300

PictureBox1.Width =w : PictureBox1.Height = h nw = w / 10 : nh = h / 10

End Sub

Private Sub Сетка_Click(ByVal sender _ As System.Object, _

ByVal e As System.EventArgs) _ Handles СеткаToolStripMenuItem.Click

gr = PictureBox1.CreateGraphics gr.Clear(PictureBox1.BackColor) gr.ScaleTransform(1, -1) gr.TranslateTransform(w / 2, -h / 2) For i = -nw To nw

gr.DrawLine(pen1, i * 10, -nh * 10, _ i * 10, nh * 10)

Next

For i = -nh To nh

gr.DrawLine(pen1, -nw * 10, i * 10, _ nw * 10, i * 10)

Next

For i = -nw / 5 To nw / 5 gr.DrawLine(pen2, i * 50, -nh * 50, _

i * 50, nh * 50)

Next

For i = -nh / 5 To nh / 5 gr.DrawLine(pen2, -nw * 50, i * 50, _

nw * 50, i * 50)

Next End Sub

Private Sub Оси_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _

Handles ОсиToolStripMenuItem.Click gr.ScaleTransform(1, -1)

44

gr.TranslateTransform(-w / 2, -h / 2) pen3.EndCap = LineCap.ArrowAnchor gr.DrawLine(pen3, 5, h \ 2, w - 5, h \ 2) gr.DrawLine(pen3, w \ 2, h - 5, w \ 2, 5) For i = 0 To w Step 50

gr.DrawString(i - w / 2, Font, brs, i, h / 2)

Next

For i = 0 To h Step 50

gr.DrawString(h / 2 - i, Font, brs, w / 2, i)

Next End Sub

Private Sub График_Click(ByVal _ sender As System.Object, _ ByVal e As System.EventArgs) _

Handles ГрафикToolStripMenuItem.Click gr = PictureBox1.CreateGraphics gr.ScaleTransform(1, -1) gr.TranslateTransform(w / 2, -h / 2)

a1 = Val(TextBox1.Text)

a2 = Val(TextBox2.Text)

a3 = Val(TextBox3.Text) np = w

ReDim pp(np) i = 0

For x = -w / 2 To w / 2

y = a1 * Sin(a2 * x + a3) pp(i).X = x : pp(i).Y = y i = i + 1

Next

gr.DrawCurve(penG, pp, 0) End Sub

Варианты задания 4.1. В обоих вариантах создать проект приложения для рисования синусоиды, описанный в задании 4.1, а также расширить этот проект – добавить возможность выбора функции. В соответствии с вариантом реализовать выбор одной новой функции и построение графика этой функции (рис. 4.2 и 4.3).

Вариант 1. Парабола – график функции y a1x2 a2 x a3 .

45

Рис. 4.2. Окно проекта с двумя графиками параболы

(a1 = 0,01, a2 = ±1, a3 = –50)

Вариант 2. Гипербола – график функции y

a1

a3 .

x a

2

 

Рис. 4.3. Окно проекта с двумя графиками гиперболы

(a1 = 2000, a2 = ±50, a3 = 30)

Указания.

1. Для выбора функции использовать радиокнопки. Например:

Private Sub RadioButton1_Click1(ByVal _

sender As Object, _

ByVal e As System.EventArgs) _

46

Handles RadioButton1.Click TextBox1.Text = "120" TextBox2.Text = "0.025" TextBox3.Text = "1.57"

nf = 1 End Sub

В процедуре рисования графика функции График_Click следует использовать оператор Select Case для выбора того графика, который имеет номер nf.

2. Для загрузки формулы в поле RichТextBox использовать процедуру RichТextBox_Click – щелчок этого поля. Например:

Private Sub RichTextBox1_Click(ByVal _

sender As Object, _

ByVal e As System.EventArgs) _

Handles RichTextBox1.Click

OpenFileDialog1.Filter = "RTF-файлы|*.RTF"

OpenFileDialog1.ShowDialog()

RichTextBox1.LoadFile(OpenFileDialog1.FileName)

End Sub

3. Для рисования гиперболы следует использовать не один массив, а два массива точек, учитывая, что функция имеет разрыв при x = a2:

np = w / 2 + a2

ReDim

pp(np

- 1)

i = 0

 

 

 

For x

= -w / 2 To a2 - 1

y

= a1

/ (x - a2) + a3

pp(i).X

= x : pp(i).Y = y

i

= i +

1

Next

 

 

 

gr.DrawCurve(penG, pp, 0)

np = w / 2

- a2

ReDim

pp(np

- 1)

i = 0

 

 

 

For x

= a2

+ 1 To w / 2

y

= a1

/ (x - a2) + a3

pp(i).X

= x : pp(i).Y = y

i

= i +

1

Next

gr.DrawCurve(penG, pp, 0)

Задание 4.2. Создать и отладить проект Windows приложения «Построение графиков функций в полярной системе координат».

47

Рассмотрим особенности проектирования приложения «Рисование графиков функций, определяемых в полярных координатах» на примере рисования спирали – графика функции r af b , где f > 0 и f < 2πk. Экранная форма приложения – на рис. 4.4.

Рис. 4.4. Форма приложения для рисования функций в полярных координатах в случае выбора спирали

Фрагмент программного кода для модуля формы следующий:

Код 4.2

Private Sub Form1_Load(ByVal sender As Object, _ ByVal e As System.EventArgs) _

Handles Me.Load

PictureBox1.Width = 400

PictureBox1.Height = 400

w = PictureBox1.Width / 2

h = PictureBox1.Height / 2

End Sub

48

Private Sub Button1_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) _

Handles Button1.Click

gr = PictureBox1.CreateGraphics gr.ScaleTransform(1, -1) gr.TranslateTransform(w, -h) gr.Clear(PictureBox1.BackColor) m = w : d = 10

For i = -m To m Step d gr.DrawLine(pen1, m, i, -m, i) gr.DrawLine(pen1, i, m, i, -m)

Next i

gr.DrawLine(Pens.Red, -m, 0, m, 0) gr.DrawLine(Pens.Red, 0, -m, 0, m) a = 3 : b = 50

s = 0.05

For f = 0 To 10 * PI Step s r1 = a * f + b

r2 = a * (f + s) + b p1.X = r1 * Cos(f) p1.Y = r1 * Sin(f) p2.X = r2 * Cos(f + s) p2.Y = r2 * Sin(f + s)

gr.DrawLine(pen2, p1, p2) Next f

gr.ScaleTransform(1, -1) gr.TranslateTransform(-w, -h) gr.DrawString(" a = " & a, Font, br, 0, 10) gr.DrawString(" b = " & b, Font, br, 0, 30) gr.DrawString(" fmin = 0", Font, br, 0, 50) gr.DrawString(" fmax = " & "10 * Pi", _

Font, br, 0, 70)

End Sub

Комментарий. Для рисования графиков используется метод ку- сочно-линейной аппроксимации – на каждом шаге цикла построения графика две соседние точки графика соединяются отрезком:

r1 = … (значение функции в точке f) r2 = … (значение функции в точке f + s) p1.X = r1 * Cos(f)

p1.Y = r1 * Sin(f) p2.X = r2 * Cos(f + s) p2.Y = r2 * Sin(f + s)

gr.DrawLine(pen, p1, p2)

49

Объявления переменных в начале модуля здесь не приводятся (в том числе «графических перьев» pen1, pen2 и «кисти» br). Отметим лишь, что первый аргумент в графическом методе DrawLine – это «графическое перо», а остальные аргументы должны иметь тип Point (если их два) или тип Integer (если их четыре). Переменные s, f, fp1 и fp2 должны иметь тип Double.

Варианты задания 4.2.

Вариант 1. Создать проект приложения «Рисование графика функции в полярной системе координат» – на примере рисования спирали (пример 4.2) r af b , где f > 0 и f < 2πk.

Значения параметров a, b, fmin и fmax должны отличаться от тех

значений, которые рассматривались в начале задания 4.2 (см. рис.

4.4).

Вариант 2. Создать проект приложения «Рисование графика функции в полярной системе координат» – на примере рисования

функции r

3a cos f sin f

, где f > arctg( 1) и f <

 

arctg( 1)

cos3 f sin3 f

2

 

 

 

(«лепесток Декарта»).

Экранная форма приложения – на рис. 4.5.

Указание. Процедуру щелчка кнопки Нарисовать для построения «Декартова листа» следует скопировать с процедуры для рисования спирали, заменив фрагмент циклического построения кусоч- но-линейной аппроксимации для спирали следующим фрагментом:

a = 100 : s = 0.05

fp1 = Atan(-1) + 10 / a

' Правее предельного значения на s/a fp2 = PI / 2 - Atan(-1) - 10 / a

' Левее предельного значения на s/a

For f = fp1 To fp2 Step s

r1 = 3 * a * Sin(f) * Cos(f) / _ (Sin(f) ^ 3 + Cos(f) ^ 3)

r2 = 3 * a * Sin(f + s) * Cos(f + s) / _ (Sin(f + s) ^ 3 + Cos(f + s) ^ 3)

p1.X = r1 * Cos(f) p1.Y = r1 * Sin(f) p2.X = r2 * Cos(f + s) p2.Y = r2 * Sin(f + s)

gr.DrawLine(pen3, p1, p2)

50

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]