【问题标题】:Designing L-System data structures (C++)设计 L 系统数据结构 (C++)
【发布时间】:2023-03-17 19:00:01
【问题描述】:

我正在尝试为 C++ 中的 L-System 重写引擎的实现设计数据结构,但我似乎无处可去 :(.

我需要存储一串符号(字符)。有几种类型的符号(由 LSystem 的字母表指定)。假设我们有类型“A”、“B”、“C”。现在每种类型的符号都可以有不同的参数。例如,类型 A 的符号将具有一定的距离,而符号 B 将具有角度。 C 符号没有参数。该字符串可能看起来像“ABAC”。

然后我需要遍历字符串并执行一些也与每种类型的符号相关的操作。 “A”可以表示“画‘距离’长度的线”(距离是A的参数),B“转‘角度’度数”,C画完。

我尝试为每个符号类型(SymbolA 类、SymbolB 类、SymbolC 类)创建一个符号类和一个子类,但我不知道如何创建字符串。我想避免类型转换和类似的东西。

请问有遇到类似问题或有想法的人可以帮助我吗?

【问题讨论】:

  • 只使用固定长度的线段和直角,您可以使用 L 系统做很多事情。就此而言,您只需 L 即可左转。为此使用std::string。获得 C 曲线或龙曲线运行。或者一些希尔伯特曲线。
  • 感谢您的建议!它让我放弃了旧的设计并重新开始(现在我发现之前的想法非常疯狂)。这些符号毕竟不需要那些参数,这让我可以使用 std::string,就像你说的:)。再次感谢,终于有了一些进展!

标签: c++ data-structures l-systems


【解决方案1】:

如果您想实现像完整的 L 系统这样复杂的东西,我建议使用比 C++ 更高级的语言,例如 Python 或 Common Lisp。然后你可以分析整段代码并在 C/C++ 中实现速度瓶颈。

很久以前,我在混沌理论和分形的课程中使用 Common Lisp 实现了 L 系统。做起来并不难——只是使用了一个符号列表。我一直在努力寻找它的代码,但是已经7年多了,所以到目前为止还没有运气。

无论如何,这对我来说似乎是一种更合理的方法。即使您使用高级语言进行缓慢的实现,它也会让您更好地了解如何在 C++ 中实现它,这需要更多的开发人员时间来完成。

【讨论】:

  • 我肯定会更上一层楼。您需要维护 2 个不同的映射(symbol->expansion、symbol->graphics_command)并以受控方式应用它们。从某种意义上说,类太“具体”了,异构容器真的很有用。
【解决方案2】:

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

为了在“字符串”中表示这些,您最有可能需要某种线性集合、STL 向量或链表,如果您要使用 L- 重新排列符号,链表会更有效系统制作。然后,您将能够遍历列表以将其显示在屏幕上。您将遇到在集合中保存各种类的实例的常见问题,其中元素类型是指向基类的指针。您通常可以在没有太多类型转换的情况下使其工作(并且在需要时始终使用 dynamic_cast)。如果您正确设计了基类,那么调用代码应该能够调用基类中的纯抽象函数,而无需关心它实际与哪个特定符号类进行交互。

【讨论】:

    猜你喜欢
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 2022-08-20
    • 2016-03-03
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    相关资源
    最近更新 更多