我不明白下一个语法,我也希望(如果可能的话)翻译下一个函数pgfmath
/fct {dup 1 gt {pop 90}{dup 1 neg lt {pop 90 neg}{asin} ifelse} ifelse} def
答案1
以下是如何解释 postscript 代码的说明。这可能不是一个答案,但至少是一个理解它的指南。请记住,postscript 使用远程网络,因此要理解它需要一点反向阅读。
根据Postscript 语言参考手册,执行时使用以下定义ifelse
(通过示例):
a b gt {a} {b} ifelse
- 解释器遇到可执行文件名称
a
并b
依次查找它们。假设两个名称都与数字相关联。执行数字会导致它们被推送到操作数堆栈上。 - (大于)运算
gt
符从堆栈中移除两个操作数并进行比较。如果第一个操作数大于第二个操作数,则推送布尔值true
。否则,推送false
。 - 解释器现在遇到过程对象
{a}
和{b}
,并将其推送到操作数堆栈上。 - 该
ifelse
运算符有三个操作数:一个布尔对象和两个过程。如果布尔对象的值为true
,ifelse
则执行第一个过程;否则,执行第二个过程。在执行所选过程之前,所有三个操作数都会从操作数堆栈中移除。
使用的其他命令是:
dup
: 复制堆栈上的当前对象。因此,<any> dup
取 (或pop
s)<any>
并将其 (或push
es) 替换为<any> <any>
;pop
: 从堆栈中删除顶部元素。因此,<any> pop
删除<any>
;neg
:一个算术运算符,它接受堆栈顶部的一个参数并对其进行求反。所以<num> neg
takes (orpop
s)<num>
andpush
es-<num>
;asin
:反正弦函数。因此,<num> asin
取 (或pop
s)<num>
并push
es 的反正弦<num>
;gt
: 以“大于”方式评估顶部以堆叠元素并返回true
/false
。因此,如果>则<num1> <num2> gt
采用 (或pop
s)<num1> <num2>
和push
es ,否则;true
<num1>
<num2>
false
lt
: 以“小于”方式评估顶部以堆叠元素并返回true
/false
。因此,如果< 则<num1> <num2> lt
取 (或pop
s)<num1> <num2>
和push
es ,否则取 s ;true
<num1>
<num2>
false
def
:将栈顶的值存放在变量中。所以/<var> <any> def
存放<any>
在变量中/<var>
。
因此,可以重写 postscript 代码
/fct {dup 1 gt {pop 90}{dup 1 neg lt {pop 90 neg}{asin} ifelse} ifelse} def
(使用伪代码):
X = top-of-stack
if (X > 1) then
fct = 90
else
if (X < -1) then
fct = -90
else
fct = arcsin(X)
end if
end if
答案2
/fct {dup 1 gt {pop 90}{dup 1 neg lt {pop 90 neg}{asin} ifelse} ifelse} def
是相同的:
sub fct(arg){ # arg in degrees
if (arg > 1) return 90
if (arg < -1) return -90
return asin(arg)
}
sub asin(arg){ # arg in degrees
arg=DegToRad(arg)
return arctan(arg/sqrt(1-arg^2))
}