后记合并两条路径
postscript merge two paths
我正在为我的编译器课程在 postscript 之上制作一种高级语言,我想创建两个函数:concatenate 和 union,它们应该采用两条路径并将它们连接起来。 Concatenate 通过将第一条路径的终点连接到第二条路径的起点来工作。联盟作品不连接端点。
玩了一段时间后,我成功地自动执行了那些操作。在某些情况下我得到了预期的结果,但在其他情况下却没有。我将给出我的解决方案的具体示例,以及它们失败的地方。
正在工作:
如果我想走两条路,一条是弧线,一条是连接三个点,我可以走以下基本路径:
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
,但没有用。我找了很多天也找不到帮助。
谢谢
您可以加载函数的定义,然后查看可执行数组的内容。
/p1 load {==} forall
将向您展示它的外观。或者您可以定义每个存储其操作数的路径运算符的版本并只执行过程。
/moveto {....} def
/lineto {....} def
...
...
p1 p2
像往常一样,一个编程问题有多种可能的解决方案。
您可以很容易地连接两个过程,因为它们只是数组。
% [a] [b] join [ab]
/join { 2 array astore [ exch {{}forall}forall ] } def
/p1p2 //p1 //p2 join cvx def
但是,我重复我的评论:您应该删除 newpath
,因为它只会妨碍您。在 PostScript 编程中几乎不需要它。它会产生硬重置的副作用,这在您的所有功能中通常都不是一件好事。它以某种方式进入教程,所以每个人都这样做,但它没有做任何有用的 IME。
p1 uappend p2
此代码建议 "infix thinking" 因此,作为第一步,我们应该将其更正为
p1 p2 uappend
但是 uappend
在 用户路径对象上运行 所以你需要找到一个运算符,它采用 当前路径和returns一个用户路径对象.
我正在为我的编译器课程在 postscript 之上制作一种高级语言,我想创建两个函数:concatenate 和 union,它们应该采用两条路径并将它们连接起来。 Concatenate 通过将第一条路径的终点连接到第二条路径的起点来工作。联盟作品不连接端点。
玩了一段时间后,我成功地自动执行了那些操作。在某些情况下我得到了预期的结果,但在其他情况下却没有。我将给出我的解决方案的具体示例,以及它们失败的地方。
正在工作: 如果我想走两条路,一条是弧线,一条是连接三个点,我可以走以下基本路径:
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
,但没有用。我找了很多天也找不到帮助。
谢谢
您可以加载函数的定义,然后查看可执行数组的内容。
/p1 load {==} forall
将向您展示它的外观。或者您可以定义每个存储其操作数的路径运算符的版本并只执行过程。
/moveto {....} def
/lineto {....} def
...
...
p1 p2
像往常一样,一个编程问题有多种可能的解决方案。
您可以很容易地连接两个过程,因为它们只是数组。
% [a] [b] join [ab]
/join { 2 array astore [ exch {{}forall}forall ] } def
/p1p2 //p1 //p2 join cvx def
但是,我重复我的评论:您应该删除 newpath
,因为它只会妨碍您。在 PostScript 编程中几乎不需要它。它会产生硬重置的副作用,这在您的所有功能中通常都不是一件好事。它以某种方式进入教程,所以每个人都这样做,但它没有做任何有用的 IME。
p1 uappend p2
此代码建议 "infix thinking" 因此,作为第一步,我们应该将其更正为
p1 p2 uappend
但是 uappend
在 用户路径对象上运行 所以你需要找到一个运算符,它采用 当前路径和returns一个用户路径对象.