我正在尝试设计用于在C ++中实现L-System重写引擎的数据结构,而我似乎无处可去:(。
我需要存储一串符号(字符)。有几种类型的符号(由LSystem的字母表指定)。假设我们有类型“A”,“B”,“C”。现在每种类型的符号都可以有不同的参数。例如,类型A的符号将具有一些距离,符号B将具有角度。 C符号没有参数。然后字符串看起来像“ABABC”。
然后我需要遍历字符串并执行一些也连接到每种符号类型的操作。 “A”可能意味着“绘制'距离'长度线”(距离是A的参数),B“转'角'度'和C完成绘画。
我尝试为每个符号类型(类SymbolA,类SymbolB,类SymbolC)设置类Symbol和子项,但我不知道如何创建字符串。我想避免使用类型转换和类似的东西。
是否有人有类似的问题或有想法可以帮助我,拜托?
答案 0 :(得分:1)
如果你想实现像完整的L系统一样复杂的东西,我建议使用比C ++更高级的语言,比如Python或Common Lisp。然后,您可以分析整个代码段并在C / C ++中实现速度瓶颈。
我很久以前使用Common Lisp实现了混沌理论和分形课程的L系统。这不是太难做 - 只是使用了一个符号列表。我一直试图找到它的代码,但它已经超过7年,所以到目前为止没有运气。
无论如何,这对我来说似乎更合理。即使您使用高级语言进行缓慢的实现,它也会让您更好地了解如何在C ++中实现它,这需要更多的开发人员时间来完成。
答案 1 :(得分:0)
在我看来,你是在正确的轨道上:你需要一个SymbolBase类,为需要实现的操作类型定义纯虚函数,然后使用SymbolA,SymbolB等派生类,每个类实现具体功能。为了将元素绘制到屏幕上,每个类都会实现一些函数,该函数将图形对象或类似物作为参数并将其自身绘制到图形对象。
为了在'字符串'中表示这些,您需要某种线性集合,STL向量或链表最有可能,如果您要使用L-重新排列符号,则链表更有效系统制作。然后,您将能够遍历列表以在屏幕上显示它。您将遇到在集合中保存各种类的实例的常见问题,其中元素类型是指向基类的指针。您通常可以在没有太多类型转换的情况下使其工作(并且在您需要时始终使用dynamic_cast)。如果你正确地设计了你的基类,那么调用代码应该能够在基类中调用纯抽象函数,而无需关心它实际与之交互的特定符号类。