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

       

Изображение поверхностей


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

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