- •Введение
- •Часть I. Краткие основы Visual c# Глава 1. Основные определения книги
- •1.1. Требования для установки Visual Studio 2005
- •Глава 2. Методика разработки приложений для выполнения расчетов с эффектами анимации
- •Глава 3. Методика разработки приложений на нескольких формах
- •Часть II. Методология проектирования графики и печати на принтере Глава 4. Краткие сведения о графических возможностях Visual Studio
- •Глава 5. Рисование простых линий на форме или элементах управления и печать этих линий
- •Глава 6. Рисование сложных линий и печать всей формы как снимка экрана
- •Глава 8. Рисование текста и печать текстового файла
- •Глава 7. Рисование заполненных фигур и печать всей формы с предварительным просмотром
- •Часть III. Методология вычислений на основе Visual c# с использованием эффектов анимации Глава 9. Методика создания вычислительной системы
- •Глава 10. Арифметические вычисления
- •10.3. Анимация в виде циклического изменения непрозрачности панели
- •Глава 11. Разработка стандартного калькулятора
- •11.3. Анимация в виде циклического изменения цвета формы
- •11.4. Выполнение расчетов
- •Глава 12. Вычисление процентов
- •Глава 13. Степени, корни, логарифмы и факториалы
- •Часть IV. Методология вычислений на основе интеграции Visual c# с другими платформами Глава 14. Использование в Visual c# программ из Excel
- •Глава 15. Вычисление сложных математических выражений
- •Часть V. Интеграция Visual c# с Word Глава 16. Оглавление приложения по использованию методов Word
- •Глава 17. Запуск Word, добавление нового и открытие существующего документа
- •17.3. Выполнение программы
- •Часть VI. Получение расчетных параметров из баз данных Access Глава 18. Оглавление приложения по использованию Access
- •18.1. Алгоритм оглавления и проектирование формы
- •Глава 19. Открытие Access
- •Часть VII. Создание баз данных и интеграция с другими субд Глава 20. Создание баз и наборов данных
- •Глава 21. Архитектура доступа к данным ado.Net
- •Глава 22. Разработка баз данных при помощи шаблонов
- •22.1. Создание проекта sql Server Project
- •Часть VIII. Методология создания графической системы в двухмерном пространстве Глава 23. Алгоритмы и оглавление графической системы
- •Глава 24. График линейной функции
- •Глава 25. Графики типичных функций
- •Глава 26. Рисование при помощи перемещения мыши
- •Глава 27. Рисование линий при помощи нажатия кнопки мыши
- •Глава 28. Рисование прямоугольников и эллипсов при помощи нажатия кнопки мыши
- •Глава 29. Рисование заполненных прямоугольников и эллипсов при помощи нажатия кнопки мыши
- •Глава 30. Непрерывный график-осциллограмма и его проверка при помощи диспетчера задач и файла подкачки
- •Часть IX. Методология создания графической системы в трехмерном пространстве Глава 31. Теория и алгоритмы системы
- •32.1. Основные схемы интеграции
- •Глава 33. Изображение и управление трехмерными объектами в трехмерном пространстве
- •Глава 34. Изображение и управление трехмерными объектами в трехмерном пространстве на Visual Basic для интеграции с Visual c# и другими языками
- •Глава 35. Изображение объектов в трехмерном пространстве на Visual c# по данным из проекта на Visual Basic
- •35.1. Постановка задачи и проектирование формы
- •Глава 37. Изображение и управление поверхностями в трехмерном пространстве
- •Глава 40. Расчет и изображение линий уровня на поверхности
- •Часть X. Методология создания анимационной трехмерной графики на основе новых версий Visual c# и DirectX Глава 44. Методика проектирования неподвижных и подвижных плоских фигур
- •Глава 45. Методика проектирования неподвижных и подвижных пространственных фигур
- •Часть XI. Методология разработки мультимедиа и игр на основе Microsoft Agent Глава 46. Загрузка и установка компонентов Microsoft Agent
- •46.1. Краткие сведения о Microsoft Agent
- •Глава 47. Методика управления мультипликационными персонажами
- •Глава 48. Вывод на экран выступлений и анимаций всех персонажей
- •Глава 49. Методика создания компьютерных игр и мультфильмов
- •49.4. Выполнение программы
- •Глава 50. Пример Интернет-магазина на основе Microsoft Agent
- •Глава 51. Построение графика по точкам эксперимента и интеграция с мультипликационными персонажами ms Agent
- •Часть XII. Методология анимации объектов Глава 52. Оглавление системы программ для анимации объектов
- •52.1. Алгоритм и проект системы
- •Глава 53. Варианты часов с цифровой индикацией, индикаторами прогресса и датой
- •Глава 54. Вращение линии
- •Глава 55. Управляемое вращение линии
- •Глава 56. Управляемое вращение и перемещение фигуры
- •Глава 57. Управляемое заполнение фигур
- •Глава 58. Управляемый мигающий текст
- •Глава 59. Методика изображения летающих предметов
- •Глава 60. Методика анимации градиентного заполнения текста цветом
- •Глава 61. Вращающееся градиентное заполнение фигур цветом
- •Глава 62. Изображение кругов на воде с использованием двойной буферизации
- •Глава 63. Анимация текста в консольном приложении
- •Часть XIII. Методология создания, конвертирования и мультипликации изображений на форме Глава 64. Методика задания, конвертирования и поочередной замены изображений
- •Глава 65. Методика разработки мультипликации
- •Глава 66. Разработка мультипликации при помощи списка рисунков
- •Глава 67. Методика управления цветом изображения
- •Часть XIV. Воспроизведение аудио и видео Глава 68. Оглавление приложения по интеграции Visual c# с Windows Media Player
- •Глава 69. Воспроизведение аудио файлов из приложения Visual с#
- •Глава 70. Воспроизведение видео файлов из приложения Visual c#
- •70.3. Выполнение программы
- •Глава 72. Интеграция Visual c# с браузером Internet Explorer
- •Глава 73. Установка веб-компонентов Windows для веб-программирования на основе asp.Net
- •Часть XVI. Введение в программирование мобильных устройств Глава 74. Программирование портативных и карманных компьютеров
- •Часть XVII. Приложения Visual c# для использования на практике, например, в промышленности Глава 75. Алгоритмы для расчета площади, объема и массы изделий и заготовок
- •75.1. Объектно-ориентированный анализ геометрии изделий
- •Глава 76. Консольное приложение для расчета массы изделий
- •Глава 77. Вычисление массы изделий при помощи формы
- •Часть XVIII. Приложения Visual c# для использования в учебе и науке Глава 78. Ввод в систему свойств материалов для изготовления изделий
- •Глава 79. Математическое моделирование обработки заготовки при помощи аналитических решений
- •Глава 80. Математическое моделирование обработки заготовки при помощи метода конечных элементов
- •Глава 81. Математическое моделирование и графика для типичных техпроцессов
- •Глава 82. Методология учета анизотропии материала при проектировании техпроцесса изготовления изделия
- •Глава 83. Методология проектирования техпроцессов изготовления изделий коробчатой формы
- •Часть XIX. Методология создания и внедрения систем компьютерного проектирования Глава 84. Оптимизация раскроя материалов
- •Глава 85. Система компьютерного проектирования техпроцессов
- •Глава 86. Проектирование заготовительных операций подготовки материала
- •Глава 87. Проектирование операций изготовления заготовок
- •Глава 88. Проектирование операций обработки заготовок
- •Глава 89. Проектирование финишных операций изготовления изделий
- •Заключение
- •Часть XX. Передача приложения заказчику Глава 90. Методика передачи приложения пользователю
- •90.1. Этапы разработки программы для установки приложения
- •90.2. Создание проекта для установки приложения
- •Описание содержимого компакт-диска и схема использования
- •Список литературы
- •Предметный указатель
Глава 40. Расчет и изображение линий уровня на поверхности
Листинг 40.1. Код выше и в теле метода Form1_Load.
//Вводим функцию для поверхности z = f1 = f(x, y):
public float f(float x, float y)
{
float f1;
f1 = 2 * x * x * x * x - 3 * x * x + 4 * y * y;
return f1;
}
//Вводим функцию для частной производной df/dx:
public float df_dx(float x, float y)
{
float f2;
f2 = 8 * x * x * x - 6 * x;
return f2;
}
//Вводим функцию для частной производной df/dy:
public float df_dy(float x, float y)
{
float f3;
f3 = 8 * y;
return f3;
}
//Объявляем перо для рисования линий уровня:
Pen myPen;
//Загружаем функции для рисования линий уровня:
private void Form1_Load_1(object sender, EventArgs e)
{
//Создаем экземпляр пера с цветом и толщиной:
myPen = new Pen(Color.Black, 0);
//Связываем графический элемент PictureBox1
//с объектом g класса Graphics:
Bitmap bmp = new Bitmap(pictureBox1.ClientSize.Width,
pictureBox1.ClientSize.Height);
Graphics g = Graphics.FromImage(bmp);
//Определяем преобразования для масштабирования и
//рисования линий на PictureBox в интервале
//-2 <= x <= 2, -1.5 <= y <= 1.5:
float x_min = -2f;
float x_max = 2f;
float y_min = -1.5f;
float y_max = 1.5f;
g.ScaleTransform(bmp.Width / (x_max - x_min),
bmp.Height / (y_max - y_min));
g.TranslateTransform(-x_min, -y_min,
System.Drawing.Drawing2D.MatrixOrder.Prepend);
//Вызываем функцию для рисования линий уровня:
for (int LevelCurves = -3; LevelCurves <= 25;
LevelCurves++)
PlotLevelCurve(g, Convert.ToSingle(
LevelCurves / 4),
-4f, 4f, -4f, 4f, 0.05f, 1f, 1f, 0.002f);
//Показываем результат рисования:
pictureBox1.Image = bmp;
}
Ниже этого кода записываем следующие вспомогательные методы.
Листинг 40.2. Вспомогательные методы.
//Находим точку на линии:
float initial_delta = 0.1f;
private void FindPointOnCurve(ref float x, ref float y,
float LevelCurves, float start_x, float start_y,
float tolerance)
{
float dx = 0, dy = 0, dz, delta, f_xy;
int direction = 0;
//Начальная точка:
x = start_x; y = start_y; delta = initial_delta;
//В бесконечном цикле do-while выходим через break:
int i = 0;
do
{
f_xy = f(x, y); dz = LevelCurves - f_xy;
if (Math.Abs(dz) < tolerance) break;
//Анализируем направление:
if (Math.Sign(dz) != direction)
{
//Изменяем направление. Уменьшаем delta:
delta = delta / 2;
direction = Math.Sign(dz);
}
//Рассчитываем градиент:
Gradient(x, y, ref dx, ref dy);
if ((Math.Abs(dx) + Math.Abs(dy)) < 0.001) break;
//Перемещаемся направо:
x = x + dx * delta * (float)direction;
y = y + dy * delta * (float)direction;
}
while (i < 1);
}
//Рассчитываем градиент в этой точке:
private void Gradient(float x, float y,
ref float dx, ref float dy)
{
float dist = 0;
dx = df_dx(x, y); dy = df_dy(x, y);
dist = Convert.ToSingle(Math.Sqrt(dx * dx + dy * dy));
if (Math.Abs(dist) < 0.0001)
{
dx = 0; dy = 0;
}
else
{
dx = dx / dist; dy = dy / dist;
}
}
//Рисуем линию уровня f(x, y) = LevelCurves:
private void PlotLevelCurve(Graphics g,
float LevelCurves, float x_min, float x_max, float y_min,
float y_max, float step_size,
float start_x, float start_y,
float tolerance)
{
int num_points = 0;
float x0 = 0, y0 = 0, x1, y1, x2, y2, dx = 0, dy = 0;
//Находим точку (x0, y0) на линии уровня LevelCurves:
FindPointOnCurve(ref x0, ref y0, LevelCurves,
start_x, start_y, tolerance);
//Начало:
num_points = 1;
//Следующая линия уровня LevelCurves:
x2 = x0; y2 = y0;
//В бесконечном цикле do-while выходим через break:
int i = 0;
do
{
x1 = x2; y1 = y2;
//Находим следующую точку на линии:
Gradient(x2, y2, ref dx, ref dy);
if ((Math.Abs(dx) + Math.Abs(dy)) < 0.001) break;
x2 = x2 + dy * step_size;
y2 = y2 - dx * step_size;
FindPointOnCurve(ref x2, ref y2,
LevelCurves, x2, y2, tolerance);
//Рисуем до этой точки:
g.DrawLine(myPen, x1, y1, x2, y2);
num_points = num_points + 1;
//Смотрим,находится ли точка
//вне области рисования:
if (x2 < x_min) break;
if (x2 > x_max) break;
if (y2 < y_min) break;
if (y2 > y_max) break;
//Если мы ушли более чем на 4 точки, то смотрим
//не пришли ли мы в начало:
if (num_points >= 4)
{
if (Math.Sqrt((x0 - x2) * (x0 - x2) +
(y0 - y2) * (y0 - y2)) <= step_size * 1.1)
{
g.DrawLine(myPen, x2, y2, x0, y0);
break;
}
}
}
while (i < 1);
}
Таким образом, мы закончили разработку новой методологии создания графической системы на базе Visual C# для построения на экране монитора и печати на принтере линий уровня для разнообразных трехмерных поверхностей в трехмерном пространстве.
Аналогично по этой методологии можно разработать приложения для построения различных линий уровня на различных поверхностях.
Глава 41. Расчет и изображение линий уровня поверхности на Visual Basic для интеграции с Visual C#, Visual C++ и другими языками
Листинг 41.1. Код выше и в теле процедуры Form1_Load.
'Вводим функцию для поверхности z = f = f(x, y):
Private Function f(ByVal x As Single, ByVal y As Single) _
As Single
f = 2 * x * x * x * x - 3 * x * x + 4 * y * y
End Function
'Вводим функцию для частной производной df/dx:
Private Function df_dx(ByVal x As Single, _
ByVal y As Single) As Single
df_dx = 8 * x * x * x - 6 * x
End Function
'Вводим функцию для частной производной df/dy:
Private Function df_dy(ByVal x As Single, _
ByVal y As Single) As Single
df_dy = 8 * y
End Function
'Задаем перо для рисования линий уровня:
Private myPen As Pen
'Загружаем функции для рисования линий уровня:
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As EventArgs) Handles MyBase.Load
'Задаем цвет пера:
myPen = New Pen(Color.Black, 0)
'Связываем графический элемент PictureBox1
'с объектом g класса Graphics:
Dim bmp As New Bitmap(PictureBox1.ClientSize.Width, _
PictureBox1.ClientSize.Height)
Dim g As Graphics = Graphics.FromImage(bmp)
'Определяем преобразования для масштабирования и
'рисования линий на PictureBox1 в интервале
'-1.5 <= x <= 1.5, -1.5 <= y <= 1.5:
Const x_min As Single = -1.5
Const x_max As Single = 1.5
Const y_min As Single = -1.5
Const y_max As Single = 1.5
g.ScaleTransform(bmp.Width / (x_max - x_min), _
bmp.Height / (y_max - y_min))
g.TranslateTransform(-x_min, -y_min, _
System.Drawing.Drawing2D.MatrixOrder.Prepend)
'Вызываем функцию для рисования линий уровня:
For LevelCurves As Integer = -3 To 10
PlotLevelCurve(g, CSng( _
LevelCurves / 4), -4, 4, -4, 4, 0.05, 1, 1, 0.002)
Next
'Показываем результат рисования:
PictureBox1.Image = bmp
End Sub
Ниже этого кода записываем следующие вспомогательные процедуры.
Листинг 41.2. Вспомогательные процедуры.
'Находим точку на линии:
Private Sub FindPointOnCurve(ByRef x As Single, _
ByRef y As Single, ByVal LevelCurves As Single, _
Optional ByVal start_x As Single = 0.1, _
Optional ByVal start_y As Single = 0.2, _
Optional ByVal tolerance As Single = 0.01, _
Optional ByVal initial_delta As Single = 0.1)
Dim dx As Single : Dim dy As Single
Dim dz As Single : Dim dist As Single
Dim delta As Single : Dim f_xy As Single
Dim direction As Integer
'Начальная точка:
x = start_x : y = start_y : delta = initial_delta
'Повторяем решение:
Do
f_xy = f(x, y) : dz = LevelCurves - f_xy
If Abs(dz) < tolerance Then Exit Do
'Анализируем направление:
If Sign(dz) <> direction Then
'Изменяем направление. Уменьшаем delta:
delta = delta / 2 : direction = Sign(dz)
End If
'Рассчитываем градиент:
Gradient(x, y, dx, dy)
If Abs(dx) + Abs(dy) < 0.001 Then Exit Do
'Перемещаемся направо:
x = x + dx * delta * direction
y = y + dy * delta * direction
Loop
End Sub
'Рассчитываем градиент в этой точке:
Private Sub Gradient(ByVal x As Single, _
ByVal y As Single, ByRef dx As Single, ByRef dy As Single)
Dim dist As Single
dx = df_dx(x, y) : dy = df_dy(x, y)
dist = CSng(Sqrt(dx * dx + dy * dy))
If Abs(dist) < 0.0001 Then
dx = 0 : dy = 0
Else
dx = dx / dist : dy = dy / dist
End If
End Sub
'Программируем второй массив для передачи в файл:
'Задаем границы индексов второго массива myArrayVB_2(i, j):
Dim N_x_2 As Integer = 20000
Dim N_y_2 As Integer = 1
'Объявляем массив myArrayVB_2(i, j) переменных типа Single ,
'когда i = 0,1,2,3,...,N_x; j = 0,1,2,3,...,N_y:
Dim myArrayVB_2(20000, 1) As Single 'Автомат-ки обнуляется.
'Значение первой границы массива myArrayVB_2:
Dim N_1_myArrayVB_2 As Integer
'Счетчик элементов массива:
Dim ii As Integer = -1
'Рисуем линию уровня f(x, y) = LevelCurves:
Private Sub PlotLevelCurve(ByVal g As Graphics, _
ByVal LevelCurves As Single, ByVal x_min As Single, _
ByVal x_max As Single, ByVal y_min As Single, _
ByVal y_max As Single, _
Optional ByVal step_size As Single = 0.1, _
Optional ByVal start_x As Single = 1.0, _
Optional ByVal start_y As Single = 1.0, _
Optional ByVal tolerance As Single = 0.02)
'Объявляем индексы элементов всех массивов:
Dim i, j As Integer
'Программируем 1-й массив для рисования здесь.
'Задаем границы индексов 1-го массива myArrayVB(i, j):
Dim N_x As Integer = 2000
Dim N_y As Integer = 1
'Объявляем 1-й массив myArrayVB(i, j) переменных Single,
'когда i = 0,1,2,3,...,N_x; j = 0,1,2,3,...,N_y:
Dim myArrayVB(N_x, N_y) As Single 'Автомат-ки обнуляется.
'Значение первой границы массива myArrayVB:
Dim N_1_myArrayVB As Integer
'Объявляем переменные для точек линий уровня:
Dim num_points As Integer
Dim x0 As Single : Dim y0 As Single
Dim x1 As Single : Dim y1 As Single
Dim x2 As Single : Dim y2 As Single
Dim dx As Single : Dim dy As Single
'Находим точку (x0, y0) на линии уровня LevelCurves:
FindPointOnCurve(x0, y0, LevelCurves, _
start_x, start_y, tolerance)
'Начальная точка линии:
num_points = 1
'Следующая линия уровня LevelCurves:
x2 = x0
y2 = y0
i = -1 'Задаем до цикла.
'Начало цикла Do - Loop:
Do
x1 = x2
y1 = y2
'Находим следующую точку на линии:
Gradient(x2, y2, dx, dy)
If Abs(dx) + Abs(dy) < 0.001 Then Exit Do
x2 = x2 + dy * step_size
y2 = y2 - dx * step_size
FindPointOnCurve(x2, y2, LevelCurves, x2, y2, _
tolerance)
'Можно рисовать и здесь (без массива) до этой точки:
'g.DrawLine(myPen, x1, y1, x2, y2)
'Записываем коорд-ты точек в 1-й массив для текущей
'линии уровня, которую будем рисовать здесь:
i = i + 2
myArrayVB(i, 0) = x1
myArrayVB(i, 1) = y1
myArrayVB(i + 1, 0) = x2
myArrayVB(i + 1, 1) = y2
N_1_myArrayVB = i + 1 'Значение границы массива.
'Записываем координаты точек текущей линии
'во 2-й массив, который будем экспортировать в файл:
ii = ii + 2
myArrayVB_2(ii, 0) = x1
myArrayVB_2(ii, 1) = y1
myArrayVB_2(ii + 1, 0) = x2
myArrayVB_2(ii + 1, 1) = y2
N_1_myArrayVB_2 = ii + 1 'Значение границы массива.
'Задаем следующую точку:
num_points = num_points + 1
'Смотрим,находится ли точка вне области рисования:
If x2 < x_min Or x2 > x_max Or _
y2 < y_min Or y2 > y_max _
Then Exit Do
'Если мы ушли более чем на 4 точки, то смотрим
'не пришли ли мы в начало:
If num_points >= 4 Then
If Sqrt((x0 - x2) * (x0 - x2) + (y0 - y2) _
* (y0 - y2)) <= step_size * 1.1 Then
'Можно рисовать и здесь (без массива):
'g.DrawLine(myPen, x2, y2, x0, y0)
'Записываем координаты точек в 1-й массив:
i = i + 2
myArrayVB(i, 0) = x2
myArrayVB(i, 1) = y2
myArrayVB(i + 1, 0) = x0
myArrayVB(i + 1, 1) = y0
N_1_myArrayVB = i + 1 'Граница массива.
'Записываем координаты точек во 2-й массив,
'который будем экспортировать в файл:
ii = ii + 2
myArrayVB_2(ii, 0) = x2
myArrayVB_2(ii, 1) = y2
myArrayVB_2(ii + 1, 0) = x0
myArrayVB_2(ii + 1, 1) = y0
N_1_myArrayVB_2 = ii + 1 'Граница массива.
Exit Do
End If
End If
Loop 'Переход в начало цикла Do - Loop.
'Начало N_first_line и конец N_last_line цикла
'при рисовании здесь из массива myArrayVB:
Dim N_first_line, N_last_line As Integer
N_first_line = 1
N_last_line = N_1_myArrayVB
'Передаем значения начала N_first_line
'и конца цикла N_last_line в элементы массива
'myArrayVB(0, 0) и myArrayVB(0, 1):
myArrayVB(0, 0) = N_first_line
myArrayVB(0, 1) = N_last_line
'Рисуем при помощи массива координат myArrayVB(2000, 1):
Dim k As Integer
i = -1
For k = N_first_line To N_last_line
i = i + 2
x1 = myArrayVB(i, 0)
y1 = myArrayVB(i, 1)
x2 = myArrayVB(i + 1, 0)
y2 = myArrayVB(i + 1, 1)
g.DrawLine(myPen, x1, y1, x2, y2)
Next
'Начало N_first_line_2 и конец N_last_line_2 цикла
'при рисовании из массива myArrayVB_2 в другом проекте:
Dim N_first_line_2, N_last_line_2 As Integer
N_first_line_2 = 1
N_last_line_2 = N_1_myArrayVB_2
'Передаем значения начала N_first_line_2
'и конца цикла N_last_line_2 в элементы массива
'myArrayVB_2(0, 0) и myArrayVB_2(0, 1):
myArrayVB_2(0, 0) = N_first_line_2
myArrayVB_2(0, 1) = N_last_line_2
'Записываем массив корд-т myArrayVB_2(20000, 1) в файл.
'Создаем объект sw класса StreamWriter
'для записи в файл D:\MyDocs\MyTest_LevelCurves.txt.
'Файл автоматически "опустошается":
Dim sw As StreamWriter = _
New StreamWriter("D:\MyDocs\MyTest_LevelCurves.txt")
'Каждый элемент массива myArrayVB_2(i, j) запис-м в файл
'в виде отдельной строки при помощи процедуры WriteLine:
For i = 0 To N_x_2
For j = 0 To N_y_2
sw.WriteLine(myArrayVB_2(i, j))
Next
Next
sw.Close()
End Sub
Аналогично можно записать массивы с координатами точек для нескольких геометрических изображений в несколько различных файлов на жестком диске компьютера. И далее в проекте на Visual C#, Visual C++ (или другом языке) можно считывать массивы с координатами точек и выводить эти изображения на экран монитора, а также печатать их на принтере, как будет показано в следующей главе.
Глава 42. Изображение линий уровня поверхности на основе нового синтаксиса Visual C++ 2005
Листинг 42.1. Код для рисования изображения.
//Концы числового интервала области задания поверхности:
private: static const float x_min = -1.5;
private: static const float x_max = 1.5;
private: static const float y_min = -1.5;
private: static const float y_max = 1.5;
private:
System::Void pictureBox1_Paint(System::Object^ sender,
System::Windows::Forms::PaintEventArgs^ e)
{
//Масштабируем объекты класса Graphics на pictureBox1.
//Коэффициенты масштабирования:
float M_1 = 2 * (x_max - x_min);
float M_2 = 2 * (y_max - y_min);
e->Graphics->ScaleTransform(
Convert::ToSingle(pictureBox1->Width / M_1),
Convert::ToSingle(pictureBox1->Height / M_2));
float M_3 = 2 * (-x_min); float M_4 = 2 * (-y_min);
e->Graphics->TranslateTransform(M_3, M_4,
MatrixOrder::Prepend);
//Задавая M_1, M_2, M_3, M_4 другие значения,
//мы будем смещать линии уровня на pictureBox1.
//Объявляем индексы элементов всех массивов:
int i, j, k;
//Задаем границы индексов массива myArrayVC(i, j):
int N_x = 20001; int N_y = 2;
//Объявляем массив myArrayVC[i, j] пер-х типа float,
//когда i = 0,1,2,3,...,(N_x - 1);
// j = 0,1,2,3,...,(N_y - 1):
array<float,2>^ myArrayVC =
gcnew array<float,2>(N_x, N_y);
//Для считывания из файла
//по адресу D:\\MyDocs\\MyTest_LevelCurves.txt
//координат изображения в массив myArrayVC(20001, 2)
//создаем объект sr класса StreamReader:
String^ path = "D:\\MyDocs\\MyTest_LevelCurves.txt";
StreamReader^ sr = gcnew StreamReader(path);
//Считываем из файла MyTest_LevelCurves.txt
//координаты изображения в массив myArrayVC(20001, 2)
//при помощи метода ReadLine:
for (i = 0; i <= N_x - 1; i++)
for (j = 0; j <= N_y - 1; j++)
myArrayVC[i, j] = Convert::ToSingle(sr->ReadLine());
sr->Close();
//Рисуем изображение по координатам из массива.
//Объявляем координаты двух точек:
float x1, y1, x2, y2;
//Будем рисовать пером myPen толщиной 0:
Pen^ myPen = gcnew Pen(Color::Black, 0);
//Объявляем переменные для начала N_first_line
//и конца N_last_line цикла при рисовании:
int N_first_line, N_last_line;
//Передаем переменным для начала и конца цикла
//значения первых двух элементов массива myArrayVC:
N_first_line = Convert::ToInt32(myArrayVC[0, 0]);
N_last_line = Convert::ToInt32(myArrayVC[0, 1]);
//Рисуем изображение, начиная с точки (1,0; 1,1):
i = -1;
for (k = N_first_line; k <= N_last_line; k++)
{
i = i + 2;
x1 = myArrayVC[i, 0];
y1 = myArrayVC[i, 1];
x2 = myArrayVC[i + 1, 0];
y2 = myArrayVC[i + 1, 1];
e->Graphics->DrawLine(myPen, x1, y1, x2, y2);
}
}
Аналогично по этой методологии мы можем разработать другие приложения для построения и управления различными пространственными изображениями.
Глава 43. Изображение объектов на Visual C#, Visual Basic и Visual C++ на основе интеграции по методике “компонент - клиент”
Imports System.Math 'Для математических функций.
Imports System.Drawing 'Для рисования изображений.
Imports System.Drawing.Drawing2D 'Для рисования.
6. В тело этого класса Class1 записываем, для примера, следующую произвольную функцию для расчета массива с координатами точек графика.
Листинг 43.1. Метод для расчета массива с координатами точек графика.
Public Class Class1
Public Function myFunction1() As Object
'Объявляем индексы элементов массива myArrayVB(i, j):
Dim i, j As Integer
'Задаем границы индексов массива myArrayVB(i, j):
Dim N_x As Integer = 2000
Dim N_y As Integer = 1
'Массив переменных Single в виде myArrayVB(i, j),
'когда i = 0,1,2,3,...,N_x; j = 0,1,2,3,...,N_y:
Dim myArrayVB(N_x, N_y) As Single
'Задаем произвольное значение 10 в двойном цикле:
For i = 0 To N_x
For j = 0 To N_y
myArrayVB(i, j) = 10
Next
Next
'Произвольные координаты 4-х точек ломаной линии:
myArrayVB(0, 0) = 100
myArrayVB(0, 1) = 50
myArrayVB(1, 0) = 200
myArrayVB(1, 1) = 75
myArrayVB(2, 0) = 300
myArrayVB(2, 1) = 150
myArrayVB(3, 0) = 400
myArrayVB(3, 1) = 300
Return myArrayVB
End Function
End Class
Листинг 43.2. Процедура PictureBox1_Paint для рисования.
Private Sub PictureBox1_Paint(ByVal sender As Object, _
ByVal e As System.Windows.Forms.PaintEventArgs) _
Handles PictureBox1.Paint
'Объявляем объект myObject класса Class1 компонента VB:
Dim myObject As New ComponentVB.Class1
'Объявляем индексы элементов массива myArrayVC(i, j):
Dim i, j As Integer
'Задаем границы индексов массива myArrayVC(i, j):
Dim N_x As Integer = 2000
Dim N_y As Integer = 1
'Объявляем массив myArrayVC(i, j) переменных типа float,
'когда i = 0,1,2,3,...,(N_x - 1);
' j = 0,1,2,3,...,(N_y - 1):
Dim myArrayVB_Client(N_x, N_y) As Single
'Экспортируем массив myArrayVB(i, j) компонента VB
'в массив myArrayVB_Client(i, j) клиента VB:
For i = 0 To N_x
For j = 0 To N_y
myArrayVB_Client(i, j) = myObject.myFunction1(i, j)
Next
Next
'Рисуем изображение из массива.
'Объявляем координаты двух граничных точек:
Dim x1, y1, x2, y2 As Single
'Будем рисовать пером myPen толщиной 3:
Dim myPen As New Pen(Color.Black, 3)
'Рисуем линию, заданную в массиве myArrayVB_Client(i, j):
x1 = myArrayVB_Client(0, 0)
y1 = myArrayVB_Client(0, 1)
x2 = myArrayVB_Client(1, 0)
y2 = myArrayVB_Client(1, 1)
e.Graphics.DrawLine(myPen, x1, y1, x2, y2)
x1 = x2
y1 = y2
x2 = myArrayVB_Client(2, 0)
y2 = myArrayVB_Client(2, 1)
e.Graphics.DrawLine(myPen, x1, y1, x2, y2)
x1 = x2
y1 = y2
x2 = myArrayVB_Client(3, 0)
y2 = myArrayVB_Client(3, 1)
e.Graphics.DrawLine(myPen, x1, y1, x2, y2)
End Sub
Листинг 43.3. Метод pictureBox1_Paint для рисования.
private void pictureBox1_Paint(object sender,
PaintEventArgs e)
{
//Объявляем объект myObject кл. Class1 компонента VB:
ComponentVB.Class1 myObject =
new ComponentVB.Class1();
//Объявляем индексы элементов массива myArrayVC(i, j):
int i, j;
//Задаем границы индексов массива myArrayVC(i, j):
int N_x = 2001; int N_y = 2;
//Объявляем массив myArrayVC[i, j] перем-х типа float,
//когда i = 0,1,2,3,...,(N_x - 1);
// j = 0,1,2,3,...,(N_y - 1):
float[,] myArrayVC = new float[N_x, N_y];
//Объявляем вспомогательный массив myArray класса Array
//и связываем его с функцией myFunction1, которая
//возвращает массив myArrayVB(i, j) компонента VB:
Array myArray = (Array)myObject.myFunction1();
//Экспортируем массив myArrayVB(i, j) компонента VB
//в массив myArrayVC[i, j] клиента VC:
for (i = 0; i <= N_x - 1; i++)
for (j = 0; j <= N_y - 1; j++)
myArrayVC[i, j] =
Convert.ToSingle(myArray.GetValue(i,j));
//Рисуем изображение из массива.
//Объявляем координаты двух граничных точек:
float x1, y1, x2, y2;
//Будем рисовать пером myPen толщиной 3:
Pen myPen = new Pen(Color.Black, 3);
//Рисуем линию, заданную в массиве myArrayVC[i, j]:
x1 = myArrayVC[0, 0];
y1 = myArrayVC[0, 1];
x2 = myArrayVC[1, 0];
y2 = myArrayVC[1, 1];
e.Graphics.DrawLine(myPen, x1, y1, x2, y2);
x1 = x2; y1 = y2;
x2 = myArrayVC[2, 0]; y2 = myArrayVC[2, 1];
e.Graphics.DrawLine(myPen, x1, y1, x2, y2);
x1 = x2; y1 = y2;
x2 = myArrayVC[3, 0]; y2 = myArrayVC[3, 1];
e.Graphics.DrawLine(myPen, x1, y1, x2, y2);
}
Листинг 43.4. Метод pictureBox1_Paint для рисования.
private:
System::Void pictureBox1_Paint(System::Object^ sender,
System::Windows::Forms::PaintEventArgs^ e)
{
//Объявляем объект myObject класса Class1 компонента VB:
ComponentVB::Class1^ myObject =
gcnew ComponentVB::Class1();
//Объявляем индексы элементов массива myArrayVC(i, j):
int i, j;
//Задаем границы индексов массива myArrayVC(i, j):
int N_x = 2001; int N_y = 2;
//Объявляем массив myArrayVC[i, j] переменных типа float,
//когда i = 0,1,2,3,...,(N_x - 1);
// j = 0,1,2,3,...,(N_y - 1):
array<float,2>^ myArrayVC =
gcnew array<float,2>(N_x, N_y);
//Объявляем вспомогательный массив myArray класса Array
//и связываем его с функцией myFunction1, которая
//возвращает массив myArrayVB[i, j] компонента VB:
Array^ myArray = (Array^)myObject->myFunction1();
//Экспортируем массив myArrayVB(i, j) компонента VB
//в массив myArrayVC[i, j] клиента VC:
for (i = 0 ; i <= N_x - 1; i++)
for (j = 0 ; j <= N_y - 1; j++)
myArrayVC[i, j] =
Convert::ToSingle(myArray->GetValue(i,j));
//Рисуем изображение из массива.
//Объявляем координаты двух граничных точек:
float x1, y1, x2, y2;
//Будем рисовать пером myPen толщиной 3:
Pen^ myPen = gcnew Pen(Color::Black, 3);
//Рисуем линию, заданную в массиве myArrayVC[i, j]:
x1 = myArrayVC[0, 0];
y1 = myArrayVC[0, 1];
x2 = myArrayVC[1, 0];
y2 = myArrayVC[1, 1];
e->Graphics->DrawLine(myPen, x1, y1, x2, y2);
x1 = x2; y1 = y2;
x2 = myArrayVC[2, 0]; y2 = myArrayVC[2, 1];
e->Graphics->DrawLine(myPen, x1, y1, x2, y2);
x1 = x2; y1 = y2;
x2 = myArrayVC[3, 0]; y2 = myArrayVC[3, 1];
e->Graphics->DrawLine(myPen, x1, y1, x2, y2);
}
