Наткнулся на весьма занимательную штуку — язык CFDG: http://chriscoyne.com/cfdg/page6.php
Язык, умеет делать только одно — рисовать. Но как! Соотношение компактность-результат — выше всяких похвал: http://chriscoyne.com/cfdg/page6.php (картинка 300K).
У меня тоже бродят мысли сочинить подобный язык, но типа более практичный, что ли.
CFDG — это в основном чисто фан. Ну или некий инструмент для очень продвинутых дизайнеров.
Они даже сделали интерактивную софту: http://www.ozonehouse.com/ContextFree/index.html
Проект стартовал в Мае этого года, но уже набрал поклонников: http://chriscoyne.com/cfdgforums/viewforum.php?f=3 — час сидел игрался с примерами.
Что же я сказать-то хотел?
1. Просьба прокомментировать — интересно ваше мнение. Не надо только подходить с чисто меркантильно-прагматических позиций, типа "нафига оно надо" — это просто интересно и прикольно.
2. Можно поиграться и запостить код сюда — вдруг чего гениальное образуется.
3. Похвастаюсь — внутри используется AGG.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Здравствуйте, mishaa, Вы писали:
M>Конкретно этот пример до боли похож на один пример из книжки по Лого, предназначенной для обучения программированию детей дошкольного возраста
Угу, мне тоже Лого вспомнился когда увидел. Но идея классная!
Здравствуйте, Ka3a4oK, Вы писали:
MS>>3. Похвастаюсь — внутри используется AGG. KK>Зачем они GFIPLUS.dll с собой таскают ?
Изначально было на GDI, потом — на GDI+, очень тормозно и некачественно. Потом переделали на AGG, но от GDI+ видимо так до конца и не отчистили. Подозреваю, что используют для масштабирования изображений. С низким качеством GDI+ масштабирует картинки несколько быстрее.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
startshape plant{color alpha}
rule plant {
rose { x 2 y 1 b 0.6 sat 1 hue=0 }
stem { s 1.2 1.8 x 1.7 y -1.2 }
rose { x -1 r 180 b 0.6 sat 1}
stem { flip 90 s 1.2 y -2 }
leaf { skew 0 -25 r 75 x 0.4 y -2.2 b =0.5 hue =120 sat 0.6 }
leaf { s 1 0.8 flip 90 r -70 x 1.15 y -1.8 b =0.5 hue =120 sat 0.6 }
}
rule rose {
rosestart { }
rosestart { r 60 }
rosestart { r 120 }
rosestart { r 180 }
}
rule rosestart {
petal { s 1.8 }
rosepart { r -25 s 0.7 }
}
rule rosepart {
petal { s 2 }
rosepart { r -25 s 0.9 }
}
rule petal {
CIRCLE { s 0.9 1.8}
CIRCLE { s 0.85 1.7 b 0.2 }
CIRCLE { s 0.8 1.6 b 0.4 }
petal { r -105 y 0.04 x 0.04 size 0.9 h 0.8 b 0.1 }
}
rule stem {
CIRCLE { b =0.5 hue =120 r -25 s 1 3 sat 0.6 }
CIRCLE { r -25 x 0.12 y -0.03 s 1 3 b 1 sat -1 }
SQUARE { x -0.7 y -1.2 s 0.5 b 1 }
}
rule leaf {
SQUARE [s 0.1 0.6 ]
leafpart { r 5 y 0.8 x -0.05 }
}
rule leafpart {
CIRCLE { b =0.4 }
CIRCLE { s 0.9 b 0.6 }
SQUARE { s 0.1 1 }
leafpart { r 1.5 y 0.1 s 0.9 }
}
Здравствуйте, vdimas, Вы писали:
V>вот результат цветового эксперимента:
У! Я смотрю, ты свои работы в их галерею добавил — это правильно. А вообще, судя по некоторым изображениям, это почти идеальный инструмент для создания оптических иллюзий.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Здравствуйте, 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}
}
Каждый раз получаем змейку произвольной длины и формы, вот примерно средний вариант: