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

Волченков Проектирование Wиндоwс-Приложений на языке Висуал Басиц 2010

.pdf
Скачиваний:
73
Добавлен:
16.08.2013
Размер:
2.11 Mб
Скачать

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

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

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

Задания

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

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

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

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

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

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

Задание 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

43

 

Dim

i, np As Short

 

 

 

Dim

gr As Graphics

 

 

 

Dim

pp() As Point

 

 

 

Dim

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

 

Dim

200, 200,

200))

 

 

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

 

Dim

150, 150,

150))

 

 

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

 

Dim

220, 180,

180), 5)

 

 

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

 

Dim

50, 50, 200), 2)

 

 

a1, a2, a3 As Double

 

 

 

Dim

brs As New SolidBrush(Color.Black)

 

 

 

 

 

Private

Sub Form1_Load(ByVal sender As Object, _

 

w =

ByVal e As System.EventArgs) Handles Me.Load

 

 

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, _

 

Next

i * 10, nh * 10)

 

 

 

i = -nh To nh

 

 

 

For

 

 

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

44

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

Handles ОсиToolStripMenuItem.Click gr.ScaleTransform(1, -1) 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 = x a1a2 +a3 .

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

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

Указания.

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

Private Sub RadioButton1_Click1(ByVal _

sender As Object, _

46

ByVal e As System.EventArgs) _ 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)

47

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

Рассмотрим особенности проектирования приложения «Рисование графиков функций, определяемых в полярных координатах» на примере рисования спирали – графика функции 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

48

h = PictureBox1.Height / 2

End Sub

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)

49

p2.Y = r2 * Sin(f + s) gr.DrawLine(pen, p1, p2)

Объявления переменных в начале модуля здесь не приводятся (в том числе «графических перьев» 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)

50