Допустим, нам нужно построить какое-то количество объектов по данным, содержащимся в текстовом файле. Для определенности будем строить сферы, а в файле 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
также не проходит).
Комментарии
comments powered by Disqus