summaryrefslogtreecommitdiff
path: root/graphics/MF-PS/roex/roexsamp/ro-06.mf
blob: 7007cd233b23abc1fba662e41404bcf4ef8be7b5 (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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
%%%%
%%%% This file belongs to the ROEX package.
%%%%
%%% draw write_preamble write_postamble find_BB set_BB fill_C draw_C
%%% draw fix_fill_cmyk fix_draw_cmyk
%%% draw fix_line_join fix_line_cap fix_line_width
% RO-06.MF, ``EL PALO ALTO TREE'':
%  A tough example (see remarks below) excerpted from The \MF{}book, pages
%  124 thru 126.
%% % an innocent formatting trick: the underscore character ending a name
%% % will be typeset as an superscript asterisk
%% \let\oriunderscore\_
%% \newif\ifbgroupopen \bgroupopenfalse
%% \def\altdblbackslash#1{\bgroup\bgroupopentrue\it#1}
%% \def\optegroup{\ifbgroupopen\egroup\fi}
%% \def\underscoreasasterisk#1{%
%%   \ifx#1\relax\optegroup^*\else\oriunderscore#1\fi}
%% \def\\#1{%
%%   \let\_\underscoreasasterisk
%%   \altdblbackslash{#1\relax}\optegroup
%%   \let\_\oriunderscore}
% ---
input mftoeps; eps_mode_setup; input roex; tracingremoving:=1;
% ---
% REMARKS:
% 1. There arise very close points during the intersecting process,
%    hence |epsil.dist| is adjusted (see also point 2).
% 2. Note that:
%    a) |turningnumber(branch1)=1| but |turningnumber(reverse branch1)=0|
%       (sic!);
%    b) for the second resulting path, |R2| (the tree), |turningnumber(R2)=1|
%       while |check_turn(R2)=-1|, which is the desired value as the tree
%       is unfilled (oh, these tiny loops!);
%    c) the minimal resulting interval, i.e., the time distance
%       between two neighbouring points of intersection is dangerously
%       small, namely, |0.00032|; usually the value smaller than the bound,
%       by default equal to |0.01|, portends a collaps of the algorithm,
%       fortunately not in this case (set |tracingremoving:=2| for more
%       information on intervals and secants).
epsil.dist:=1/50pt;
% show_turningnumbers_and_turn_checks:=1;
% mark_trunk_close_points:=1;
% ---
beginchar ("0",1/2in#,5/4in#,0);
 path branch[\\], oval;
%
% prepare data:
 branch0 = % i.e., trunk
  (0,660)---(-12,70)..{curl 5}(-28,-8)
  & flex((-28,-8),(-16,-4),(-10,-11))
  & flex((-10,-11),(0,-5),(14,-10))
  & flex((14,-10),(20,-6),(29,-11))
  & (29,-11){curl 4}..(10,100)---cycle;
 branch1= flex((0,660),(-9,633),(-22,610))
  & flex((-22,610),(-3,622),(17,617))
  & flex((17,617),(7,637),(0,660)) & cycle;
 branch2=flex((30,570),(10,590),(-1,616))
  & flex((-1,616),(-11,592),(-29,576),(-32,562))
  & flex((-32,562),(-10,577),(30,570)) & cycle;
 branch3=flex((-1,570),(-17,550),(-40,535))
  & flex((-40,535),(-45,510),(-60,477))
  & flex((-60,477),(-20,510),(40,512))
  & flex((40,512),(31,532),(8,550),(-1,570)) & cycle;
 branch4=flex((0,509),(-14,492),(-32,481))
  & flex((-32,481),(-42,455),(-62,430))
  & flex((-62,430),(-20,450),(42,448))
  & flex((42,448),(38,465),(4,493),(0,509)) & cycle;
 branch5=flex((-22,470),(-23,435),(-44,410))
  & flex((-44,410),(-10,421),(35,420))
  & flex((35,420),(15,455),(-22,470)) & cycle;
 branch6=flex((18,375),(9,396),(5,420))
  & flex((5,420),(-5,410),(-50,375),(-50,350))
  & flex((-50,350),(-25,375),(18,375)) & cycle;
 branch7=flex((0,400),(-13,373),(-30,350))
  & flex((-30,350),(0,358),(30,350))
  & flex((30,350),(13,373),(0,400)) & cycle;
 branch8=flex((50,275),(45,310),(3,360))
  & flex((3,360),(-20,330),(-70,300),(-100,266))
  & flex((-100,266),(-75,278),(-60,266))
  & flex((-60,266),(0,310),(50,275)) & cycle;
 branch9=flex((10,333),(-15,290),(-43,256))
  & flex((-43,256),(8,262),(58,245))
  & flex((58,245),(34,275),(10,333)) & cycle;
 branch10=flex((8,262),(-21,249),(-55,240))
  & flex((-55,240),(-51,232),(-53,220))
  & flex((-53,220),(-28,229),(27,235))
  & flex((27,235),(16,246),(8,262)) & cycle;
 branch11=flex((0,250),(-25,220),(-70,195))
  & flex((-70,195),(-78,180),(-90,170))
  & flex((-90,170),(-5,188),(74,183))
  & flex((74,183),(34,214),(0,250)) & cycle;
 branch12=flex((8,215),(-35,175),(-72,155))
  & flex((-72,155),(-75,130),(-92,110),(-95,88))
  & flex((-95,88),(-65,117),(-54,104))
  & flex((-54,104),(10,151),(35,142))
  ..flex((42,130),(60,123),(76,124))
  & flex((76,124),(62,146),(26,180),(8,215)) & cycle;
%
 for i:=0 upto 12:
  branch[i]:=neg_turn branch[i] shifted (150,50) scaled (w/300);
 endfor
 oval=superellipse((w,1/2h),(1/2w,h),(0,1/2h),(1/2w,0),4/5);
%
% remove overlaps and (optionally) show |turningnumber|s and |turn_check|s:
 remove_overlap (make_list(0,12)branch,oval)() R;
 if known show_turningnumbers_and_turn_checks:
  begingroup
   interim autorounding:=0;
   show (turningnumber(branch1), turningnumber(reverse branch1));
   for i:=1 upto R.num: show i,(turningnumber R[i],check_turn R[i]); endfor;
  endgroup;
 fi
%
% begin export to EPS:
 find_BB oval;
 write_preamble jobname;
 fix_line_join 1; fix_line_cap 1;
 fix_line_width 1/50pt;
% paint the picture:
 fix_fill_cmyk 0,0,0,1/6;
 fill_C make_list(1,R.num)R;
 for i:=1 upto R.num:
  if proofing=0:
   fix_draw_cmyk if check_turn(R[i])>0: 0,1,1,0 else: 1,1,0,0 fi; 
   draw_C R[i];
  else:
   for j:=0 upto length(R[i])-1:
    makelabel(decimal(j) & "/" & decimal(i),point j of R[i]);
   endfor
  fi
 endfor
%
% mark (optionally) dangerously close points:
 if known mark_trunk_close_points:
  fix_fill_cmyk 0,0,0,1; fix_draw_cmyk 0,0,0,1;
  for j:=13,14,17,18:
   z[j]=point TIME_1tim[j] of PATH_1;
   fill_C fullcircle scaled 1/50pt shifted z[j];
  endfor
  z.a=(1pt,0); z.b=(1/20pt,0); z.c=(1/5pt,1/10pt); z.d=(1/5pt,-1/10pt);
  for zz:=1/2[z13,z14],1/2[z17,z18]:
   draw_C (zz-z.a)--(zz-z.b), (zz-z.c)--(zz-z.b)--(zz-z.d);
  endfor
 fi
% end export to EPS:
 write_postamble;
endchar;
end.
%%\end