Глава 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);

}


Наши рекомендации