Graph 简单二维图形绘制-PostScript

Graph 简单二维图形绘制-PostScript,graph,postscript,Graph,Postscript,你能告诉我一个用PS格式绘制图形(2+x,sin(x),cos(x+3)/3…)的简单方法吗 例如,我想用以下值绘制f(x)=2+x: Table of values: Value of X = -5 | -4 | -3 | -2 | -1 | -0 | 1 ..... Value of Y = -3 | -2 | -1 | 0 | 1 | 2 | 3 ..... 怎么画这个图?绘制直线、绘制多边形或使用曲线命令? 您认为什么是最好的解决方案?有许多不同的方法可以做到这一点。如果要绘制

你能告诉我一个用PS格式绘制
图形(2+x,sin(x),cos(x+3)/3…)
的简单方法吗

例如,我想用以下值绘制
f(x)=2+x

Table of values: 
Value of X = -5 | -4 | -3 | -2 | -1 | -0 | 1 .....
Value of Y = -3 | -2 | -1 |  0 |  1 |  2 | 3 .....
怎么画这个图?绘制直线、绘制多边形或使用曲线命令?
您认为什么是最好的解决方案?

有许多不同的方法可以做到这一点。如果要绘制一组坐标,可以将它们放入数组中,并在遍历数组时绘制点

/XValues [ -5 -4 -3 -2 -1 0 1 ] def  % eg. XValues 0 get ==> -5
/YValues [ -3 -2 -1  0  1 2 3 ] def  %     YValues 0 get ==> -3

XValues 0 get YValues 0 get % X[0] Y[0]
moveto                      % move to first point
1 1 XValues length 1 sub {  % i    push integer i = 1 .. length(XValues)-1 on each iteration
    XValues                 % i XVal    push X array
    1 index                 % i XVal i  copy i from stack
    get                     % i x       get ith X value from array
    YValues                 % i x YVal
    2 index                 % i x YVal i  i is 1 position deeper now, so 2 index instead of 1
    get                     % i x y
    lineto                  % i    line to next point
    pop                     %      discard index variable
} for
当然,在Postscript中,原点默认位于左下角,72点表示一英寸。所以这些值(-5,-4,-2等)甚至不可见。因此,您通常希望从平移到要绘制图形的中心开始

/Center { 300 400 } def  % roughly the middle of US letter-size paper
Center translate
然后,要缩放坐标系,以便图形特征可见。Scalefactor=DesiredSize/ExistingSize

您可以扫描数据集以查找现有大小

但是当你画线的时候有个障碍。绘制的线的宽度也取决于当前坐标空间,因此,如果将空间放大一个较大的因子,线将变得非常宽。您可以在描述路径之后但在调用笔划之前取消缩放回正常空间。或者,在缩放的同时固定线宽

因为我们知道线宽增加了多少(这是相同的比例因子),所以我们可以反向调整线宽图形参数

1                       %                   push 1 for division
6 72 mul DataSize div   % 1 scalefactor     6*72/(Xmax-Xmin)
dup dup                 % 1 scalefactor scalefactor scalefactor
scale                   % 1 scalefactor
div                     % 1/scalefactor
currentlinewidth mul setlinewidth  %        adjust line width
现在,因为这是一个函数图,我们实际上不需要值表。我们可以通过计算函数来动态计算值

/func { 3 add cos 3 div } def  % f(x) = cos(3+x)/3    define function y=f(x)

/Xini -5 def              % named loop control parameters
/Xfin 1 def
/Xstep 1 def
Xini dup dup func moveto  % moveto first point
Xstep add Xstep Xfin {    % x
    dup                   % x x
    func                  % x f(x)
    lineto                % line to next point
} for
stroke

最后,如果可以求函数的导数(创建一个函数,计算原始函数在每个点的斜率),然后,您可以使用绘制包含多个曲线段而不是直线的图形。

我的答案显示了为可微函数绘制分段贝塞尔插值的方法。您是否考虑过使用Metapost或渐近线为您生成postscript代码?
/func { 3 add cos 3 div } def  % f(x) = cos(3+x)/3    define function y=f(x)

/Xini -5 def              % named loop control parameters
/Xfin 1 def
/Xstep 1 def
Xini dup dup func moveto  % moveto first point
Xstep add Xstep Xfin {    % x
    dup                   % x x
    func                  % x f(x)
    lineto                % line to next point
} for
stroke