pretzel.sa
Generated by gen_html_sa_files from ICSI. Contact gomes@icsi.berkeley.edu for details
class PRETZEL_CNV
class PRETZEL_CNV is
Pretzel2Knot(s:STR, inout knot:KNOT):BOOL is
j::=s.search("endcode"); if (0<j).not then return false; end;
return Pretzel2Knot(#WORD(s.substring(0,j)).w, inout knot);
end;
Pretzel2Knot(a:ARRAY{INT}, inout knot:KNOT):BOOL is
-- Pretzel P(a0,a1,...)
knot:=KNOT::NoCompo0;
d::=16; d2::=d*2; -- width
r,l,t_footer:KNOT;
r:=KNOT::trivial0.append(KNOT::trivial0);
r.CodeIn(0,0,1); r.CodeIn(d,-d,VERTEXC::cross_under,2); r.CodeIn(d2,-d2,3);
r.CodeIn(d2,0,6); r.CodeIn(d,-d,VERTEXC::cross_over,7); r.CodeIn(0,-d2,8);
l:=r.clone; l.mirrorZ;
t_footer:=KNOT::trivial0;;
t_footer.CodeIn(0,0,1); t_footer.CodeIn(0,0,2);
max_t::=0; loop max_t:=max_t.max(a.elt!.abs); end;
-- twist
loop i::=a.ind!; t::=a.elt!;
c:KNOT; if t>0 then c:=r.clone; elsif t<0 then c:=l.clone; t:=-t; end;
twist::=KNOT::NoCompo0; loop t.times!; twist:=twist.append(c.clone); c.Shift(0,-d*2); end;
if t<max_t then
t_footer[1]:=#(0,-d2*t); t_footer[2]:=#(0,-d2*max_t);
twist:=twist.append(t_footer.clone);
t_footer[1]:=#(d2,-d2*t); t_footer[2]:=#(d2,-d2*max_t);
twist:=twist.append(t_footer.clone);
end;
twist.Shift(d*4*i,0);
knot:=knot.append(twist);
end;
-- header/footer
t_footer:=KNOT::trivial0;;
t_footer.CodeIn(0,0,1); t_footer.CodeIn(0,d,2);
t_footer.CodeIn(d2*(a.size*2-1),d,3); t_footer.CodeIn(d2*(a.size*2-1),0,4);
knot:=knot.append(t_footer);
--
t_footer:=KNOT::trivial0;;
t_footer.CodeIn(0,-max_t*d2,1); t_footer.CodeIn(0,-max_t*d2-d,2);
t_footer.CodeIn(d*(a.size*4-2),-max_t*d2-d,3); t_footer.CodeIn(d*(a.size*4-2),-max_t*d2,4);
knot:=knot.append(t_footer);
--
loop i::=1.upto!(a.size-1);
t_footer:=KNOT::trivial0;
t_footer.CodeIn(d*(i*4-2),0,1); t_footer.CodeIn(d*i*4,0,2);
knot:=knot.append(t_footer);
end;
--
loop i::=1.upto!(a.size-1);
t_footer:=KNOT::trivial0;
t_footer.CodeIn(d*(i*4-2),-d2*max_t,1); t_footer.CodeIn(d*i*4,-d2*max_t,2);
knot:=knot.append(t_footer);
end;
--
knot.Shift(d2,-d2); knot.concat;
return true;
end;
end;