Проектирование структур данных L-System (C ++) - PullRequest
4 голосов
/ 10 марта 2011

Я пытаюсь спроектировать структуру данных для реализации движка переписывания L-System на C ++, и я просто не могу никуда добраться: (.

Мне нужно хранить строку символов (символы). Существует несколько типов символов (это определяется алфавитом LSystem). Допустим, у нас есть типы «A», «B», «C». Теперь каждый тип символа может иметь различные параметры. Например, символу типа A будет некоторое расстояние, а у символа - угол. Символ C не имеет параметров. Строка может выглядеть как «ABABC».

Затем мне нужно перебрать строку и выполнить некоторые действия, которые также связаныдля каждого типа символа. «A» может означать «нарисовать линию длины« расстояние »(расстояние является параметром A), B« повернуть »угол« градусы »и закончить рисование C.

Я пыталсяесть класс Symbol и дочерний элемент для каждого типа символа (класс SymbolA, класс SymbolB, класс SymbolC), но я не знаю, как создать строку. Я хотел бы избежать приведения типов и тому подобного.

Есть ли кто-нибудь, у кого была похожая проблема или есть идея, которая может мне помочь, пожалуйста?

Ответы [ 2 ]

1 голос
/ 25 мая 2011

Если вы хотите реализовать что-то более сложное, чем полноценные L-системы, я бы предложил использовать язык более высокого уровня, чем C ++, такой как Python или Common Lisp. Затем вы можете профилировать весь кусок кода и реализовать узкие места в скорости на C / C ++.

Я давно внедрил L-системы для курса по теории хаоса и фракталам, используя Common Lisp. Это было не так уж сложно сделать - просто использовал список символов. Я пытался найти код для него, но прошло уже более 7 лет, так что пока не повезло.

В любом случае, это кажется мне более разумным подходом. Даже если вы сделаете медленную реализацию на языке высокого уровня, это даст вам лучшее представление о том, как реализовать ее в C ++, что занимает гораздо больше времени у разработчика.

0 голосов
/ 20 июля 2011

Мне кажется, вы на правильном пути: вам нужен класс SymbolBase, который определяет чисто виртуальные функции для вида операций, которые необходимо реализовать, а затем имеет производные классы SymbolA, SymbolB и т. Д., Каждый из которых реализует конкретный функционал. Для рисования элементов на экране каждый класс реализует некоторую функцию, которая принимает графический объект или аналогичный ему в качестве аргумента и рисует себя в графический объект.

Чтобы представить их в виде «строки», вам нужен линейный набор какого-либо вида, вектор STL или связанный список, скорее всего, связанный список более эффективен, если вы собираетесь переставлять символы с помощью L- Системные производства. После этого вы сможете перебирать список, чтобы отобразить его на экране. Вы попадете в обычную проблему хранения экземпляров различных классов в коллекции, где тип элемента является указателем на базовый класс. Обычно вы можете заставить его работать без слишком большого приведения типов (и всегда использовать dynamic_cast, когда вам это нужно). Если вы правильно спроектировали свой базовый класс, то вызывающий код должен иметь возможность вызывать чисто абстрактные функции в базовом классе, не заботясь о том, с каким конкретным классом символов он фактически взаимодействует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...