设计L-System数据结构(C++)

4
我正在尝试在C++中设计L-System重写引擎的数据结构,但我似乎无法取得进展 :(。
我需要存储一串符号(字符)。有几种类型的符号(由LSystem的字母表指定)。假设我们有类型“A”,“B”,“C”。现在每种类型的符号可以有不同的参数。例如,类型A的符号将具有某个距离,而符号B具有一个角度。C符号没有参数。然后,字符串可能看起来像“ABABC”。
然后我需要迭代字符串并执行与每种类型的符号相关联的一些操作。“A”可以意味着“绘制长度为'distance'的线条”(distance是A的参数),B“向左或向右转动“angle'度”,C表示结束绘画。
我尝试拥有Symbol类和每个符号类型的子类(SymbolA类,SymbolB类,SymbolC类),但我不知道如何创建字符串。我想避免类型转换等事情。
是否有人遇到过类似的问题或有想法可以帮助我?

你可以使用固定长度的线段和直角来完成许多L系统相关的操作。事实上,你只需要使用L表示向左转即可。可以使用std::string来实现。尝试绘制C曲线、龙形曲线或希尔伯特曲线。 - Cheers and hth. - Alf
谢谢你的建议!它让我放弃了旧设计,重新开始(现在我看到之前的想法相当疯狂)。这些符号毕竟不需要那些参数,这让我可以像你说的那样使用std::string :). 再次感谢,终于有了一些进展! - terrible_software_designer
2个回答

1
如果你想要实现像完整的L-系统这样复杂的东西,我建议使用比C++更高级的语言,例如Python或Common Lisp。然后你可以对整个代码进行分析,并在C/C++中实现速度瓶颈。
我很久以前就为混沌理论和分形课程实现了L-系统,使用的是Common Lisp。做起来并不太难 - 只需要使用符号列表。我一直在试图找到它的代码,但已经过去7年了,所以迄今为止没有成功。
总之,这对我来说似乎是一个更合理的方法。即使你在高级语言中进行了缓慢的实现,它也会给你更好的实现它在C++中的思路,而这需要更多的开发时间。

我肯定会在这方面更高级一些。你需要维护两个不同的映射(符号->扩展,符号->图形命令)并以受控制的方式应用它们。从某种意义上说,类太“具体”了,而异构容器确实非常有用。 - luser droog

0

看起来你走在了正确的轨道上:你需要一个SymbolBase类,它定义了需要实现的纯虚函数类型,然后有SymbolA、SymbolB等派生类,每个类都实现了特定的功能。为了将元素绘制到屏幕上,每个类都会实现一些函数,该函数以图形对象或类似对象作为参数,并将自己绘制到该图形对象上。

为了在“字符串”中表示这些内容,你需要一种线性集合,最可能是STL向量或链表,如果你要使用L系统生成规则重新排列符号,则链表更有效率。然后,你将能够迭代整个列表以便在屏幕上显示它。你将遇到通常的问题,即在集合中持有各种类的实例,其中元素类型是指向基类的指针。你通常可以在不需要太多类型转换的情况下使其正常工作(并且总是在需要时使用dynamic_cast)。如果你正确设计了基类,那么调用代码应该能够调用基类中的纯抽象函数,而不必关心它实际上正在与哪个特定的符号类交互。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接