--- ray/src/gen/genprism.c 2003/02/22 02:07:23 2.8 +++ ray/src/gen/genprism.c 2003/06/08 12:03:09 2.9 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: genprism.c,v 2.8 2003/02/22 02:07:23 greg Exp $"; +static const char RCSid[] = "$Id: genprism.c,v 2.9 2003/06/08 12:03:09 schorsch Exp $"; #endif /* * genprism.c - generate a prism. @@ -10,11 +10,9 @@ static const char RCSid[] = "$Id: genprism.c,v 2.8 200 */ #include - +#include #include - #include - #include #define MAXVERT 1024 /* maximum # vertices */ @@ -41,100 +39,7 @@ double crad = 0.0; /* radius for corners (sign from extern double compute_rounding(); -main(argc, argv) -int argc; -char **argv; -{ - int an; - - if (argc < 4) - goto userr; - - pmtype = argv[1]; - pname = argv[2]; - - if (!strcmp(argv[3], "-")) { - readverts(NULL); - an = 4; - } else if (isdigit(argv[3][0])) { - nverts = atoi(argv[3]); - if (argc-3 < 2*nverts) - goto userr; - for (an = 0; an < nverts; an++) { - vert[an][0] = atof(argv[2*an+4]); - vert[an][1] = atof(argv[2*an+5]); - } - an = 2*nverts+4; - } else { - readverts(argv[3]); - an = 4; - } - if (nverts < 3) { - fprintf(stderr, "%s: not enough vertices\n", argv[0]); - exit(1); - } - - for ( ; an < argc; an++) { - if (argv[an][0] != '-') - goto userr; - switch (argv[an][1]) { - case 'l': /* length vector */ - lvect[0] = atof(argv[++an]); - lvect[1] = atof(argv[++an]); - lvect[2] = atof(argv[++an]); - if (lvect[2] < -FTINY) - lvdir = -1; - else if (lvect[2] > FTINY) - lvdir = 1; - else { - fprintf(stderr, - "%s: illegal extrusion vector\n", - argv[0]); - exit(1); - } - llen = sqrt(lvect[0]*lvect[0] + lvect[1]*lvect[1] + - lvect[2]*lvect[2]); - break; - case 'r': /* radius */ - crad = atof(argv[++an]); - break; - case 'e': /* ends */ - do_ends = !do_ends; - break; - case 'c': /* complete */ - iscomplete = !iscomplete; - break; - default: - goto userr; - } - } - if (crad > FTINY) { - if (crad > lvdir*lvect[2]) { - fprintf(stderr, "%s: rounding greater than height\n", - argv[0]); - exit(1); - } - crad *= lvdir; /* simplifies formulas */ - compute_rounding(); - printhead(argc, argv); - if (do_ends) - printrends(); - printsides(1); - } else { - printhead(argc, argv); - if (do_ends) - printends(); - printsides(0); - } - exit(0); -userr: - fprintf(stderr, "Usage: %s material name ", argv[0]); - fprintf(stderr, "{ - | vfile | N v1 v2 .. vN } "); - fprintf(stderr, "[-l lvect][-r radius][-c][-e]\n"); - exit(1); -} - - +static void readverts(fname) /* read vertices from a file */ char *fname; { @@ -152,7 +57,75 @@ char *fname; } -double +static void +side(n0, n1) /* print single side */ +register int n0, n1; +{ + printf("\n%s polygon %s.%d\n", pmtype, pname, n0+1); + printf("0\n0\n12\n"); + printf("\t%18.12g\t%18.12g\t%18.12g\n", vert[n0][0], + vert[n0][1], 0.0); + printf("\t%18.12g\t%18.12g\t%18.12g\n", vert[n0][0]+lvect[0], + vert[n0][1]+lvect[1], lvect[2]); + printf("\t%18.12g\t%18.12g\t%18.12g\n", vert[n1][0]+lvect[0], + vert[n1][1]+lvect[1], lvect[2]); + printf("\t%18.12g\t%18.12g\t%18.12g\n", vert[n1][0], + vert[n1][1], 0.0); +} + + +static void +rside(n0, n1) /* print side with rounded edge */ +register int n0, n1; +{ + double s, c, t[3]; + + /* compute tanget offset vector */ + s = lvdir*(lvect[1]*u[n1][0] - lvect[0]*u[n1][1])/llen; + if (s < -FTINY || s > FTINY) { + c = sqrt(1. - s*s); + t[0] = (c - 1.)*u[n1][1]; + t[1] = (1. - c)*u[n1][0]; + t[2] = s; + } else + t[0] = t[1] = t[2] = 0.; + /* output side */ + printf("\n%s polygon %s.%d\n", pmtype, pname, n0+1); + printf("0\n0\n12\n"); + printf("\t%18.12g\t%18.12g\t%18.12g\n", + vert[n0][0] + crad*(t[0] - a[n0]*u[n1][0]), + vert[n0][1] + crad*(t[1] - a[n0]*u[n1][1]), + crad*(t[2] + 1.)); + printf("\t%18.12g\t%18.12g\t%18.12g\n", + vert[n0][0] + lvect[0] + crad*(t[0] - a[n0]*u[n1][0]), + vert[n0][1] + lvect[1] + crad*(t[1] - a[n0]*u[n1][1]), + lvect[2] + crad*(t[2] - 1.)); + printf("\t%18.12g\t%18.12g\t%18.12g\n", + vert[n1][0] + lvect[0] + crad*(t[0] + a[n1]*u[n1][0]), + vert[n1][1] + lvect[1] + crad*(t[1] + a[n1]*u[n1][1]), + lvect[2] + crad*(t[2] - 1.)); + printf("\t%18.12g\t%18.12g\t%18.12g\n", + vert[n1][0] + crad*(t[0] + a[n1]*u[n1][0]), + vert[n1][1] + crad*(t[1] + a[n1]*u[n1][1]), + crad*(t[2] + 1.)); + /* output joining edge */ + if (lvdir*a[n1] < 0.) + return; + printf("\n%s cylinder %s.e%d\n", pmtype, pname, n0+1); + printf("0\n0\n7\n"); + printf("\t%18.12g\t%18.12g\t%18.12g\n", + vert[n1][0] + crad*(a[n1]*u[n1][0] - u[n1][1]), + vert[n1][1] + crad*(a[n1]*u[n1][1] + u[n1][0]), + crad); + printf("\t%18.12g\t%18.12g\t%18.12g\n", + vert[n1][0] + lvect[0] + crad*(a[n1]*u[n1][0] - u[n1][1]), + vert[n1][1] + lvect[1] + crad*(a[n1]*u[n1][1] + u[n1][0]), + lvect[2] - crad); + printf("\t%18.12g\n", lvdir*crad); +} + + +static double compute_rounding() /* compute vectors for rounding operations */ { register int i; @@ -196,6 +169,7 @@ compute_rounding() /* compute vectors for rounding op } +static void printends() /* print ends of prism */ { register int i; @@ -214,6 +188,7 @@ printends() /* print ends of prism */ } +static void printrends() /* print ends of prism with rounding */ { register int i; @@ -293,6 +268,7 @@ printrends() /* print ends of prism with rounding */ } +static void printsides(round) /* print prism sides */ int round; { @@ -311,72 +287,7 @@ int round; } -side(n0, n1) /* print single side */ -register int n0, n1; -{ - printf("\n%s polygon %s.%d\n", pmtype, pname, n0+1); - printf("0\n0\n12\n"); - printf("\t%18.12g\t%18.12g\t%18.12g\n", vert[n0][0], - vert[n0][1], 0.0); - printf("\t%18.12g\t%18.12g\t%18.12g\n", vert[n0][0]+lvect[0], - vert[n0][1]+lvect[1], lvect[2]); - printf("\t%18.12g\t%18.12g\t%18.12g\n", vert[n1][0]+lvect[0], - vert[n1][1]+lvect[1], lvect[2]); - printf("\t%18.12g\t%18.12g\t%18.12g\n", vert[n1][0], - vert[n1][1], 0.0); -} - - -rside(n0, n1) /* print side with rounded edge */ -register int n0, n1; -{ - double s, c, t[3]; - - /* compute tanget offset vector */ - s = lvdir*(lvect[1]*u[n1][0] - lvect[0]*u[n1][1])/llen; - if (s < -FTINY || s > FTINY) { - c = sqrt(1. - s*s); - t[0] = (c - 1.)*u[n1][1]; - t[1] = (1. - c)*u[n1][0]; - t[2] = s; - } else - t[0] = t[1] = t[2] = 0.; - /* output side */ - printf("\n%s polygon %s.%d\n", pmtype, pname, n0+1); - printf("0\n0\n12\n"); - printf("\t%18.12g\t%18.12g\t%18.12g\n", - vert[n0][0] + crad*(t[0] - a[n0]*u[n1][0]), - vert[n0][1] + crad*(t[1] - a[n0]*u[n1][1]), - crad*(t[2] + 1.)); - printf("\t%18.12g\t%18.12g\t%18.12g\n", - vert[n0][0] + lvect[0] + crad*(t[0] - a[n0]*u[n1][0]), - vert[n0][1] + lvect[1] + crad*(t[1] - a[n0]*u[n1][1]), - lvect[2] + crad*(t[2] - 1.)); - printf("\t%18.12g\t%18.12g\t%18.12g\n", - vert[n1][0] + lvect[0] + crad*(t[0] + a[n1]*u[n1][0]), - vert[n1][1] + lvect[1] + crad*(t[1] + a[n1]*u[n1][1]), - lvect[2] + crad*(t[2] - 1.)); - printf("\t%18.12g\t%18.12g\t%18.12g\n", - vert[n1][0] + crad*(t[0] + a[n1]*u[n1][0]), - vert[n1][1] + crad*(t[1] + a[n1]*u[n1][1]), - crad*(t[2] + 1.)); - /* output joining edge */ - if (lvdir*a[n1] < 0.) - return; - printf("\n%s cylinder %s.e%d\n", pmtype, pname, n0+1); - printf("0\n0\n7\n"); - printf("\t%18.12g\t%18.12g\t%18.12g\n", - vert[n1][0] + crad*(a[n1]*u[n1][0] - u[n1][1]), - vert[n1][1] + crad*(a[n1]*u[n1][1] + u[n1][0]), - crad); - printf("\t%18.12g\t%18.12g\t%18.12g\n", - vert[n1][0] + lvect[0] + crad*(a[n1]*u[n1][0] - u[n1][1]), - vert[n1][1] + lvect[1] + crad*(a[n1]*u[n1][1] + u[n1][0]), - lvect[2] - crad); - printf("\t%18.12g\n", lvdir*crad); -} - - +static void printhead(ac, av) /* print command header */ register int ac; register char **av; @@ -388,3 +299,98 @@ register char **av; } putchar('\n'); } + + +main(argc, argv) +int argc; +char **argv; +{ + int an; + + if (argc < 4) + goto userr; + + pmtype = argv[1]; + pname = argv[2]; + + if (!strcmp(argv[3], "-")) { + readverts(NULL); + an = 4; + } else if (isdigit(argv[3][0])) { + nverts = atoi(argv[3]); + if (argc-3 < 2*nverts) + goto userr; + for (an = 0; an < nverts; an++) { + vert[an][0] = atof(argv[2*an+4]); + vert[an][1] = atof(argv[2*an+5]); + } + an = 2*nverts+4; + } else { + readverts(argv[3]); + an = 4; + } + if (nverts < 3) { + fprintf(stderr, "%s: not enough vertices\n", argv[0]); + exit(1); + } + + for ( ; an < argc; an++) { + if (argv[an][0] != '-') + goto userr; + switch (argv[an][1]) { + case 'l': /* length vector */ + lvect[0] = atof(argv[++an]); + lvect[1] = atof(argv[++an]); + lvect[2] = atof(argv[++an]); + if (lvect[2] < -FTINY) + lvdir = -1; + else if (lvect[2] > FTINY) + lvdir = 1; + else { + fprintf(stderr, + "%s: illegal extrusion vector\n", + argv[0]); + exit(1); + } + llen = sqrt(lvect[0]*lvect[0] + lvect[1]*lvect[1] + + lvect[2]*lvect[2]); + break; + case 'r': /* radius */ + crad = atof(argv[++an]); + break; + case 'e': /* ends */ + do_ends = !do_ends; + break; + case 'c': /* complete */ + iscomplete = !iscomplete; + break; + default: + goto userr; + } + } + if (crad > FTINY) { + if (crad > lvdir*lvect[2]) { + fprintf(stderr, "%s: rounding greater than height\n", + argv[0]); + exit(1); + } + crad *= lvdir; /* simplifies formulas */ + compute_rounding(); + printhead(argc, argv); + if (do_ends) + printrends(); + printsides(1); + } else { + printhead(argc, argv); + if (do_ends) + printends(); + printsides(0); + } + exit(0); +userr: + fprintf(stderr, "Usage: %s material name ", argv[0]); + fprintf(stderr, "{ - | vfile | N v1 v2 .. vN } "); + fprintf(stderr, "[-l lvect][-r radius][-c][-e]\n"); + exit(1); +} +