for($i=0; $i<$NumPoints; $i=$i+1)
{
float $t=$i/$Density; float $x=$t/$xSpeed; float $y=$Amp * sin($t*$Freq); float $z=$Amp * cos($t*$Freq); curve -p ($x) ($y) ($z) -a “myCurve”;
}
delete “myCurve.cv[0]”; Немного улучшим построитель кривых, а заодно оформим его в виде процедуры, чтобы его можно было вызывать одной командой, тем более, что мы собираемся создать окно с большой красивой кнопкой для построения кривой.
Чтобы избежать удаления первой точки на кривой последней командой delete “myCurve.cv[0]”; сделаем в цикле проверку того, что если $i равно 0, то следует поставить первую точку на новую кривую, а в противном случае добавить точку к уже существующей.
global proc curveBuilderProc()
{
int $NumPoints=500;
float $Amp=3.0, $Freq=2.0, $Density=1Q.O, $xSpeed=5.0; if(objExists(“myCurve”)==1) { delete “myCurve”; }
// curve -p 0 0 0 -n “myCurve”; int $i;
for($i=0; $i<$NumPoints; $i=$i+1)
{
float $t=$i/$Density; float $x=$t/$xSpeed; float $y=$Amp * sin($t*$Freq);
float $z=$Amp * cos($t*$Freq);
if($i==0) { curve -p ($x) ($y) ($z) -n “myCurve”;}
else { curve -p ($x) ($y) ($z) -a “myCurve”;}
}
// delete “myCurve.cv[0]”;
} ’
Выполните эти строчки, чтобы объявить процедуру curveBuilderProc в памяти.
Напомню, что переменные $Атр и $Freq задают в данном случае радиус и частоту вращения спирали. Общее количество точек определяется переменной $NumPoints, их плотность укладывания (а следовательно, и общая длина кривой) - переменной $Density, а скорость роста кривой вдоль оси X - переменной SxSpeed (на самом деле увеличение $xSpeed задает замедление роста вдоль оси X, так как я перепутал знаки «делить» и «умножить»).
Я не ввожу таких понятий, как количество витков или шаг спирали, так как во-первых, эта кривая будет оставаться спиралью лишь до тех пор, пока вы не поменяете формулу, а у произвольной кривой может и не быть витков или шагов. Во-вторых - это не принципиально. В-третьих, вычисление количества витков, потребует введения в формулы числа тт, рассказ о котором никак не входит в мои планы.
Создадим теперь окно, в котором будут числовые поля для задания значений вышеуказанных переменных и большая кнопка «Построить кривую».
Воспользуемся опять заготовкой для создания окна с проверкой его наличия в памяти, благополучно сохраненной запасливыми умами.
string $win_name = “CURVE_BUILDER”; if(' window -ex $win_name '==1) { deletelll $win_name; } window -t “Curve Builder” $win_name; columnLayout;
intSliderGrp -I “Num Points” -field 1 -value 500; floatSliderGrp -I “Amplitude” -field 1 -value 3.0; floatSliderGrp -I “Frequency” -field 1 -value 2.0; floatSliderGrp -I “Density” -field 1 -value 10.0; floatSliderGrp -I “X Speed” -field 1 -value 5.0; separator -style “none” -h 15;
gridLayout -numberOfColumns 2 -cellWidthHeight 192 32; button -I “Build Curve” -w 188 -c “curveBuilderProc”; button -I “Close” -w 188 -c (“deletelll “+$win_name); showWindow $win_name; Первые строки не требуют комментариев, это просто построение окна, уже рассмотренное выше.
Команды intSliderGrp и floatSliderGrp создают в окне группу из текстовой метки, слайдера и числового поля, не привязанного ни к какому атрибуту. Кроме того, эти команды имеют секретный флаг -field, который должен быть явным образом установлен в единицу, иначе числовое поле будет спрятанным и на экране появится только слайдер с надписью.