×
 

2.7.13 Тело по траектории

 Данный метод создает тело по траектории путём многократного копирования заданного контура вдоль заданной траектории в каждой её точке. Метод также поддерживает кручение и масштабирование контура.
 
 
Рис. 9. Тело по траектории
 
Синтаксис метода создания
sweep(ContourLine, PathLine, sweepAlignment=…, sweepTwist=…, sweepScaleMode=…, sweepScaleLaw=…, sweepScalePoint=…, mass=..., density=..., color=..., visible=...)
      
Обязательные позиционные параметры метода
line ContourLine
Линия, по которой формируется образующий контур.
line PathLine
Линия, по которой формируется траектория, вдоль которой перемещается образующий контур.
 
Необязательные именованные параметры метода
sweepAlignment = [alignNormal:/alignParallel:]
Тип ориентации контура при перемещении вдоль траектории.
По умолчанию sweepAlignment = alignNormal:.
 sweepAlignment = alignNormal:
Ориентировать контур перпендикулярно направлению касательной к траектории.
 sweepAlignment = alignParallel:
Ориентировать контур параллельно самому себе вдоль всей траектории (параллельный перенос).
 sweepTwist = function [rad]< [-]>
Функция, задающая закон кручения контура вдоль траектории. Она описывает зависимость угла кручения контура в радианах от нормализованной длины траектории, т.е. область определения функции ограничена интервалом [0;1]:
0 соответствует начальной точке траектории, 1 — конечной точке.
Например, функция  задает линейное увеличение угла кручения от 0 до 0.5 радиан по мере движения вдоль траектории.
sweepScaleMode = [scaleSize:/scalePosition:/scaleAll:/scaleNone:]
Тип масштабирования контура при перемещении вдоль траектории.
По умолчанию sweepAlignment = scaleNone:.
 sweepAlignment = scaleNone:
Не масштабировать.
 sweepAlignment = scaleSize:
Масштабировать только размер контура относительно точки – расстояние между точкой и траекторией не изменяется при копировании вдоль траектории. При выборе данного режима необходимо задать точку sweepScalePoint, относительно которой будет выполняться масштабирование.
 sweepAlignment = scalePosition:
Масштабировать только положение контура относительно точки – расстояние между точкой и траекторией изменяется в соответствии с законом масштабирования при копировании вдоль траектории. При выборе данного режима необходимо задать точку sweepScalePoint, относительно которой будет выполняться масштабирование.
 sweepAlignment = scaleAll:
Масштабировать и размер и положение контура. При выборе данного режиме точку sweepScalePoint задавать не нужно.
 sweepScaleLaw = function [-]< [-]>
Функция, задающая закон масштабирования контура вдоль траектории. Она описывает зависимость масштаба контура от нормализованной длины траектории, т.е. область определения функции ограничена интервалом [0;1]:
0 соответствует начальной точке траектории, 1 — конечной точке.
Значения функции масштабирования не могут быть отрицательны.
Например, функция  задает линейное увеличение масштаба контура от оригинального размера до удвоенного по мере движения вдоль траектории.
 sweepScalePoint = point
Точка, относительно которой выполняется масштабирование контура, если установлены режимы масштабирования sweepScaleMode = [scaleSize:/scalePosition:].
Параметры являются общими для всех методов создания тел.
color =..., visible =...
Параметры являются общими для всех методов создания геометрических объектов и описаны в пункте «Необязательные именованные параметры объектов» общей части главы «Геометрические и массово-инерционные объекты».
 
Описание
Метод работает следующим образом:
1.    На вход принимаются образующий контур и траектория. Контур должен быть замкнут.
2.    Если контур не плоский, выполняется поиск ближайшей к нему плоскости и затем контур проецируется на неё.
3.    Устанавливаются законы кручения и масштабирования, а также тип ориентации контура если соответствующие ключевые параметры заданы пользователем.
4.    Осуществляется многократное копирование контура (или его проекции если он не плоский) вдоль траектории с соблюдением всех заданных ключевых параметров.
5.    Полученное тело проверяется на самопересечения.
 Пример
В качестве примера рассмотрим сочетание простейших образующих – квадратный контур и дугообразную траекторию:
 
point cp1 = point(-0.15[m], 0[m], -0.15[m]);
point cp2 = point(0.15[m], 0[m], -0.15[m]);
point cp3 = point(0.15[m], 0[m], 0.15[m]);
point cp4 = point(-0.15[m], 0[m], 0.15[m]);
line contour = polyLine(list(cp1, cp2, cp3, cp4, cp1, objType = point:));
point pp1 = point(0.1[m], 0.5[m], 0[m]);
point pp2 = point(0.5[m], 1[m], 0[m]);
line path = circlePPP(projectCS, pp2, pp1);
//Тело по траектории:
solid sweep = sweep(contour, path);
 
Полученное тело показано на рис. 10, а – контур по умолчанию ориентируется перпендикулярно траектории. Альтернативная, параллельная ориентация контура представлена на рис. 10, б:
 
solid sweep_parallel = sweep(contour, path, sweepAlignment = alignParallel:);
 
Рис. 10. Пример тела по траектории:
а – перпендикулярная ориентация контура;
б – параллельная ориентация контура
 
Перейдём к использованию законов кручения:
 
function scale_const(x[])= PI/2 * #x;
function twist_const(x[])= scale_const(#x) * 1[rad];
solid sweep_twisted = sweep(contour, path, sweepTwist = twist_const);
 
Поскольку область определения законов кручения и масштабирования ограничивается интервалом [0; 1], то для такой функции соответствующие граничные значения будут равны 0 и , что означает плавное кручение контура от исходного положения в самом начале траектории до поворота на  в самом конце траектории. Полученное тело представлено на рис. 11:
 
Рис. 11. Пример тела по траектории –
перпендикулярная ориентация контура вместе с кручением
 
Аналогичным образом применяются и законы масштабирования. В качестве примера – простая функция:
 
function scale_linear(x[])=#x+1;
solid sweep_scale_pos = sweep(contour, path, sweepScaleLaw = scale_linear, sweepScaleMode = scalePosition:, sweepScalePoint = cp3);
solid sweep_scale_size = sweep(contour, path, sweepScaleLaw = scale_linear, sweepScaleMode = scaleSize:, sweepScalePoint = cp3);
solid sweep_scale_all = sweep(contour, path, sweepScaleLaw = scale_linear, sweepScaleMode = scaleAll:);
 
Данная функция будет линейно масштабировать контур от исходного размера в самом начале траектории (при значении x = 0 функция принимает значение, равное 1 – исходный масштаб) до удвоенного (при x = 1 значение функции будет равно 2 – двойной масштаб) в самом конце траектории.
Полученные тела представлены на рис. 12:
 
Рис. 12. Пример тела по траектории –
перпендикулярная ориентация контура вместе с масштабированием:
а – масштабирование размера контура относительно точки;
б – масштабирование положения контура относительно точки;
в – масштабирование и размера, и положения контура