blob: 560d027a8078b9d913e5c670297ecb7efc3937b9 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
%% $Id: pst-bezier.pro 87 2009-01-29 10:37:06Z herbert $
%% PostScript prologue for pstricks-add.tex.
%%
%% Version 0.01, 2009/01/29
%%
%% For distribution, see pst-bezier.tex.
%%
%%
tx@Dict begin
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Auxiliary routines:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% [x1 y1] [x2 y2] -> [ x1+y1 x2+y2 ]
/AddArrays2d {
[ 3 1 roll %% Get the operands
2 copy
0 get exch
0 get add %% first component finished
%% second component:
3 1 roll
1 get exch
1 get add ]} bind def
%% [x1 y1] [x2 y2] -> [ x1-x2 y1-y2 ]
/SubArrays2d {
[ 3 1 roll exch
2 copy
0 get exch 0 get sub
3 1 roll
1 get exch
1 get sub ] } bind def
%% [x y] s -> [s*x s*y]
/ScaleArray2d {
[ 3 1 roll exch
2 copy
0 get mul
3 1 roll
1 get mul
] } bind def
%% << [Array of Bezier splines] /K 1 >> -> empty stack
%% Thereby, a Bezier spline is described by an array:
%% [x0 y0 x1 y1 x2 y2 x3 y3 sl sr]
%% (x0,y0) is the right control point
/pstBCurve {
begin %% LaTeX provides the dictionary (see above comments)
1 1 Splines length 1 sub {
/K exch def % K is the index of the spline.
%%
%% First control point:
Splines K get 0 get dup %% switch the cases /n and /s...
/n eq { %% `not specified' -> automatically computed
Splines K get 0 %% l(k) is going to be set...
%% | -> p(k-1)+(p(k)-p(k-2))*sl(k)
Splines K get 4 2 getinterval
Splines K 2 sub get 4 2 getinterval
SubArrays2d
Splines K get 6 get ScaleArray2d
Splines K 1 sub get 4 2 getinterval
AddArrays2d
putinterval %% ...setting l(k)
} if
/s eq { %% `symmetric' -> compute from r(k-1)
Splines K get 0 %% l(k):=
%% | -> 2*p(k-1)-r(k-1)
Splines K 1 sub get 4 2 getinterval 2 ScaleArray2d
Splines K 1 sub get 2 2 getinterval SubArrays2d
putinterval %%
} if
%% Second control point:
Splines K get 2 get dup %% (cases /n and /s)
/n eq { %% `not specified' -> automatically computed
Splines K get 2
%% | -> p(k)+(p(k+1)-p(k-1))*sr(k)
Splines K 1 sub get 4 2 getinterval
Splines K 1 add get 4 2 getinterval
SubArrays2d
Splines K get 7 get ScaleArray2d
Splines K get 4 2 getinterval
AddArrays2d
putinterval
} if
/s eq { %% `symmetric' -> compute from l(k+1)
Splines K get 2
%% | -> 2*p(k)-l(k+1)
Splines K get 4 2 getinterval 2 ScaleArray2d
Splines K 1 add get 0 2 getinterval SubArrays2d
putinterval
} if
} for %% all splines.
%%
%% The current point is already correctly set by the LaTeX macro.
%% So get ride of the 0th dummy spline.
Splines 1 Splines length 1 sub getinterval {%
aload pop pop pop %% get ride of the array itself and the scaling factor.
curveto% now the actual spline is on the stack...
} forall %% splines.
/Points [ %% now save the points for the showpoints-feature.
Splines 0 get 4 2 getinterval aload pop
Splines 1 Splines length 1 sub getinterval { aload pop pop pop } forall
]
end def %% Put points in the top dictionary
} bind def
end %% tx@Dict
|