我正在制作一个非常抽象的树绘图系统,但是我在将它应该具有的所有绘图功能形式化时遇到了很多麻烦。如果有人能指出我要阅读的关于这个主题的东西,我将非常感激,因为不幸的是我的搜索是徒劳的。
我正在寻找/尝试制作一种用于显示树木的元语言。在这些树中,每个节点都是具有用户定义图形表示的用户定义对象的一个实例。
每个对象都与一个名称、一个图形表示相关联,并且具有有限数量的子代 (0+),这些子代仅知道是对象本身。不允许对象递归。每个对象可能具有用户定义的选项,用于触发将改变其图形表示的条件(以用户定义的方式)。一些选项是自动应用的,其他选项可能需要用户交互(“您希望这个对象是 A 还是 B?”),从而解释了为什么需要实例化对象树。
Object
Name // The Object Name
Childs // List of Object Childs
ContextName // The Name of the Child within this context
Types // List of Objects' names. This child may be only one of them. Decided by the user during instancing.
Options // List of Options assigned to this child. Some of them may require user interaction, and apply other Options to the Child's childs.
*Priority // This is an integer which is used to decide the order in which childs are drawn.
Symbol Name // The Graphical representation of the Object
一旦对象树被实例化,就必须在没有任何成瘾的用户输入的情况下绘制它,这就是我遇到麻烦的地方。对象树的实例化为每个对象分配了一个特定的图形表示(我们称之为符号)。然而,该分配在实例化之前是未知的。不同的对象也可能具有相同的符号,根据对象的选项可能会以不同的方式绘制。
正因为如此,符号必须与对象分开定义,并且必须具有一系列抽象机制,以便能够按照用户指定的规则正确地绘制自己(和他们分配的孩子)。
每个符号由一个图像(或没有图像)加上有限数量的附件表示。附件是符号坐标的相对位置,它告诉绘图代码在哪里绘制对象子项的符号。它们中的每一个都可能具有特定的使用条件(例如,此附件只能由具有特定选项的符号使用,或者如果已经绘制了 N 个符号,则与已绘制的符号没有冲突等)。
该算法必须按照其优先级指定的顺序为每个对象的孩子找到一个免费的附件。如果无法找到子项的附件,则用户可以预先指定允许某些自动重试的规则,但如果它们也失败了,那么整个树的绘制就会失败。其中一些规则允许添加上瘾的子符号和/或将子符号分配给其他孩子(使他们成为 grandChildren)等。
Symbol
Name
Main Image // Image Path, Height, Width
Attachments // List of the attachments, their position, requirements and addictional infos
Fail Rules // List of actions to do if it is not possible to successfully assign each Child to an Attachment
我的主要问题是 Symbol 应该能够访问的变量数量非常多。我将再次提醒的每个符号应该使用这种元语言定义,应该能够访问其子符号的信息(而不是其他符号,以避免死锁和循环引用):例如,用户可能想要高度和宽度一个符号等于所有子符号的高度和宽度之和,或者使用相同的图片,等等。这也是由于用户独立于最终结构编写符号规则的事实造成的。
同时,由于必须从上到下绘制树,因此其中一些信息可能从一开始就无法获得,并且可能需要大量的回溯。
此外,由于所有这些都必须在我必须能够形式化和解析的元语言中定义,我必须定义元语言需要哪些功能以允许语言的最大自由度 -编写用户而不是过于复杂(这是一个模糊的限制,但本质上我不想让 Tikz 作为我的元语言的子集)。然而,我在识别它们时遇到了很多麻烦。
正如我之前所说,我正在寻找有关此类主题和/或完成此类项目的方法的信息。一旦我能够完全完成元语言,我认为我不会有太多麻烦来实现代码来完成所有这些,我的问题大部分是理论上的。