Изображение линий уровня поверхности на основе нового синтаксиса 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);

}

}

Аналогично по этой методологии мы можем разработать другие приложения для построения и управления различными пространственными изображениями.

Предлагаю ознакомиться с аналогичными статьями: