Фрактальные деревья
От: Сергей Туленцев Россия http://software.tulentsev.com
Дата: 13.05.06 13:32
Оценка: 49 (4)
Человек может без устали смотреть как течет вода, как горит огонь и как работают другие люди.
А я как-то вот в учебных целях написал рисовалку фрактальных деревьев и с тех пор стараюсь её не запускать,
потому что не могу оторваться. Решил поделиться с общественностью. Может быть, кого-то еще порадует.
Брать здесь

Для работы потребуются .NET Framework 2.0 и Nemerle
--
Re: Фрактальные деревья
От: Vermicious Knid  
Дата: 13.05.06 15:05
Оценка: 2 (1)
Здравствуйте, Сергей Туленцев, Вы писали:

СТ>Для работы потребуются .NET Framework 2.0 и Nemerle

Ты в архив Nemerle.dll положи, тогда Nemerle не потребуется(как вариант можно еще утилитой ilmerge воспользоваться). У меня например Nemerle более новой версии(из svn) и как следствие пришлось твою программу перекомпилировать.
Re: Фрактальные деревья
От: McSeem2 США http://www.antigrain.com
Дата: 13.05.06 17:47
Оценка: 18 (2)
Здравствуйте, Сергей Туленцев, Вы писали:

СТ>Человек может без устали смотреть как течет вода, как горит огонь и как работают другие люди.

СТ>А я как-то вот в учебных целях написал рисовалку фрактальных деревьев и с тех пор стараюсь её не запускать,
СТ>потому что не могу оторваться. Решил поделиться с общественностью. Может быть, кого-то еще порадует.
СТ>Брать здесь

Вот гораздо более могучая рисовалка:
http://www.contextfreeart.org/wiki/
http://chriscoyne.com/gallery/

Там и деревья и медведы и морская живность...
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[2]: Фрактальные деревья
От: Сергей Туленцев Россия http://software.tulentsev.com
Дата: 13.05.06 17:53
Оценка:
Здравствуйте, Vermicious Knid, Вы писали:

VK>Здравствуйте, Сергей Туленцев, Вы писали:


СТ>>Для работы потребуются .NET Framework 2.0 и Nemerle

VK>Ты в архив Nemerle.dll положи, тогда Nemerle не потребуется(как вариант можно еще утилитой ilmerge воспользоваться). У меня например Nemerle более новой версии(из svn) и как следствие пришлось твою программу перекомпилировать.

Запаковал. Брать по прежнему — здесь
--
Re[2]: Фрактальные деревья
От: Сергей Туленцев Россия http://software.tulentsev.com
Дата: 13.05.06 17:55
Оценка: 1 (1) +1
Здравствуйте, McSeem2, Вы писали:

MS>Здравствуйте, Сергей Туленцев, Вы писали:


MS>Вот гораздо более могучая рисовалка:

MS>http://www.contextfreeart.org/wiki/
MS>http://chriscoyne.com/gallery/

MS>Там и деревья и медведы и морская живность...


Кххммм. Дааа уж, моё на этом фоне смотрится... ээээ... вообще никак не смотрится.
Но надо же с чего-то начинать, правда?
--
Re: Фрактальные деревья
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.05.06 13:46
Оценка:
Здравствуйте, Сергей Туленцев, Вы писали:

СТ>А я как-то вот в учебных целях написал рисовалку фрактальных деревьев и с тех пор стараюсь её не запускать,

СТ>потому что не могу оторваться. Решил поделиться с общественностью. Может быть, кого-то еще порадует.
СТ>Брать здесь

Прикольно, но решение явно не в духе Немерла.
Вот если бы реализовать на немерле DSL вроде на который дал ссылку
Автор: McSeem2
Дата: 13.05.06
McSeem2, то было бы не только прикольно и очень выразительно.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Фрактальные деревья
От: McSeem2 США http://www.antigrain.com
Дата: 28.05.06 18:17
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Прикольно, но решение явно не в духе Немерла.

VD>Вот если бы реализовать на немерле DSL вроде на который дал ссылку
Автор: McSeem2
Дата: 13.05.06
McSeem2, то было бы не только прикольно и очень выразительно.


Вообще-то это и был намек, что если Немерле такой могучий, то почему "фишки нет"? Решение ничем не отличается, скажем, от Фортрановского. Но с другой стороны — а какое еще возможно? Например, этот Context Free — простейший интерпретатор с несложными правилами. Код интерпретируется исполняющей машиной, которая к Немерле или чему другому имеет очень слабое отношение — эта машина может быть написана на любом языке, и не будет принципиально отличаться. Если же ты намекаешь на генерацию кода во время компиляции (макросы и проч.), то это явно не та область, где подобные фокусы применимы — в случае более-менее сложной картинки любой компилятор просто вымрет как мамонт. В качестве доказательства — тот же Context Free формально умеет генерировать SVG-файл — это XML, содержащий векторные графические инструкции. Так вот, файлы получаются просто каких-то фантастических размеров. Таких же рамеров будет и AST.

Context Free работает потому, что он не хранит все ноды дерева — он их генерирует, исполняет и забывает, поэтому требует O(log N) памяти (по высоте дерева), где N — некая условная сложность картинки. Если же все по-честному разворачивать в код, то неизбежно получится O(N). Так вот вопрос — а можно ли так извернуться, чтобы сэмулировать на Немерле синтаксис, идейно похожий на ContextFree, но чтобы при этом компилятор не помер на дереве из миллиарда нодов?
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[3]: Фрактальные деревья
От: WolfHound  
Дата: 28.05.06 20:20
Оценка:
Здравствуйте, McSeem2, Вы писали:

MS>Context Free работает потому, что он не хранит все ноды дерева — он их генерирует, исполняет и забывает, поэтому требует O(log N) памяти (по высоте дерева), где N — некая условная сложность картинки. Если же все по-честному разворачивать в код, то неизбежно получится O(N). Так вот вопрос — а можно ли так извернуться, чтобы сэмулировать на Немерле синтаксис, идейно похожий на ContextFree, но чтобы при этом компилятор не помер на дереве из миллиарда нодов?

А зачем генерить дерево нодов? Достаточно просто сгенерить кучу локальных функций.
Както так:
Это исходный DSL(на немерле будут косметеческие изменения)
startshape WHOLE

rule WHOLE {
    QUAD { x -0.5 y -0.5 }
    QUAD { x  0.5 y -0.5 }
    QUAD { x  0.5 y  0.5 }
    QUAD { x -0.5 y  0.5 }
}

rule QUAD {
    FILL { }
}
rule QUAD 5 {
    WHOLE { size 0.45 r 2 }
}
rule QUAD 0.5 {
    // nothing
}

rule FILL {
    SQUARE {
        size 0.8
    }
}

А это то что примерно нужно сгенерить
def WHOLE(x, y, r, size)
{
| _ when size < minSize => ();
| _ =>
    {
        QUAD ( x + -0.5, y + -0.5, r, size);
        QUAD ( x +  0.5, y + -0.5, r, size);
        QUAD ( x +  0.5, y +  0.5, r, size);
        QUAD ( x + -0.5, y +  0.5, r, size);
    }
}
def QUAD(x, y, r, size)
{
| _ when size < minSize => ();
| _ =>
    match(rand(1 + 5 + 0.5))
    {
    | rnd when rnd < 1 => FILL (x, y, r, size);
    | rnd when rnd < 1 + 5 => WHOLE (x, y, r + 2 , size * 0.45);
    | rnd when rnd < 1 + 5 + 0.5 => ();
    }
}
...
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[4]: Фрактальные деревья
От: McSeem2 США http://www.antigrain.com
Дата: 29.05.06 00:37
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>А зачем генерить дерево нодов? Достаточно просто сгенерить кучу локальных функций.


То есть, правильно ли я понимаю — каждому правилу будет соответствовать одна функция, которую можно сгенерировать из некоего птичьтего DSL при помощи тех же макросов?

То, что ты привел — это просто обыкновенные функции, текст которых можно сгенерировать из этого DSL хоть Перлом. И можно выдать хоть Сишный текст. Да я и вручную могу написать.

В чем же заключается этот самый "дух Немерле"? Для примера возьмем простейший случай на CFDG:

(1)
startshape spiral
rule spiral {
    CIRCLE {}
    spiral { s 0.95 y 1 r 20 }
}



В терминах Си будет примерно следующая рекурсивная функция:

(2)
void rule_spiral(context* ctx)
{
   if(ctx->s >= 0.01) 
   {
       circle(ctx);
       ctx->s *= 0.95;
       ctx->y += 1;
       ctx->r += 20;
       rule_spiral(ctx);
   }
}


Сами языки C, C++, C# и прочие не содержат средств для программирования некого компилятора из 1 в 2 — этот компилятор надо писать вручную, хоть на том же Си (Паскаль, Перл — не суть важно). Но ни Сишными макросами, ни C++cными шаблонами такое сделать невозможно. Вот мне и интересно, как же конкретно Немерле может здесь помочь? В смысле трансляции DSL->Nemerle в самом же исходнике?
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[5]: Фрактальные деревья
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.06.06 02:10
Оценка:
Здравствуйте, McSeem2, Вы писали:

MS>В смысле трансляции DSL->Nemerle в самом же исходнике?


Да.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Фрактальные деревья
От: vdimas Россия  
Дата: 20.06.06 08:11
Оценка:
Здравствуйте, Сергей Туленцев, Вы писали:

СТ>Но надо же с чего-то начинать, правда?


Мои потуги годичной давности там же

http://chriscoyne.com/gallery/view.php?id=56016919401700000
http://chriscoyne.com/gallery/view.php?id=1192884857612400128
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Фрактальные деревья
От: DEMON HOOD  
Дата: 28.06.06 18:30
Оценка: :)))
Здравствуйте, Сергей Туленцев, Вы писали:

СТ>Человек может без устали смотреть как течет вода, как горит огонь и как работают другие люди.

ага, идеальный случай — пожар.
silent RSDN@Home 1.2.0 alpha [651] Windows XP 5.1.2600.131072
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.