我在编写编译器课程的后记之上编写了一种高级语言,并且我想创建两个函数:concatenate和union,它们应采用两条路径并将它们连接在一起。通过将第一个路径的终点连接到第二个路径的起点来进行串联。 Union Works不连接端点。
玩了一段时间之后,我设法自动执行了这些操作。在某些情况下,我得到了预期的结果,但在其他情况下却没有。我将给出解决方案的具体示例以及失败的地方。
工作方式: 如果我想采用两条路径,一条路径是一条弧线,另一条路径是通过连接三个点,则可以采用以下基本路径:
newpath 100 200 70 0 45 arc %create an arc path
newpath 100 100 moveto 200 200 lineto 200 300 lineto %create a polygon
并通过让我的编译器编写代码来连接它们(在圆弧的端点到直线的起点之间创建一条线):
newpath 100 100 moveto 200 200 lineto 200 300 lineto reversepath currentpoint newpath %stores the startpoint of the polygon to be used later
newpath 100 200 70 0 45 arc % creates the arc
lineto %takes the saved information about start of the polygon and creates a line to it
100 100 moveto 200 200 lineto 200 300 lineto %finishes by adding the polygon to the path
仍然丢失:
我正在处理用于创建那些路径的原始字符串,但是如果用户已经为路径创建了绑定,并且现在我想加入它们,该如何进行操作。例如,假设用户创建了绑定:
/p1 { newpath 100 200 70 0 45 arc } bind def
/p2 { newpath 100 100 moveto 200 200 lineto 200 300 lineto } bind def
如何在不修改绑定的情况下继续按需加入这两个路径?
我尝试了
p1 uappend p2
,但是没有用。看了很多天,我也找不到任何帮助。
谢谢
答案 0 :(得分:2)
您可以加载函数的定义,然后查看可执行数组的内容。
/p1 load {==} forall
将向您显示外观。或者,您可以定义每个路径运算符的版本,以存储其操作数并仅执行过程。
/moveto {....} def
/lineto {....} def
...
...
p1 p2
通常,对于编程问题,有多种可能的解决方案。
答案 1 :(得分:0)
您可以很容易地加入两个过程,因为它们只是数组。
% [a] [b] join [ab]
/join { 2 array astore [ exch {{}forall}forall ] } def
/p1p2 //p1 //p2 join cvx def
但是,我重复我的评论:您应该删除newpath
,因为它正在妨碍您。在PostScript编程中几乎不需要它。它具有硬重置的副作用,通常在所有功能中都不是一件好事。它以某种方式进入了教程,因此每个人都可以这样做,但是它并没有做任何有用的IME。
p1 uappend p2
此代码建议使用“中缀思维”,因此我们首先应将其更正为
p1 p2 uappend
但是 uappend
对用户路径对象进行操作,因此您需要找到一个采用当前路径的运算符并返回一个用户路径对象。