Re[3]: Context Free Design Grammar by Chris Coyne
От: vdimas Россия  
Дата: 29.07.05 08:06
Оценка: 20 (1)
Здравствуйте, McSeem2, Вы писали:

MS>Но я, например, не понимаю простой вещи — когда и как вся эта "байда" останавливается?


1. Когда size достигает значения < некоего Epsilon. Т.е. в рекурсивных алгоритмах мы вызываем каждый следующий шаг с коеф. при size меньшим 1. Например.
startshape spiral {}

rule spiral {
    CIRCLE {}
    spiral { s .998 y 2 r 4 }
}






2. Если есть множество правил, то текущее применяемое правило выбирается случайным образом. Одно из правил может быть нерекурсивным, тогда на нем алгоритм остановится. Есть возможность задавать вероятность применения правил.

Ниже пример остановки по 2-му варианту. Тут несколько рекурсивных правил tail, но одно из них конечное, задано с маленькой вероятностью.
startshape snake{color}

rule snake {
    head {}
    tail { x .3 s .5 }
}

rule head {
    CIRCLE { b .3 sat .8 h 30 s 1 .6 }
    CIRCLE { x -.1 y .2 s .3 .15 b 1 }
    TRIANGLE { x -.3 y -.2 b 1 s .5 .2 r 45 }
}

// рекурсивные хвосты
rule tail { body {}  tail { x .6 r -6 } }
rule tail { body {}  tail { x .6 r -10 } }
rule tail { body {}  tail { x .6 r -14 } }
rule tail 0.5 { tail { flip 0 } }

// конечный хвостик
rule tail 0.05 {
    TRIANGLE { x .5 r -90 s .9 2 b .3 sat 0.8 h 30 }
}

rule body {
    SQUARE { x .3 b 0.8 s .6 .9 sat 1 h 60 }
    TRIANGLE { y -.15  s .3 1 b .3 sat 0.5  }
    TRIANGLE { r 180  x .3 y .15 s .3 1 b .5 sat 0.8 h 200}
}


Каждый раз получаем змейку произвольной длины и формы, вот примерно средний вариант:

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.