Компьютерная графика, мультимедиа и игры на Visual C#

       

Изображение линий уровня поверхности на основе нового синтаксиса Visual C++


Листинг 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);
   }
}
        Аналогично по этой методологии мы можем разработать другие приложения для построения и управления различными пространственными изображениями.

Содержание раздела