Изображение поверхностей
Листинг 39.1. Метод для рисования поверхности.
//Концы числового интервала области задания поверхно-сти:
private: static const int x_max = 20;
private: static const int y_max = 20;
private: static const int x_min = -10;
private: static const int y_min = -10;
private: System::Void pictureBox1_Paint(
System::Object^ sender,
System::Windows::Forms::PaintEventArgs^ e)
{
//Масштабируем объекты класса Graphics на pictureBox1.
//Коэффициенты масштабирования:
float M_1 = 31; float M_2 = 29;
e->Graphics->ScaleTransform(
Convert::ToSingle(pictureBox1->Width / M_1),
Convert::ToSingle(-pictureBox1->Height / M_2),
MatrixOrder::Append);
float M_3 = 1.9f;
float M_4 = 1.7f;
e->Graphics->TranslateTransform(
Convert::ToSingle(pictureBox1->Width / M_3),
Convert::ToSingle(pictureBox1->Height / M_4),
MatrixOrder::Append);
//Задавая M_1, M_2, M_3, M_4 другие значения,
//мы будем смещать пов-ть по отношению к осям x,y,z.
//Объявляем индексы элементов массива myArrayVC(i, j):
int i, j;
//Значение первой, второй и третьей границ индекса "i":
int N_1_myArray, N_2_myArray, N_3_myArray;
//Задаем границы индексов массива 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);
//Для считывания из файла D:\\MyDocs\\MyTest.txt
//координат изображения в массив myArrayVC[2001, 2]
//создаем объект sr класса StreamReader:
String^ path = "D:\\MyDocs\\MyTest.txt";
StreamReader^ sr =
gcnew StreamReader(path);
//Считываем из файла MyTest.txt координаты изображения
//в массив myArrayVC(2001, 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();
//Рисуем поверхность z=f(x,y) из массива.
//Объявляем координаты двух точек:
float x1, y1, x2, y2;
// Будем рисовать пером myPen толщиной 0:
Pen^ myPen = gcnew Pen(Color::Black, 0);
//Рисуем линии поверхности, параллельные плоскости xz:
i = -2;
for (int x = 0; x <= x_max; x++)
{
for (int y = 1; y <= y_max; y++)
{
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);
}
}
N_1_myArray = i + 1; //Первая граница массива.
//Рисуем линии поверхности, параллельные плоскости yz:
i = N_1_myArray - 1;
for (int y = 0; y <= y_max; y++)
{
for (int x = 1; x <= x_max; x++)
{
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);
}
}
N_2_myArray = i + 1; //Вторая граница массива.
//Рисуем оси координат:
Pen^ myPen2 = gcnew Pen(Color::Red, 0);
i = N_2_myArray - 1;
for (int k = 1; k <= 3; 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(myPen2, x1, y1, x2, y2);
N_3_myArray = i + 1; //Третья граница массива.
}
}
Интеграция Visual C# с Visual Basic, Visual C++ 2005 и другими языками состоит в том, что в одном из проектов на Visual C#, Visual Basic, Visual C++ 2005 или другом языке координаты геометрических изображений сначала записываются в файлы на жестком диске компьютера (например, в текстовый файл D:\MyDocs\MyTest.txt), а затем в другом проекте на любом языке эти координаты считываются из файлов в массивы с последующим построением геометрических изображений по данным этих массивов.
Аналогично по этой методологии мы можем разработать другие приложения для построения различных пространственных изображений.