Date Редакция Категория comp Теги pov-ray / графика

Допустим, нам нужно построить какое-то количество объектов по данным, содержащимся в текстовом файле. Для определенности будем строить сферы, а в файле mydata.txt

<-1,1,0>,<1,0,1>,...

будут находится координаты центров сфер -- векторы, разделенные запятыми.

Сделать это можно, используя скалярную переменную или при помощи массива.

Рассмотрим первый способ. Он достаточно прозрачен: открываем файл для чтения; создаем переменную-вектор Vector, в которую будут считываться данные; пока файл не будет исчерпан, считываем из него очередной вектор координат и строим сферу. Вот так:

#fopen MyFile "mydata.txt" read // Открываем файл

#declare Vector = <0,0,0>;      // Создаем переменную для считывания данных
#while (defined(MyFile))        // Пока не достигнут конец файла
  #read (MyFile,Vector)         // ...считываем очередной вектор
                                // ...и строим сферу
  sphere { Vector, 1 texture { pigment{ rgb <1,0,0> }}}
#end

Второй способ немного хитрее. Здесь создается массив векторов array и данные считываются в него поэлементно. Это позволяет сохранить их для дальнейшего использования и считать из файла заданный объем данных.

Пусть нас интересуют только 2 первых вектора из mydata.txt. Запишем следующий код:

#fopen MyFile "mydata.txt" read

#declare maxArray = 2;
#declare Vector = array[maxArray]; // создаем массив векторов

#declare i = 0;
#while (i<2)
  #declare Vector[i]  =  <0,0,0>;  // инициализируем вектор - элемент массива
  #read (MyFile,Vector[i])

  sphere { Vector[i], 1 texture { pigment{ rgb <1,0,0> }}}

  #declare i = i + 1;              // увеличиваем счетчик
#end

Вся хитрость, о которой я упоминал, в строке #declare Vector[i] = .... Казалось бы, массив Vector создан, зачем нужно отдельно объявлять Vector[i]? Но дело в том, что это не объявление, а инициализация. POV-Ray требует обязательной инициализации элементов массива и никаких "по умолчанию равно нулю" не принимает. Инициализацию можно выполнить при создании массива, но в данном случае это неудобно, т.к. массив может оказаться большим. Другой вариант, который мы и применили -- поэлементная инициализация: сначала мы объявляем очередной элемент массива нулевым, а затем присваиваем ему значение из файла данных (инициализация внутри #read также не проходит).

from_datafile.png



Комментарии

comments powered by Disqus