Цель урока
В данном уроке разрабатывается приложение, которое позволяет по введенному уравнению, начальным и конечным значениям аргументов, а также по шагам их изменения построить поверхность. Кроме того, используя полосы прокрутки можно изменить ориентацию пространственного местоположения поверхности. В процессе создания данного приложения вы узнаете, как:
Табулируются функции, зависящие от двух аргументов
Осуществляется программная проверка правильности ввода формулы в ячейку рабочего листа
Производится преобразование формулы с аргументами х и у в формулу рабочего листа
Выполняется программное построение поверхности
Записывается диаграмма в графический файл
Считывается графический файл в элемент управления image
Управлять углом зрения на поверхность
Управлять углом поворота поверхности вокруг оси z
ПОСТРОЕНИЕ ПОВЕРХНОСТИ
УРОК 8. ТЕМА: ПОСТРОЕНИЕ ПОВЕРХНОСТИ
ЦЕЛЬ УРОКА
ПРАКТИКА
САМОСТОЯТЕЛЬНОЕ ЗАДАНИЕ
Урок 8.
Тема: Построение поверхности
Практика
В данном приложении строится поверхность по введенным в диалоговое окно построение поверхности (рис. У8.1) начальным, конечным значениям аргументов и их шагах изменения. Уравнение поверхности также вводится в программу из диалогового окна. Уравнение должно быть составлено в соответствии с правилами, по которым строятся функции рабочего листа, но в качестве аргументов в нем следует использовать х и у вместо ссылок на ячейки. Программа сама переведет эти аргументы в ссылки на ячейки. После табуляции введенной функции программой и построения поверхности на рабочем листе (рис. У8.2), эта поверхность также отображается в объекте управления image, расположенном в диалоговом окне построение поверхности (рис. У8.3). Управляя полосами прокрутки можно изменить ориентацию поверхности на рабочем листе.
![](image/praktika_57.gif)
Рис. У8.1. Диалоговое окно Построение поверхности
![](image/praktika_58.gif)
Рис. У8.2. Результат построения поверхности на рабочем листе
![](image/praktika_59.gif)
Рис. У8.3. Диалоговое окно Построение поверхности с рисунком построенной поверхности
Обсудим, как приведенная ниже программа решает описанную задачу и что происходит в ней.
UserForm_Initialize |
Активизирует диалоговое окно. Назначает клавише <Esc> функцию кнопки Отмена, а клавише <Enter> — Построение. Устанавливает максимальные и минимальные допустимые значения для полос прокрутки, а также их первоначальные значения. Устанавливает, чтобы отображаемая картинка поверхности в диалоговом окне помещалась целиком и пропорционально в пределах элемента управления Image, а также чтобы левый верхний угол рисунка совпадал с левым верхним углом элемента управления Image. | ||||
Нажатие кнопки Построение запускает на выполнение процедуру CornmandButton1_Click
|
Проверяет, являются ли вводимые данные числами. В случае ошибки отображается соответствующее сообщение. Проверяет согласованность вводимых данных. В случае ошибки отображается соответствующее сообщение (рис. У8.4). Преобразует формулу, введенную в поле Уравнение поверхности, в формулу рабочего листа. Проверяет корректность введенной формулы. В случае ошибки отображается соответствующее сообщение (рис. У8.5). Используя метод DataSeriea, начиная с ячейки А2 строит вниз по столбцу арифметическую прогрессию, являющуюся результатом табуляции аргумента х уравнения поверхности с указанными шагами. Используя метод Dataseries, начиная с ячейки в 1 строит вправо по строке арифметическую прогрессию, являющуюся результатом табуляции аргумента у уравнения поверхности с указанными шагами. Заносит в ячейку В2 уравнение поверхности, введенное пользователем в диалоговом окне. Для корректности последующего табулирования значений функций важно в уравнении указать абсолютные ссылки на столбец А и строку в. Это обеспечивается вводом в уравнении поверхности вместо аргумента х ссылки $А2, а вместо аргумента у — ссылки в$1. Для табуляции функции протаскивается маркер заполнения ячейки В2, используя метод AutoFill и формулу поверхности, позволяющих распространить табуляцию на весь диапазон, где табулируется функция. Строит поверхности при помощи методаChartWizard. Изменяет ориентацию надписи оси z. и Сохраняет построенную поверхность в файле График-gif. 12. Отображает рисунок из файла График.gif в элементе управления image1. | ||||
![](image/praktika_60.gif)
Рис. У8.4. Пример сообщения о несогласованности данных
![](image/praktika_61.gif)
Рис. У8.5. Сообщение о некорректном вводе формулы
Нажатие кнопки отмена запускает на выполнение процедуру CommandButton2 Click |
Закрывает диалоговое окно. |
||
ScrollBarl Change |
Перемещение ползунка горизонтальной полоски прокрутки вызывает вращение вокруг оси Z диаграммы за счет изменения величины свойства Rotation. |
||
ScrollBar2 Change |
Перемещение ползунка вертикальной полоски прокрутки вызывает изменение угла, под которым смотрят на диаграмму, за счет изменения величины свойства Elevation. |
||
ВращениеГрафика |
Программирует вращение поверхности за счет изменения свойств Rotation и Elevation. |
||
' Описание переменных уровня модуля
'
Dim УголЗрения as Integer
Dim ВокругОси2 as Integer
Dim УголЗренияСоСчетчика as Integer
'
' УголЗренияСоСчетчика - величина, снимаемая с полосы прокрутки
' и определяющая угол зрения под которым смотрят на поверхность
' УголЗрения - угол зрения, под которым смотрят на поверхность,
' он равен УголЗренияСоСчетчика - 90 и лежит в
'диапазоне от -90 до 90
' ВокругОсиЕ - угол поворота вокруг оси z, лежит в
' диапазоне от 0 до 360
'
Private Sub CommandButtonl_Click()
'
' Процедура табуляции функции
' и построения поверхности
'
Dim х_нз As Double
Dim х_пз As Double
Dim х_шаг As Double
Dim у_нз As Double
Dim у_пз As Double
Dim у_шаг As Double
Dim УрПоверхности As String
'
' Переменная х:
' х_нз - начальное значение
' х_пз - предельное значение
' х_шаг - шаг изменения
' Переменная у:
' у_нз - начальное значение
' у_пз - предельное значение
' у_шаг - шаг изменения
' УрПоверхности - уравнение поверхности
'
Dim nx As Integer
Dim ny As Integer
'
' nx - число протабулированных значений аргумента х
' ny - число протабулированных значений аргумента у
'
Dim n As Integer
Dim i As Integer
'
' n ,i - вспомогательные целые переменные
Dim ПоляВвода(1 То 6) As Object
'
' Массив полей ввода
'
Set ПоляВвода(1) = TextBoxl
Set ПоляВвода(2) = TextBox2
Set ПоляВвода(3) = TextBox3
Set ПоляВвода(4) = TextBox4
Set ПоляВвода(5) = TextBox5
Set ПоляВвода(6) = TextBox6
'
' Проверка корректности ввода данных
'
For i = 1 To 6
If IsNumeric(ПоляВвода(i).Text) = False Then Select Case i
Case 1
MsgBox "Ошибка в начальном значении х", vblnformation, "Поверхность"
TextBox1.SetFocus
Exit Sub
Case 2
MsgBox "Ошибка в начальном значении у", vblnformation, "Поверхность"
TextBox2.SetFocus
Exit Sub
Case 3
MsgBox "Ошибка в шаге х", vblnformation, "Поверхность"
TextBox3.SetFocus
Exit Sub
Case 4
MsgBox "Ошибка в шаге у", vblnformation, "Поверхность"
TextBox4.SetFocus
Exit Sub
Case 5
MsgBox "Ошибка в конечном значении х", vblnformation, "Поверхность"
TextBox5.SetFocus
Exit Sub
Case 6
MsgBox "Ошибка в конечном значении у", vblnformation, "Поверхность"
TextBox6.SetFocus
Exit Sub
End Select
End If
Next i
'
' Считывание с диалогового окна
' значений переменных
'
х_нз = CDbl(TextBoxl.Text)
у_нз = CDbl(TextBox2.Text)
х__шаг = CDbl (TextBox3.Text)
у_шаг = CDbl(TextBox4.Text)
х_пз = CDbl(TextBox5.Text)
у_пз = CDbl(TextBox6.Text)
УрПоверхности = Trim(TextBoxV.Text)
'
' Проверка согласованности введенных данных
'
If х_нз >= х_пз Then
MsgBox "Начальное значение х слишком большое", vblnformation, "Поверхность"
TextBoxl.SetFocus
Exit Sub
End If
If х_нз + х_шаг >= х_пз Then
MsgBox "Шаг х великоват", vblnformation, "Поверхность"
TextBox3.SetFocus
Exit Sub
End If
If у_нз >= у_пз Then
MsgBox "Начальное значение у слишком большое", vblnformation, "Поверхность"
TextBox2.SetFocus
Exit Sub
End If
If у_нз + у_шаг >= у_пз Then
MsgBox "Шаг у великоват", vblnformation, "Поверхность"
TextBox4.SetFocus
Exit Sub
End If
'
'
' Переход на отладчик ошибок в случае их возникновения On Error GoTo Сообщение
' Замена в введенной формуле аргумента х на ссылку $А2,
' а аргумента у на ссылку В$1
'
i=1
Do
'
' Замена в введенной формуле аргумента х на ссылку $А2
'
If Mid(УрПоверхности, i, 1) = "х" Or Mid(УрПоверхности, i, 1) = "X" Then
n = Len(УрПоверхности)
If (1 < i) And (i < n) Then
УрПоверхности = Left(УрПоверхности, i - 1) & "$A2" & Right(УрПоверхности, n - i)
End If
If i = 1 Then УрПоверхности = "$A2" & Right(УрПоверхности, n - 1)
If i = n Then УрПоверхности = Left(УрПоверхности, n - 1) & "$A2"
End If
' Замена в введенной формуле аргумента у на ссылку В$1
If Mid(УрПоверхности, i, 1) = "y" Or Mid(УрПоверхности, i, 1) = "Y" Then n = Len(УрПоверхности)
If (1 < i) And (i < n) Then
УрПоверхности = Left(УрПоверхности, i - 1) & "B$l" & Right(УрПоверхности, n - i)
End If
If i = 1 Then УрПоверхности = "B$l" & Right(УрПоверхности, n - 1)
If i = n Then УрПоверхности = Left(УрПоверхности, n - 1) & "B$l"
End If
i = i + 1
Loop While i <= Len(УрПоверхности)
'
' Очистка на активном листе ранее введенных данных
'
ActiveSheet.Cells.Select Selection.Clear
' Заполнение диапазонов значениями аргументов
'
With ActiveSheet
'
' Ввод в ячейку А2 начального значения
'
.Range("A2").Value = х_нз
'
' Создание арифметической прогрессии по столбцу
' с указанными шагом и начальным значением
'
.Range("A2").DataSeries Rowcol:=xlColuims,
Type:=xlLinear, Step:=x__iuar, Stop:=x_ns, Trend:=False
'
' Ввод в ячейку В1 начального значения
'
.Range("Bl").Value = у_нз
'
' Создание арифметической прогрессии вдоль строки
' с указанными шагом и начальным значением
'
.Range("Bl").DataSeries Rowcol:=xlRows,
Type:=xlLinear, Step:=y_iuar, Stop:=y_ns, Trend:=Faise
End With
' Заполнение диапазона значениями функции
'
With ActiveSheet
'
' Определение числа строк в диапазоне заполнения
'
nx = .Range("A1").CurrentRegion.Rows.Count
'
' Определение числа столбцов в диапазоне заполнения
ny = .Range("Al").CurrentRegion.Columns.Count
'
' Ввод уравнения поверхности в ячейку В2
'
.Range("В2").Formula = УрПоверхности
If IsError(Evaluate(УрПоверхности)) = True Then
MsgBox "Ошибка в формуле", vbExclamation, "Поверхность"
Exit Sub
End If
'
' Заполнение диапазона Range(Cells(2, 2), Cells(2, ny))
' начиная с ячейки В2, что эквивалентно протаскиванию маркера
' заполнения ячейки В2 на диапазон
Range(Cells(2, 2), Cells(2, ny))
'
.Range("B2").AutoFill
Destination:=Range(Cells(2, 2), Cells(2, ny)),
Type:=xlFillDefault
' Заполнение диапазона
Range(Cells(2, 2), Cells(nx, ny)),
' начиная с диапазона
Range(Cells(2, 2), Cells(2, ny)),
' что эквивалентно протаскиванию маркера
' заполнения диапазона
Range(Cells(2, 2), Cells(2, ny))
' на диапазон
Range(Cells(2, 2), Cells(nx, ny))
'
.Range(Cella(2, 2), Cells(2, ny)).AutoFill
Destination:=Range(Cells(2, 2),
Cells(nx, ny)),
Type:=xlFillDefault
End With
'
' Удаление с рабочего листа всех ранее построенных диаграмм
'
ActiveSheet.ChartObjects.Delete
'
' Выбор диапазона, по которому строится поверхность
ActiveSheet.Range(Cells(2, 2), Cells(nx, ny)).Select
'
' Задание и выбор области на рабочем листе, где
' будет построена поверхность
'
ActiveSheet.ChartObjects.Add(29.25, 19.5, 270.75, 187'.5).Select Application.CutCopyMode = False
' Построение поверхности
ActiveChart.ChartWizard
Source:=Range(Cells (1, 1), Cells(nx, ny) ),
Gallery:=x13DSurface, Format:=1,
PlotBy:=xlColumns,
CategoryLabels:=1,
SeriesLabels:=l,
HasLegend:=False,
Title:="Поверхность",
CategoryTitle:="x",
ValueTitle:="z",
ExtraTitle:="y" ActiveSheet.ChartObjects(1).Activate
ActiveChart.Axes(xlValue)
.AxisTitle.Select With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.Orientation = xlVertical
End With
'
ВращениеГрафика 20, 15
'
' Запись диаграммы в файл и
' загрузка картинки в Imagel
ActiveChart.Export FilterNаmе:="График.gif",
FilterName:="GIF"
UserForml.Image1.Picture = LoadPicture("График.gif") ActiveSheet.Range("Al").Select
'
Exit Sub Сообщение:
MsgBox "Ошибка: " & Err.Description, vbExclamation, "Поверхность"
TextBox7.SetFocus
Exit Sub End Sub
Private Sub CoramandButton2_Click()
'
' Процедура закрытия диалогового окна
UserForml. Hide
End Sub
Private Sub Label7_Click()
End Sub
'
Private Sub ScrollBarl_Change()
' Процедура вращения вокруг оси z
'
'
' Считывание данных с полос прокрутки
'
ВокругОсиZ = ScrollBarl.Value УголЗренияСоСчетчика = ScrollBar2.Value
УголЗрения = УголЗренияСоСчетчика - 90
' Вращение поверхности
'
ВращениеГрафика ВокругОсиг, УголЗрения
End Sub
'
Private Sub ScrollBar2_Change()
' Процедура изменения угла, под которым
' смотрят на диаграмму
' Считывание данных с полос прокрутки
'
ВокругОсиZ = CInt(ScrollBarl.Value)
УголЗренияСоСчетчика = CInt(ScrollBar2.Value)
'
УголЗрения = УголЗренияСоСчетчика - 90
'
' Вращение поверхности ВращениеГрафика ВокругОсиг, УголЗрения
End Sub
'
Sub ВращениеГрафика( ByVal ВокругОсиг, ByVal УголЗрения As Integer)
'
' Процедура вращения поверхности
'
If ActiveSheet.ChartObjects.Count >= 1 Then
ActiveSheet.ChartObjects(I).Activate
With ActiveChart
'
' Угол, под которым смотрят на диаграмму,
' допустимые значения от -90 до 90,
' по умолчанию 15
'
.Elevation = УголЗрения
'
' Вращение вокруг оси z, допустимые значения от 0 до 360,
' по умолчанию 20
'
.Rotation = ВокругОсиг End With
End If
'
End Sub
'
Private Sub UserForm_Initialize()
'
' Процедура инициализации диалогового окна
'
CommandButtonl.Default = True
CoiranandButton2.Cancel = True
ScrollBarl.ControlTipText = "Поворот вокруг оси Z"
ScrollBar2.ControlTipText = "Изменение угла зрения"
' Рисунок масштабируется с учетом относительных размеров так,
' чтобы он помещался в объекте Imagel
'
With Imagel
.PictureAlignment = fmPictureAlignmentTopLeft
.PictureSizeMode = fmPictureSizeModeStretch
End With
'
'
' Установка максимальных и минимальных допустимых значений
' для полос прокрутки, а
' также их первоначальных значений
'
With ScrollBar2
.Min = 0
.Max = 180
.Value = 105
End With
With ScrollBarl
.Min = 0
.Max = 360
.Value =20
End With
UserForml.Show
'
End Sub
Самостоятельное задание
Разработать приложение с диалоговым окном объемный график (рис. У8.6), которое должно решать следующие задачи:
В поле диапазон данных обеспечить ввод диапазона, по которым будет строится объемный график. Диапазон должен состоять не менее, чем из двух строк.
![](image/samostojatelnoe-zadanie_15.gif)
Рис. У8.6. Диалоговое окно Объемный график
![](image/samostojatelnoe-zadanie_16.gif)
Рис. У8.7. Диапазон с данными и результат построения объемного графика на рабочем листе
Программа должна определить число строк диапазона, а также минимальное (1) и максимальное (число строк диапазона) значение счетчика.
При помощи счетчика установить, какая из строк диапазона будет играть роль абсцисс.
При нажатии кнопки ок должен строиться объемный график с выбранной осью абсцисс (рис. У8.7) на рабочем листе и, кроме того, отображаться в объекте image диалогового окна.
С помощью полос прокрутки обеспечить управление ориентацией графика в пространстве.