forCint count = 0: count < 5: count++) {

starMotifO ;

cvs.rotate2D(72.0): // concatenate another rotation // присоединяем другой поворот }

Изобразите на бумаге, что происходит после каждого из этих шагов. Пример 5.5.2. Рисование снежинок Красота снежинки в значительной степени проистекает из высокого уровня ее симметрии. Снежинка состоит из шести одинаковых спиц (так называются линии, идущие от центра круга к его периферии), отстоящих на 60° одна от другой, причем каждая спица симметрична относительно своей собственной оси. Нетрудно построить сложную снежинку, если разработать одну половину спицы и затем нарисовать ее 12 раз. На рис. 5.39, а приведена снежинка, созданная из мотива, показанного на рис. 5.39, б. Этот мотив является ломаной линией, которая расположена выше положительной части оси х. (Чтобы избежать перекрытия с другими частями снежинки, эта ломаная не поднимается выше показанной на рисунке прямой, наклоненной под углом 30° к оси х.) Пусть этот мотив рисуется подпрограммой Л akeMotifO.

Френсис Хилл

5.5. Использование аффинных преобразований в программах

Френсис Хилл

Рис. 5.38. Применение последовательных поворотов системы координат

Френсис Хилл

Рис. 5.39. Проектирование снежинки Каждая спица снежинки является комбинацией мотива и его же отраженной версии. Отражение относительно оси х осуществляется с помощью подпрограммы sca1e2D(l. -1) (почему?), так что мотив в совокупности со своим отражением можно нарисовать посредством следующего кода:

flakeMotifO:

// draw the top half

// рисуем верхнюю половинку

cvs.seale2D(1.0.-1.0):

// flip it vertically

// зеркально отображаем ее по вертикали

flakeMotifO.'

// draw the bottom half

// рисуем нижнюю половинку

cvs.scale2D(1.0.-1.0):

// restore the original axis

// восстанавливаем исходную ось Для того чтобы нарисовать всю снежинку, нужно просто выполнить этот код шесть раз, с промежуточным поворотом на 60°:

void drawFlakeO {

for(int count " 0: count < 6: count++) // draw a snowflake // рисуем снежинку

{

Глава 5. Преобразования объектов

flakeMotifO:

cvs.seale2D(1.0. -1.0):


⇐ Предыдущая| |Следующая ⇒