从 postscript 到 pgfmath

从 postscript 到 pgfmath

我不明白下一个语法,我也希望(如果可能的话)翻译下一个函数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
  1. 解释器遇到可执行文件名称ab依次查找它们。假设两个名称都与数字相关联。执行数字会导致它们被推送到操作数堆栈上。
  2. (大于)运算gt符从堆栈中移除两个操作数并进行比较。如果第一个操作数大于第二个操作数,则推送布尔值true。否则,推送false
  3. 解释器现在遇到过程对象{a}{b},并将其推送到操作数堆栈上。
  4. ifelse运算符有三个操作数:一个布尔对象和两个过程。如果布尔对象的值为trueifelse则执行第一个过程;否则,执行第二个过程。在执行所选过程之前,所有三个操作数都会从操作数堆栈中移除。

使用的其他命令是:

  • dup: 复制堆栈上的当前对象。因此,<any> dup取 (或pops)<any>并将其 (或pushes) 替换为<any> <any>;
  • pop: 从堆栈中删除顶部元素。因此,<any> pop删除<any>
  • neg:一个算术运算符,它接受堆栈顶部的一个参数并对其进行求反。所以<num> negtakes (or pops) <num>and pushes -<num>;
  • asin:反正弦函数。因此,<num> asin取 (或pops)<num>pushes 的反正弦<num>
  • gt: 以“大于”方式评估顶部以堆叠元素并返回true/ false。因此,如果>则<num1> <num2> gt采用 (或pops)<num1> <num2>pushes ,否则;true<num1><num2>false
  • lt: 以“小于”方式评估顶部以堆叠元素并返回true/ false。因此,如果< 则<num1> <num2> lt取 (或pops)<num1> <num2>pushes ,否则取 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)) 
}

相关内容