diff options
Diffstat (limited to 'appl/math/polyhedra.b')
| -rw-r--r-- | appl/math/polyhedra.b | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/appl/math/polyhedra.b b/appl/math/polyhedra.b new file mode 100644 index 00000000..e7a51d6c --- /dev/null +++ b/appl/math/polyhedra.b @@ -0,0 +1,195 @@ +implement Polyhedra; + +include "sys.m"; + sys: Sys; +include "bufio.m"; + bufio: Bufio; + Iobuf: import bufio; +include "math/polyhedra.m"; + +scanpolyhedra(f: string): (int, ref Polyhedron, ref Iobuf) +{ + first, last: ref Polyhedron; + D: int; + + if(sys == nil) + sys = load Sys Sys->PATH; + if(bufio == nil) + bufio = load Bufio Bufio->PATH; + b := bufio->open(f, Sys->OREAD); + if(b == nil) + return (0, nil, nil); + n := 0; + for(;;){ + s := getstring(b); + if(s == nil) + break; + n++; + p := ref Polyhedron; + if(first == nil) + first = p; + else{ + last.nxt = p; + p.prv = last; + } + last = p; + p.name = s; + p.dname = getstring(b); + b.gets('\n'); + (p.allf, p.adj) = scanvc(getstring(b)); + b.gets('\n'); + b.gets('\n'); + b.gets('\n'); + l := getstring(b); + (p.indx, l) = getint(l); + (p.V, l) = getint(l); + (p.E, l) = getint(l); + (p.F, l) = getint(l); + (nil, l) = getint(l); + (D, l) = getint(l); + (p.anti, l) = getint(l); + p.concave = D != 1 || p.allf; + p.offset = b.offset(); + tot := 2*p.V+2*p.F; + for(i := 0; i < tot; i++) + b.gets('\n'); + if(p.indx < 58 || p.indx == 59 || p.indx == 66 || p.indx == 67) + p.inc = 0.1; + else + p.inc = 0.0; + # sys->print("%d: %d %d %d %d %s\n", p.indx, p.allf, D != 1, p.anti, p.concave, vc); + } + first.prv = last; + last.nxt = first; + return (n, first, b); +} + +getpolyhedra(p: ref Polyhedron, b: ref Iobuf) +{ + q := p; + do{ + getpolyhedron(q, b); + q = q.nxt; + }while(q != p); +} + +getpolyhedron(p: ref Polyhedron, b: ref Iobuf) +{ + if(p.v != nil) + return; + b.seek(p.offset, Bufio->SEEKSTART); + p.v = array[p.V] of Vector; + for(i := 0; i < p.V; i++) + p.v[i] = getvector(b); + p.f = array[p.F] of Vector; + for(i = 0; i < p.F; i++) + p.f[i] = getvector(b); + p.fv = array[p.F] of array of int; + for(i = 0; i < p.F; i++) + p.fv[i] = getarray(b, p.adj); + p.vf = array[p.V] of array of int; + for(i = 0; i < p.V; i++) + p.vf[i] = getarray(b, p.adj); +} + +getstring(b: ref Iobuf): string +{ + s := b.gets('\n'); + if(s == nil) + return nil; + if(s[0] == '#') + return getstring(b); + if(s[len s - 1] == '\n') + return s[0: len s - 1]; + return s; +} + +getvector(b: ref Iobuf): Vector +{ + v: Vector; + + s := getstring(b); + (v.x, s) = getreal(s); + (v.y, s) = getreal(s); + (v.z, s) = getreal(s); + return v; +} + +getarray(b: ref Iobuf, adj: int): array of int +{ + n, d: int; + + s := getstring(b); + (n, s) = getint(s); + a := array[n+2] of int; + a[0] = n; + for(i := 1; i <= n; i++) + (a[i], s) = getint(s); + (d, s) = getint(s); + if(d == 0 || d == n-1 || adj) + d = 1; + a[n+1] = d; + return a; +} + +getint(s: string): (int, string) +{ + n := int s; + for(i := 0; i < len s && s[i] == ' '; i++) + ; + for( ; i < len s; i++) + if(s[i] == ' ') + return (n, s[i+1:]); + return (n, nil); +} + +getreal(s: string): (real, string) +{ + r := real s; + for(i := 0; i < len s && s[i] == ' '; i++) + ; + for( ; i < len s; i++) + if(s[i] == ' ') + return (r, s[i+1:]); + return (r, nil); +} + +vftab := array[] of { 0, 0, 0, 2, 3, 3, 5, 0, 3, 0, 3 }; + +scanvc(s: string): (int, int) +{ + af := 0; + ad := 0; + fd := ld := 1; + ln := len s; + if(ln > 0 && s[0] == '('){ + s = s[1:]; + ln--; + } + while(ln > 0 && s[ln-1] != ')'){ + s = s[0: ln-1]; + ln--; + } + (m, lst) := sys->tokenize(s, "."); + for(l := lst ; l != nil; l = tl l){ + (m, lst) = sys->tokenize(hd l, "/"); + if(m == 1) + (n, d) := (int hd lst, 1); + else if(m == 2) + (n, d) = (int hd lst, int hd tl lst); + else + sys->print("vc error\n"); + if(d != 1 && d == vftab[n]) + af = 1; + if(d == n-1) + d = 1; + if(l == lst) + fd = d; + else if(ld != 1 && d != 1) + ad = 1; + ld = d; + } + if(ld != 1 && fd != 1) + ad = 1; + return (af, ad); +} |
