1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346
Макеты страниц
2.2. L-системыПонятие L-систем, тесно связанное с самоподобными фракталами, появилось только в 1968 году благодаря Аристриду Линденмайеру. Изначально L-системы были введены при изучении формальных языков, а также использовались в биологических моделях селекции. С их помощью можно строить многие известные самоподобные фракталы, включая снежинку Коха и ковер Серпинского. Некоторые другие классические построения, например кривые Пеано (работы Пеано, Гильберта, Серпинского), также укладываются в эту схему. И конечно, L-системы открывают путь к бесконечному разнообразию новых фракталов, что и послужило причиной их широкого применения в компьютерной графике для построения фрактальных деревьев и растений. Наше изложение L-систем следует в основном работам Прузинкевича и Ханана [39] и ограничивается случаем детерминированных Для графической реализации L-систем в качестве подсистемы вывода используется так называемая тертл-графика (turtle — черепаха). При этом точка (черепашка) движется по экрану дискретными шагами, как правило, прочерчивая свой след, но при необходимости может перемещаться без рисования. В нашем распоряжении имеются три параметра F переместиться вперед на один шаг, прорисовывая след, b переместиться вперед на один шаг, не прорисовывая след. [ открыть ветвь (подробнее см. ниже) ] закрыть ветвь (подробнее см. ниже) + увеличить угол а на величину в — уменьшить угол а на величину в Размер шага и величина приращения по углу в задаются заранее и остаются неизменными для всех перемещений черепашки. Если начальное направление движения а (угол, отсчитываемый от положительного направления оси X) не указано, то полагаем а равным нулю. Несколько примеров иллюстрируют применение команд ветвления (обозначаются ], [) и вспомогательных переменных (обозначаются X, Y и т. д.). Команды ветвления используются для построения деревьев и растений, а вспомогательные переменные заметно облегчают построение некоторых L-систем. Формально, детерминированная L-система состоит из алфавита, слова инициализации, называемого аксиомой или инициатором, и набора порождающих правил, указывающих, как следует преобразовывать слово при переходе от уровня к уровню (от итерации к итерации). К примеру, можно заменять букву F при помощи порождающего правила Обновление букв в данном слове предполагается одновременным, то есть все буквы слова одного уровня обновляются раньше любой буквы следующего уровня. L-система, соответствующая снежинке Коха (рис. 2.2), задается следующим образом: Аксиома: Порождающее правило: Графическое представление аксиомы F++F++F — равносторонний треугольник. Черепашка делает один шаг вперед, затем угол а увеличивается на На первом шаге каждая буква F в слове-инициаторе Убирая скобки, получаем: Повторяя этот процесс, на втором шаге получим: и т. д. Псевдокод для итерирования порождающих правил в этом простейшем случае, когда используются только правила вида Алгоритм 2.2.1. (L-СИСТЕМЫ) Назначение: реализует правила Вход:
Выход: Инициализация: Шаги: Замечание: Соответствующий псевдокод для тертл-графики мы рассмотрим ниже в этом параграфе. Список порождающих правил для различных L-систем, которые упоминаются в тексте, можно найти в конце этого параграфа. График на рис. 2.10 не имеет разрывов, так как черепашка движется единичными шагами и каждый раз прорисовывает свой след. Разрывные графики можно получать, применяя в L-системе команду «b», то есть команду «переместиться на один шаг вперед без рисования». Примерами могут служить изображения мозаики на рис. 2.11 и цепочки на рис. 2.12. При построении фракталов с использованием только одного порождающего правила возникает следующая трудность. Мы не можем изменить направление чтения правила на некоторых шагах, то есть читать его не слева направо, а справа налево. Без решения этой проблемы невозможно получить L-системы для кривых Пеано, которым посвящен следующий параграф. Рис. 2.10. Остров после 2-х итераций Например, для того чтобы построить фрактал под названием «дракон Хартера-Хайтвея» [9, 31], необходимо иметь возможность менять направление чтения порождающего правила, изображенного на рис. 2.13. В качестве инициатора, или аксиомы, используется кривая слева. Порождающее правило в данном случае заключается в том, чтобы нарисовать инициатор сначала в прямом, а затем в обратном направлении. Подобная схема не вписывается в рамки L-систем, использующих только одно порождающее правило. Эту проблему можно решить, введя две различных команды для передвижения вперед, например X и Y. Будем считать, что черепашка интерпретирует X и Y одинаково, то есть как один шаг вперед. С помощью этих двух букв порождающее правило для дракона можно записать следующим образом: Однако, нам не хотелось бы отказываться от первоначального подхода, при котором имеется только одна буква F, интерпретируемая как один шаг вперед. Рис. 2.11. Мозаика после 3-х итераций (Патрик Хагерти) Чтобы вернуться в рамки этого подхода, будем считать буквы X и Y вспомогательными переменными, игнорируемыми черепашкой, и заменим их в порождающем правиле на FX и FY соответственно. Получим: Далее замечаем, что того же результата можно добиться при помощи следующих порождающих правил: Рис. 2.12. Цепочка после 3-х итераций (Ян-Си Ло) Рис. 2.13. Инициатор и правило для дракона Хартера-Хайтвея Рис. 2.14. Дракон Хартера-Хайтвея после 12-и итераций Ниже приведены несколько шагов построения дракона с использованием этих порождающих правил: На рис. 2.14 изображен дракон после 12 итераций. Заметьте, что дракон состоит из нескольких похожих частей. В заключение остановимся на операции ветвления. Когда мы встречаем символ [ (открыть ветвь), мы запоминаем положение и направление черепашки, то есть переменные Рис. 2.15. Сорняк после 4-х итераций Для хранения триплетов причем новые данные записываются в конец стека. Когда ветвь закрывается, переменным Таким образом, ветвление задается двумя символами: [ Открыть ветвь. Сохранить ] Закрыть ветвь. Присвоить переменным На рис. 2.15 и 2.16 изображены фракталы, построенные с помощью операции ветвления. Ниже приведен алгоритм, который позволяет получать графическое представление слова при помощи тертл-графики. Алгоритм 2.2.2. (ТЕРТЛ-ГРАФИКА) Назначение: реализует тертл-графику для кодового слова, состоящего из букв [, ], + и -. Вход: Выход: Графическое представление word. Инициализация: графический режим (подробнее см. ниже) Шаги: провести линию из точки Рис. 2.16. Куст после 4-х итераций Можно написать специальную программу для определения размеров графического окна. Для этого достаточно выполнить в точности те же шаги, что и в алгоритме 2.2.2, но вместо вывода на экран надо отслеживать наименьшее и наибольшее значения х и у. Вначале положим эти значения равными нулю: Каждый раз, когда появляется новая точка (х,у), размеры окна обновляюся: Рис. 2.17. Снежинка после 3-х итераций (Джонг By Ким) Значения Порождающие правила для L-систем. Порождающие правила для L-систем перечислены в алфавитном порядке. Дракон Хартера-Хайтвея (рис. 2.14): Рис. 2.18. Цветок после 3-х итераций (Брандон Нельсон) Ковер Серпинского (рис. 2.4): Кривая Гильберта, заполняющая плоскость (рис. 2.24): Кривая Госпера, заполняющая плоскость (рис. 2.26): Кривая Пеано, заполняющая плоскость (рис. 2.22, 2.23): Кривая Серпинского, заполняющая плоскость (рис. 2.25): Куст (рис. 2.16): Мозаика (рис. 2.11): Остров (рис. 2.10): Снежинка (рис. 2.17): Снежинка Коха (рис. 2.2): Сорняк (рис. 2.15): Рис. 2.19. Порождающее правило к упр. 2 Цветок (рис. 2.18): Цепочка (рис. 2.12):
|
Оглавление
|