Поскольку регулярные структуры представляют собой повторяющиеся объекты, появление которых подчиняется определенной математической закономерности, то в информатике и языках программирования для их реализации используются циклические структуры. Циклическими называются структуры, в которых предусмотрена возможность многократного повторения выполнения участка алгоритма. Этот участок называется телом цикла. Циклические структуры, в которых число повторений цикла заранее известно или может быть определено до начала цикла, называются регулярными циклическими структурами[1].
В блоке организации цикла используется специальная переменная, которая предназначена для определения условия остановки цикла – i. Эта переменная называется параметром цикла. Операторы, следующие за заголовком цикла, составляют тело цикла (рис. 1).
Циклическая структура, в которой число повторений цикла заранее неизвестно, а определяется только в процессе выполнения алгоритма, называется итеративной циклической структурой. В зависимости от места расположения условия продолжения цикла (или выхода из цикла) итеративные циклические алгоритмы подразделяются на два вида: с предусловием, с постусловием (рис. 1).
Рис. 1
В программе OpenSCAD, как и в других CADах, используются только циклы типа «Для» (с параметром). В зависимости от особенностей решаемой задачи выделяется несколько видов синтаксиса оператора FOR [2]
Если изменение параметра выполняется в пределах диапазона
for (i = [start : end]) {
действие 1;
действие 2;
… }
Параметры:
i – счетчик цикла (изменяемый параметр цикла). Обычно изменение тел выполняется относительно осей X, Y, Z, которые и выступают в роли изменяемых параметров. Параметры могут изменяться по отдельности или вместе (в этом случае они указываются через запятую).
start - начальное значение параметра (начало диапазона).
end - конечное значение параметра (конец диапазона).
Замечание:
Изменение счетчика в рамках указанного диапазона, выполняется с единичным шагом.
Пример (рис. 2):
$fn=200;
for (i=[1:9],j=[1:9]){
translate([i,j,0])
cube([0.5,1.5,j]); }
Рис. 2 Рис. 3
В данном случае в цикле используется две переменных i и j, изменяющееся в диапазоне [1:9] с шагом 1.
Изменение параметра выполняется в пределах диапазона с шагом отличным от 1 [19]:
for (i = [start : step : end]) {
действие 1;
действие 2;
… }
В данном случае добавился ещё один параметр step обозначающий шаг, с которым происходит изменение параметра цикла.
Пример 1 (рис. 3):
$fn=5;
for (i=[-10:2:10]){
translate ([i, 0, 0.1*i*i])
sphere (d=2, $fn=100);}
for (i=[-10:0.01:10]){
translate ([i, 0, 0.1*i*i])
sphere (d=0.5);}
В данном случае используется 2 цикла с разным шагом. Первый цикл - с большим шагом, размещает большие сферы по параболической траектории. Второй – с уменьшенным шагам так же размещает сферы только меньшего радиуса по той же траектории
Пример 2 (рис.4):
$fn=10;
for (i=[0:1:1080]){
rotate ([0,0,i])
translate ([i*0.01, i*0.01, -i*0.01+10])
sphere (d=2);}
Рис. 4 Рис. 5
Изменение параметра происходит путем приобретения им конкретных значений, заранее определенных в операторе [2]:
for (i = […, …, …]) {
действие 1;
действие 2;
… }
Пример (рис. 39)
$fn=10;
for (i = [1:2:10], j = [3, 6, 9]){
translate ([i, j, 0])
cylinder (d=1, h=3);}
for (i = [2: 2: 8], j = [1.5, 4.5, 7.5, 10.5]){
translate ([i, j, 0])
cylinder (d=1, h=3);}
Помимо создания отдельных экземпляров для каждого повторения цикла, OpenSCAD позволяет получить объект, который представляет собой общую часть всех объектов, полученных в цикле. Эту операцию можно выполнить с помощью оператора intersection_for [3].
Синтаксис оператора такой же как у for:
intersection_for (i = [start: end]) { … };
intersection_for (i = [start : step : end]) { … };
intersection_for (i = […,…,…]) { … };
Рассмотрим разницу в работе операторов for ( ) и intersection_for ( ):
Пример (рис. 6, рис. 7):
$fn=10;
for (i = [[0, 0, 0], [20, 30, 200], [99, 45, 700], [90, 8, 60], [2, 40, 260]]){
rotate (i);
cube ([200, 30, 30], center=true);}
Рис. 6Рис. 7
$fn=10;
intersection_for (i=[[0, 0, 0], [20, 30, 200], [99, 45, 700], [90, 8, 60], [2, 40, 260]])
{ rotate (i)
cube ([200, 30, 30], center=true); }
Список литературы:
Румянцев М.В. Виртуальная реконструкция объектов // Прикладная информатика: научно-практический журнал. – 2011. - №36. – 62 - 77 с.
Ечмаева Г.А. Основы твердотельного моделирования в среде OpenSCAD: учебно-методическое пособие / Г.А. Ечмаева. –Тобольск: Тобольский педагогический институт им. Д.И. Менделеева (филиал) ТюмГУ в г.Тобольске, 2017.– 160 с.
OpenSCAD User Manual/User-Defined Functions and Module.// Википедия [Электронный ресурс]: Режим доступа: - URL:https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/User-Defined_Functions_and_Modules (дата обращения 4.05.2017)