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
|
% hermitespliknot.mp
% L. Nobre G.
% 2006
input featpost3Dplus2D;
% bash: export TEX=latex
% tcsh: setenv TEX latex
verbatimtex
\documentclass{article}
\usepackage{palatino,mathpazo}
\begin{document}
etex
numeric param;
param = 0.7;
Spread := 39;
f := 1.1*(3,5,4);
vardef Pne( expr pr ) = ( (2*pr-3)*(pr**2)+1 ) enddef;
vardef Pwo( expr pr ) = ( (3-2*pr)*(pr**2) ) enddef;
vardef Tne( expr pr ) = ( pr*(pr*(pr-2)+1) ) enddef;
vardef Two( expr pr ) = ( (pr-1)*(pr**2) ) enddef;
vardef Wei( expr pre, thi, nex ) =
( 0.5*( nex - pre ) )
enddef;
vardef Hermite( expr pr, zer, one, two, thr ) =
( Pne(pr)*one+Pwo(pr)*two+Tne(pr)*Wei(zer,one,two)+Two(pr)*Wei(one,two,thr) )
enddef;
beginfig(1);
color ki[], actpoi, newpoi;
numeric inum, bnum, del, halz, totz, pstep, p, bray;
numeric icen, ap, istart, ifinis, thfac, vhfac;
inum = 12;
bnum = 500;
del = 8;
halz = 1.5;
totz = 3.0;
pstep = 0.002;
bray = 0.05;
icen = 1;
thfac = 3.5;
vhfac = 0.8;
ki0 = (-6,0,0);
ki1 = (-5,0,0);
ki2 = (-1.5-1.5*cosd((180-del)*param)-cosd((180+del)*param),
-sind((180+del)*param)+1.5*sind((180-del)*param),halz);
ki3 = (-1.5-1.5*cosd((180-del)*param),
1.5*sind((180-del)*param),totz);
ki4 = (-1.5-1.5*cosd((180-del)*param)+cosd((180+del)*param),
sind((180+del)*param)+1.5*sind((180-del)*param),halz);
ki5 = (cosd((180-del)*param),sind((180-del)*param),0);
ki6 = (0,0,0);
ki7 = (-cosd((180-del)*param),-sind((180-del)*param),0);
ki8 = (1.5+1.5*cosd((180-del)*param)-cosd((180+del)*param),
-sind((180+del)*param)+1.5*sind((180-del)*param),halz);
ki9 = (1.5+1.5*cosd((180-del)*param),
1.5*sind((180-del)*param),totz);
ki10= (1.5+1.5*cosd((180-del)*param)+cosd((180+del)*param),
sind((180+del)*param)+1.5*sind((180-del)*param),halz);
ki11= (5,0,0);
ki12= (6,0,0);
istart = icen;
ifinis = icen+1;
ap := 0;
forever:
ap := ap+pstep;
actpoi := Hermite(ap,ki[istart-1],ki[istart],ki[ifinis],ki[ifinis+1]);
exitif conorm(actpoi-ki[istart])>bray;
endfor;
getready("signalvertex("
& cstr(actpoi)
& "," & decimal(thfac)
& ",(0,0,0));signalvertex("
& cstr(actpoi)
& "," & decimal(thfac*vhfac)
& ",(1,1,1));", actpoi);
p = 1;
forever:
ap := ap+pstep;
if ap>1:
ap := ap-1;
istart := ifinis;
ifinis := istart+1;
fi;
exitif (ifinis>inum-1) or (p>bnum);
newpoi := Hermite(ap,ki[istart-1],ki[istart],ki[ifinis],ki[ifinis+1]);
if conorm(newpoi-actpoi)>2*bray:
actpoi := newpoi;
getready("signalvertex("
& cstr(actpoi)
& "," & decimal(thfac)
& ",(0,0,0));signalvertex("
& cstr(actpoi)
& "," & decimal(thfac*vhfac)
& ",(1,1,1));", actpoi);
p := incr( p );
fi;
endfor;
doitnow;
% for p=0 upto inum:
% dotlabel.top( decimal(p), rp(ki[p]) );
% endfor;
% produce_auto_scale;
endfig;
verbatimtex
\end{document}
etex
end;
|