From 8be4c52211a732b5cbe73997bbdd81ddb2353a12 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Mon, 27 Apr 2009 23:30:28 +0000 Subject: utah teapot tek plotter --- Makefile | 6 + input_patches.c | 48 ++++++++ teacup.dat | 279 ++++++++++++++++++++++++++++++++++++++++++++++ teapot.dat | 340 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ teapot.tek | 1 + teapot.uue | 168 ++++++++++++++++++++++++++++ teaspoon.dat | 274 +++++++++++++++++++++++++++++++++++++++++++++ tek4014-1.c | 119 ++++++++++++++++++++ tek4014-2.c | 324 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tekpot.c | 284 ++++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 1843 insertions(+) create mode 100644 Makefile create mode 100644 input_patches.c create mode 100644 teacup.dat create mode 100644 teapot.dat create mode 100644 teapot.tek create mode 100644 teapot.uue create mode 100644 teaspoon.dat create mode 100644 tek4014-1.c create mode 100644 tek4014-2.c create mode 100644 tekpot.c diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..72e4e8a --- /dev/null +++ b/Makefile @@ -0,0 +1,6 @@ +# $Id$ + +PROG= tekpot +NOMAN= + +.include diff --git a/input_patches.c b/input_patches.c new file mode 100644 index 0000000..e6bc401 --- /dev/null +++ b/input_patches.c @@ -0,0 +1,48 @@ +/* + * The file input.c -- Juhana Kouhia, jk87377@cs.tut.fi, Oct. 25, 1991 + * + * Load_patch(filename, patches, verticies); + * char *filename; int *patches, *verticies; + * A sample program to read Bezier patches in. + * Returns count of patches and verticies. + * User defined subroutines: + * B_patch(ii, a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p); + * int ii, a, b, ..., p; + * Defines one Bezier patch with index number ii, + * indexes to points are in a, b, c, ..., p. + * B_point(ii, x, y, z); + * int ii; double x, y, z; + * Defines one point with index number ii. + */ + +#include + +void Load_patch(filename, patches, verticies) +char *filename; +int *patches, *verticies; +{ + int ii; + float x,y,z; + int a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p; + + FILE *fp; + + if (!(fp = fopen(filename,"r"))) { + fprintf(stderr,"Load_patch: Can't open %s\n",filename); + exit(1); + } + + (void)fscanf(fp,"%i\n",patches); + for (ii = 0; ii < *patches; ii++) { + (void)fscanf(fp,"%i, %i, %i, %i,",&a,&b,&c,&d); + (void)fscanf(fp,"%i, %i, %i, %i,",&e,&f,&g,&h); + (void)fscanf(fp,"%i, %i, %i, %i,",&i,&j,&k,&l); + (void)fscanf(fp,"%i, %i, %i, %i\n",&m,&n,&o,&p); + B_patch(ii, a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p); + } + (void)fscanf(fp,"%i\n",verticies); + for (ii = 1; ii <= *verticies; ii++) { + (void)fscanf(fp,"%f, %f, %f\n",&x,&y,&z); + B_point(ii, (double)x,(double)y,(double)z); + } +} diff --git a/teacup.dat b/teacup.dat new file mode 100644 index 0000000..6a65b6c --- /dev/null +++ b/teacup.dat @@ -0,0 +1,279 @@ +26 +1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 +4,17,18,19,8,20,21,22,12,23,24,25,16,26,27,28 +19,29,30,31,22,32,33,34,25,35,36,37,28,38,39,40 +31,41,42,1,34,43,44,5,37,45,46,9,40,47,48,13 +13,14,15,16,49,50,51,52,53,54,55,56,57,58,59,60 +16,26,27,28,52,61,62,63,56,64,65,66,60,67,68,69 +28,38,39,40,63,70,71,72,66,73,74,75,69,76,77,78 +40,47,48,13,72,79,80,49,75,81,82,53,78,83,84,57 +193,194,195,196,197,198,199,200,201,202,203,204,1,2,3,4 +196,205,206,207,200,208,209,210,204,211,212,213,4,17,18,19 +207,214,215,216,210,217,218,219,213,220,221,222,19,29,30,31 +216,223,224,193,219,225,226,197,222,227,228,201,31,41,42,1 +229,230,231,28,232,233,234,235,236,237,238,239,240,241,242,243 +28,244,245,229,235,246,247,232,239,248,249,236,243,250,251,240 +57,58,59,60,85,86,87,88,89,90,91,92,93,94,95,96 +60,67,68,69,88,97,98,99,92,100,101,102,96,103,104,105 +69,76,77,78,99,106,107,108,102,109,110,111,105,112,113,114 +78,83,84,57,108,115,116,85,111,117,118,89,114,119,120,93 +93,94,95,96,121,122,123,124,125,126,127,128,129,130,131,132 +96,103,104,105,124,133,134,135,128,136,137,138,132,139,140,141 +105,112,113,114,135,142,143,144,138,145,146,147,141,148,149,150 +114,119,120,93,144,151,152,121,147,153,154,125,150,155,156,129 +129,130,131,132,157,158,159,160,161,162,163,164,165,166,167,168 +132,139,140,141,160,169,170,171,164,172,173,174,168,175,176,177 +141,148,149,150,171,178,179,180,174,181,182,183,177,184,185,186 +150,155,156,129,180,187,188,157,183,189,190,161,186,191,192,165 +251 +0.409091,0.772727,0.0 +0.409091,0.772727,-0.229091 +0.229091,0.772727,-0.409091 +0.0,0.772727,-0.409091 +0.409091,0.886364,0.0 +0.409091,0.886364,-0.229091 +0.229091,0.886364,-0.409091 +0.0,0.886364,-0.409091 +0.454545,0.886364,0.0 +0.454545,0.886364,-0.254545 +0.254545,0.886364,-0.454545 +0.0,0.886364,-0.454545 +0.454545,0.772727,0.0 +0.454545,0.772727,-0.254545 +0.254545,0.772727,-0.454545 +0.0,0.772727,-0.454545 +-0.229091,0.772727,-0.409091 +-0.409091,0.772727,-0.229091 +-0.409091,0.772727,0.0 +-0.229091,0.886364,-0.409091 +-0.409091,0.886364,-0.229091 +-0.409091,0.886364,0.0 +-0.254545,0.886364,-0.454545 +-0.454545,0.886364,-0.254545 +-0.454545,0.886364,0.0 +-0.254545,0.772727,-0.454545 +-0.454545,0.772727,-0.254545 +-0.454545,0.772727,0.0 +-0.409091,0.772727,0.229091 +-0.229091,0.772727,0.409091 +0.0,0.772727,0.409091 +-0.409091,0.886364,0.229091 +-0.229091,0.886364,0.409091 +0.0,0.886364,0.409091 +-0.454545,0.886364,0.254545 +-0.254545,0.886364,0.454545 +0.0,0.886364,0.454545 +-0.454545,0.772727,0.254545 +-0.254545,0.772727,0.454545 +0.0,0.772727,0.454545 +0.229091,0.772727,0.409091 +0.409091,0.772727,0.229091 +0.229091,0.886364,0.409091 +0.409091,0.886364,0.229091 +0.254545,0.886364,0.454545 +0.454545,0.886364,0.254545 +0.254545,0.772727,0.454545 +0.454545,0.772727,0.254545 +0.454545,0.545455,0.0 +0.454545,0.545455,-0.254545 +0.254545,0.545455,-0.454545 +0.0,0.545455,-0.454545 +0.454545,0.272727,0.0 +0.454545,0.272727,-0.254545 +0.254545,0.272727,-0.454545 +0.0,0.272727,-0.454545 +0.318182,0.0454545,0.0 +0.318182,0.0454545,-0.178182 +0.178182,0.0454545,-0.318182 +0.0,0.0454545,-0.318182 +-0.254545,0.545455,-0.454545 +-0.454545,0.545455,-0.254545 +-0.454545,0.545455,0.0 +-0.254545,0.272727,-0.454545 +-0.454545,0.272727,-0.254545 +-0.454545,0.272727,0.0 +-0.178182,0.0454545,-0.318182 +-0.318182,0.0454545,-0.178182 +-0.318182,0.0454545,0.0 +-0.454545,0.545455,0.254545 +-0.254545,0.545455,0.454545 +0.0,0.545455,0.454545 +-0.454545,0.272727,0.254545 +-0.254545,0.272727,0.454545 +0.0,0.272727,0.454545 +-0.318182,0.0454545,0.178182 +-0.178182,0.0454545,0.318182 +0.0,0.0454545,0.318182 +0.254545,0.545455,0.454545 +0.454545,0.545455,0.254545 +0.254545,0.272727,0.454545 +0.454545,0.272727,0.254545 +0.178182,0.0454545,0.318182 +0.318182,0.0454545,0.178182 +0.545455,0.0454545,0.0 +0.545455,0.0454545,-0.305455 +0.305455,0.0454545,-0.545455 +0.0,0.0454545,-0.545455 +0.727273,0.136364,0.0 +0.727273,0.136364,-0.407273 +0.407273,0.136364,-0.727273 +0.0,0.136364,-0.727273 +0.909091,0.136364,0.0 +0.909091,0.136364,-0.509091 +0.509091,0.136364,-0.909091 +0.0,0.136364,-0.909091 +-0.305455,0.0454545,-0.545455 +-0.545455,0.0454545,-0.305455 +-0.545455,0.0454545,0.0 +-0.407273,0.136364,-0.727273 +-0.727273,0.136364,-0.407273 +-0.727273,0.136364,0.0 +-0.509091,0.136364,-0.909091 +-0.909091,0.136364,-0.509091 +-0.909091,0.136364,0.0 +-0.545455,0.0454545,0.305455 +-0.305455,0.0454545,0.545455 +0.0,0.0454545,0.545455 +-0.727273,0.136364,0.407273 +-0.407273,0.136364,0.727273 +0.0,0.136364,0.727273 +-0.909091,0.136364,0.509091 +-0.509091,0.136364,0.909091 +0.0,0.136364,0.909091 +0.305455,0.0454545,0.545455 +0.545455,0.0454545,0.305455 +0.407273,0.136364,0.727273 +0.727273,0.136364,0.407273 +0.509091,0.136364,0.909091 +0.909091,0.136364,0.509091 +1.0,0.136364,0.0 +1.0,0.136364,-0.56 +0.56,0.136364,-1.0 +0.0,0.136364,-1.0 +1.0,0.0909091,0.0 +1.0,0.0909091,-0.56 +0.56,0.0909091,-1.0 +0.0,0.0909091,-1.0 +0.909091,0.0909091,0.0 +0.909091,0.0909091,-0.509091 +0.509091,0.0909091,-0.909091 +0.0,0.0909091,-0.909091 +-0.56,0.136364,-1.0 +-1.0,0.136364,-0.56 +-1.0,0.136364,0.0 +-0.56,0.0909091,-1.0 +-1.0,0.0909091,-0.56 +-1.0,0.0909091,0.0 +-0.509091,0.0909091,-0.909091 +-0.909091,0.0909091,-0.509091 +-0.909091,0.0909091,0.0 +-1.0,0.136364,0.56 +-0.56,0.136364,1.0 +0.0,0.136364,1.0 +-1.0,0.0909091,0.56 +-0.56,0.0909091,1.0 +0.0,0.0909091,1.0 +-0.909091,0.0909091,0.509091 +-0.509091,0.0909091,0.909091 +0.0,0.0909091,0.909091 +0.56,0.136364,1.0 +1.0,0.136364,0.56 +0.56,0.0909091,1.0 +1.0,0.0909091,0.56 +0.509091,0.0909091,0.909091 +0.909091,0.0909091,0.509091 +0.727273,0.0909091,0.0 +0.727273,0.0909091,-0.407273 +0.407273,0.0909091,-0.727273 +0.0,0.0909091,-0.727273 +0.545455,0.0,0.0 +0.545455,0.0,-0.305455 +0.305455,0.0,-0.545455 +0.0,0.0,-0.545455 +0.318182,0.0,0.0 +0.318182,0.0,-0.178182 +0.178182,0.0,-0.318182 +0.0,0.0,-0.318182 +-0.407273,0.0909091,-0.727273 +-0.727273,0.0909091,-0.407273 +-0.727273,0.0909091,0.0 +-0.305455,0.0,-0.545455 +-0.545455,0.0,-0.305455 +-0.545455,0.0,0.0 +-0.178182,0.0,-0.318182 +-0.318182,0.0,-0.178182 +-0.318182,0.0,0.0 +-0.727273,0.0909091,0.407273 +-0.407273,0.0909091,0.727273 +0.0,0.0909091,0.727273 +-0.545455,0.0,0.305455 +-0.305455,0.0,0.545455 +0.0,0.0,0.545455 +-0.318182,0.0,0.178182 +-0.178182,0.0,0.318182 +0.0,0.0,0.318182 +0.407273,0.0909091,0.727273 +0.727273,0.0909091,0.407273 +0.305455,0.0,0.545455 +0.545455,0.0,0.305455 +0.178182,0.0,0.318182 +0.318182,0.0,0.178182 +0.272727,0.0454545,0.0 +0.272727,0.0454545,-0.152727 +0.152727,0.0454545,-0.272727 +0.0,0.0454545,-0.272727 +0.409091,0.272727,0.0 +0.409091,0.272727,-0.229091 +0.229091,0.272727,-0.409091 +0.0,0.272727,-0.409091 +0.409091,0.545455,0.0 +0.409091,0.545455,-0.229091 +0.229091,0.545455,-0.409091 +0.0,0.545455,-0.409091 +-0.152727,0.0454545,-0.272727 +-0.272727,0.0454545,-0.152727 +-0.272727,0.0454545,0.0 +-0.229091,0.272727,-0.409091 +-0.409091,0.272727,-0.229091 +-0.409091,0.272727,0.0 +-0.229091,0.545455,-0.409091 +-0.409091,0.545455,-0.229091 +-0.409091,0.545455,0.0 +-0.272727,0.0454545,0.152727 +-0.152727,0.0454545,0.272727 +0.0,0.0454545,0.272727 +-0.409091,0.272727,0.229091 +-0.229091,0.272727,0.409091 +0.0,0.272727,0.409091 +-0.409091,0.545455,0.229091 +-0.229091,0.545455,0.409091 +0.0,0.545455,0.409091 +0.152727,0.0454545,0.272727 +0.272727,0.0454545,0.152727 +0.229091,0.272727,0.409091 +0.409091,0.272727,0.229091 +0.229091,0.545455,0.409091 +0.409091,0.545455,0.229091 +-0.454545,0.704545,0.0 +-0.454545,0.704545,-0.0454545 +-0.454545,0.772727,-0.0454545 +-0.772727,0.863636,0.0 +-0.772727,0.863636,-0.0454545 +-0.818182,0.954545,-0.0454545 +-0.818182,0.954545,0.0 +-0.772727,0.522727,0.0 +-0.772727,0.522727,-0.0454545 +-0.909091,0.477273,-0.0454545 +-0.909091,0.477273,0.0 +-0.409091,0.363636,0.0 +-0.409091,0.363636,-0.0454545 +-0.409091,0.295455,-0.0454545 +-0.409091,0.295455,0.0 +-0.454545,0.772727,0.0454545 +-0.454545,0.704545,0.0454545 +-0.818182,0.954545,0.0454545 +-0.772727,0.863636,0.0454545 +-0.909091,0.477273,0.0454545 +-0.772727,0.522727,0.0454545 +-0.409091,0.295455,0.0454545 +-0.409091,0.363636,0.0454545 diff --git a/teapot.dat b/teapot.dat new file mode 100644 index 0000000..a064523 --- /dev/null +++ b/teapot.dat @@ -0,0 +1,340 @@ +32 +1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 +4,17,18,19,8,20,21,22,12,23,24,25,16,26,27,28 +19,29,30,31,22,32,33,34,25,35,36,37,28,38,39,40 +31,41,42,1,34,43,44,5,37,45,46,9,40,47,48,13 +13,14,15,16,49,50,51,52,53,54,55,56,57,58,59,60 +16,26,27,28,52,61,62,63,56,64,65,66,60,67,68,69 +28,38,39,40,63,70,71,72,66,73,74,75,69,76,77,78 +40,47,48,13,72,79,80,49,75,81,82,53,78,83,84,57 +57,58,59,60,85,86,87,88,89,90,91,92,93,94,95,96 +60,67,68,69,88,97,98,99,92,100,101,102,96,103,104,105 +69,76,77,78,99,106,107,108,102,109,110,111,105,112,113,114 +78,83,84,57,108,115,116,85,111,117,118,89,114,119,120,93 +121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136 +124,137,138,121,128,139,140,125,132,141,142,129,136,143,144,133 +133,134,135,136,145,146,147,148,149,150,151,152,69,153,154,155 +136,143,144,133,148,156,157,145,152,158,159,149,155,160,161,69 +162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177 +165,178,179,162,169,180,181,166,173,182,183,170,177,184,185,174 +174,175,176,177,186,187,188,189,190,191,192,193,194,195,196,197 +177,184,185,174,189,198,199,186,193,200,201,190,197,202,203,194 +204,204,204,204,207,208,209,210,211,211,211,211,212,213,214,215 +204,204,204,204,210,217,218,219,211,211,211,211,215,220,221,222 +204,204,204,204,219,224,225,226,211,211,211,211,222,227,228,229 +204,204,204,204,226,230,231,207,211,211,211,211,229,232,233,212 +212,213,214,215,234,235,236,237,238,239,240,241,242,243,244,245 +215,220,221,222,237,246,247,248,241,249,250,251,245,252,253,254 +222,227,228,229,248,255,256,257,251,258,259,260,254,261,262,263 +229,232,233,212,257,264,265,234,260,266,267,238,263,268,269,242 +270,270,270,270,279,280,281,282,275,276,277,278,271,272,273,274 +270,270,270,270,282,289,290,291,278,286,287,288,274,283,284,285 +270,270,270,270,291,298,299,300,288,295,296,297,285,292,293,294 +270,270,270,270,300,305,306,279,297,303,304,275,294,301,302,271 +306 +1.4,0.0,2.4 +1.4,-0.784,2.4 +0.784,-1.4,2.4 +0.0,-1.4,2.4 +1.3375,0.0,2.53125 +1.3375,-0.749,2.53125 +0.749,-1.3375,2.53125 +0.0,-1.3375,2.53125 +1.4375,0.0,2.53125 +1.4375,-0.805,2.53125 +0.805,-1.4375,2.53125 +0.0,-1.4375,2.53125 +1.5,0.0,2.4 +1.5,-0.84,2.4 +0.84,-1.5,2.4 +0.0,-1.5,2.4 +-0.784,-1.4,2.4 +-1.4,-0.784,2.4 +-1.4,0.0,2.4 +-0.749,-1.3375,2.53125 +-1.3375,-0.749,2.53125 +-1.3375,0.0,2.53125 +-0.805,-1.4375,2.53125 +-1.4375,-0.805,2.53125 +-1.4375,0.0,2.53125 +-0.84,-1.5,2.4 +-1.5,-0.84,2.4 +-1.5,0.0,2.4 +-1.4,0.784,2.4 +-0.784,1.4,2.4 +0.0,1.4,2.4 +-1.3375,0.749,2.53125 +-0.749,1.3375,2.53125 +0.0,1.3375,2.53125 +-1.4375,0.805,2.53125 +-0.805,1.4375,2.53125 +0.0,1.4375,2.53125 +-1.5,0.84,2.4 +-0.84,1.5,2.4 +0.0,1.5,2.4 +0.784,1.4,2.4 +1.4,0.784,2.4 +0.749,1.3375,2.53125 +1.3375,0.749,2.53125 +0.805,1.4375,2.53125 +1.4375,0.805,2.53125 +0.84,1.5,2.4 +1.5,0.84,2.4 +1.75,0.0,1.875 +1.75,-0.98,1.875 +0.98,-1.75,1.875 +0.0,-1.75,1.875 +2.0,0.0,1.35 +2.0,-1.12,1.35 +1.12,-2.0,1.35 +0.0,-2.0,1.35 +2.0,0.0,0.9 +2.0,-1.12,0.9 +1.12,-2.0,0.9 +0.0,-2.0,0.9 +-0.98,-1.75,1.875 +-1.75,-0.98,1.875 +-1.75,0.0,1.875 +-1.12,-2.0,1.35 +-2.0,-1.12,1.35 +-2.0,0.0,1.35 +-1.12,-2.0,0.9 +-2.0,-1.12,0.9 +-2.0,0.0,0.9 +-1.75,0.98,1.875 +-0.98,1.75,1.875 +0.0,1.75,1.875 +-2.0,1.12,1.35 +-1.12,2.0,1.35 +0.0,2.0,1.35 +-2.0,1.12,0.9 +-1.12,2.0,0.9 +0.0,2.0,0.9 +0.98,1.75,1.875 +1.75,0.98,1.875 +1.12,2.0,1.35 +2.0,1.12,1.35 +1.12,2.0,0.9 +2.0,1.12,0.9 +2.0,0.0,0.45 +2.0,-1.12,0.45 +1.12,-2.0,0.45 +0.0,-2.0,0.45 +1.5,0.0,0.225 +1.5,-0.84,0.225 +0.84,-1.5,0.225 +0.0,-1.5,0.225 +1.5,0.0,0.15 +1.5,-0.84,0.15 +0.84,-1.5,0.15 +0.0,-1.5,0.15 +-1.12,-2.0,0.45 +-2.0,-1.12,0.45 +-2.0,0.0,0.45 +-0.84,-1.5,0.225 +-1.5,-0.84,0.225 +-1.5,0.0,0.225 +-0.84,-1.5,0.15 +-1.5,-0.84,0.15 +-1.5,0.0,0.15 +-2.0,1.12,0.45 +-1.12,2.0,0.45 +0.0,2.0,0.45 +-1.5,0.84,0.225 +-0.84,1.5,0.225 +0.0,1.5,0.225 +-1.5,0.84,0.15 +-0.84,1.5,0.15 +0.0,1.5,0.15 +1.12,2.0,0.45 +2.0,1.12,0.45 +0.84,1.5,0.225 +1.5,0.84,0.225 +0.84,1.5,0.15 +1.5,0.84,0.15 +-1.6,0.0,2.025 +-1.6,-0.3,2.025 +-1.5,-0.3,2.25 +-1.5,0.0,2.25 +-2.3,0.0,2.025 +-2.3,-0.3,2.025 +-2.5,-0.3,2.25 +-2.5,0.0,2.25 +-2.7,0.0,2.025 +-2.7,-0.3,2.025 +-3.0,-0.3,2.25 +-3.0,0.0,2.25 +-2.7,0.0,1.8 +-2.7,-0.3,1.8 +-3.0,-0.3,1.8 +-3.0,0.0,1.8 +-1.5,0.3,2.25 +-1.6,0.3,2.025 +-2.5,0.3,2.25 +-2.3,0.3,2.025 +-3.0,0.3,2.25 +-2.7,0.3,2.025 +-3.0,0.3,1.8 +-2.7,0.3,1.8 +-2.7,0.0,1.575 +-2.7,-0.3,1.575 +-3.0,-0.3,1.35 +-3.0,0.0,1.35 +-2.5,0.0,1.125 +-2.5,-0.3,1.125 +-2.65,-0.3,0.9375 +-2.65,0.0,0.9375 +-2.0,-0.3,0.9 +-1.9,-0.3,0.6 +-1.9,0.0,0.6 +-3.0,0.3,1.35 +-2.7,0.3,1.575 +-2.65,0.3,0.9375 +-2.5,0.3,1.125 +-1.9,0.3,0.6 +-2.0,0.3,0.9 +1.7,0.0,1.425 +1.7,-0.66,1.425 +1.7,-0.66,0.6 +1.7,0.0,0.6 +2.6,0.0,1.425 +2.6,-0.66,1.425 +3.1,-0.66,0.825 +3.1,0.0,0.825 +2.3,0.0,2.1 +2.3,-0.25,2.1 +2.4,-0.25,2.025 +2.4,0.0,2.025 +2.7,0.0,2.4 +2.7,-0.25,2.4 +3.3,-0.25,2.4 +3.3,0.0,2.4 +1.7,0.66,0.6 +1.7,0.66,1.425 +3.1,0.66,0.825 +2.6,0.66,1.425 +2.4,0.25,2.025 +2.3,0.25,2.1 +3.3,0.25,2.4 +2.7,0.25,2.4 +2.8,0.0,2.475 +2.8,-0.25,2.475 +3.525,-0.25,2.49375 +3.525,0.0,2.49375 +2.9,0.0,2.475 +2.9,-0.15,2.475 +3.45,-0.15,2.5125 +3.45,0.0,2.5125 +2.8,0.0,2.4 +2.8,-0.15,2.4 +3.2,-0.15,2.4 +3.2,0.0,2.4 +3.525,0.25,2.49375 +2.8,0.25,2.475 +3.45,0.15,2.5125 +2.9,0.15,2.475 +3.2,0.15,2.4 +2.8,0.15,2.4 +0.0,0.0,3.15 +0.0,-0.002,3.15 +0.002,0.0,3.15 +0.8,0.0,3.15 +0.8,-0.45,3.15 +0.45,-0.8,3.15 +0.0,-0.8,3.15 +0.0,0.0,2.85 +0.2,0.0,2.7 +0.2,-0.112,2.7 +0.112,-0.2,2.7 +0.0,-0.2,2.7 +-0.002,0.0,3.15 +-0.45,-0.8,3.15 +-0.8,-0.45,3.15 +-0.8,0.0,3.15 +-0.112,-0.2,2.7 +-0.2,-0.112,2.7 +-0.2,0.0,2.7 +0.0,0.002,3.15 +-0.8,0.45,3.15 +-0.45,0.8,3.15 +0.0,0.8,3.15 +-0.2,0.112,2.7 +-0.112,0.2,2.7 +0.0,0.2,2.7 +0.45,0.8,3.15 +0.8,0.45,3.15 +0.112,0.2,2.7 +0.2,0.112,2.7 +0.4,0.0,2.55 +0.4,-0.224,2.55 +0.224,-0.4,2.55 +0.0,-0.4,2.55 +1.3,0.0,2.55 +1.3,-0.728,2.55 +0.728,-1.3,2.55 +0.0,-1.3,2.55 +1.3,0.0,2.4 +1.3,-0.728,2.4 +0.728,-1.3,2.4 +0.0,-1.3,2.4 +-0.224,-0.4,2.55 +-0.4,-0.224,2.55 +-0.4,0.0,2.55 +-0.728,-1.3,2.55 +-1.3,-0.728,2.55 +-1.3,0.0,2.55 +-0.728,-1.3,2.4 +-1.3,-0.728,2.4 +-1.3,0.0,2.4 +-0.4,0.224,2.55 +-0.224,0.4,2.55 +0.0,0.4,2.55 +-1.3,0.728,2.55 +-0.728,1.3,2.55 +0.0,1.3,2.55 +-1.3,0.728,2.4 +-0.728,1.3,2.4 +0.0,1.3,2.4 +0.224,0.4,2.55 +0.4,0.224,2.55 +0.728,1.3,2.55 +1.3,0.728,2.55 +0.728,1.3,2.4 +1.3,0.728,2.4 +0.0,0.0,0.0 +1.5,0.0,0.15 +1.5,0.84,0.15 +0.84,1.5,0.15 +0.0,1.5,0.15 +1.5,0.0,0.075 +1.5,0.84,0.075 +0.84,1.5,0.075 +0.0,1.5,0.075 +1.425,0.0,0.0 +1.425,0.798,0.0 +0.798,1.425,0.0 +0.0,1.425,0.0 +-0.84,1.5,0.15 +-1.5,0.84,0.15 +-1.5,0.0,0.15 +-0.84,1.5,0.075 +-1.5,0.84,0.075 +-1.5,0.0,0.075 +-0.798,1.425,0.0 +-1.425,0.798,0.0 +-1.425,0.0,0.0 +-1.5,-0.84,0.15 +-0.84,-1.5,0.15 +0.0,-1.5,0.15 +-1.5,-0.84,0.075 +-0.84,-1.5,0.075 +0.0,-1.5,0.075 +-1.425,-0.798,0.0 +-0.798,-1.425,0.0 +0.0,-1.425,0.0 +0.84,-1.5,0.15 +1.5,-0.84,0.15 +0.84,-1.5,0.075 +1.5,-0.84,0.075 +0.798,-1.425,0.0 +1.425,-0.798,0.0 diff --git a/teapot.tek b/teapot.tek new file mode 100644 index 0000000..2908882 --- /dev/null +++ b/teapot.tek @@ -0,0 +1 @@ +[?38h [?38h0kc5N/d|NkuKboHmhDdc4_.f~Y`zTevNbsHipCjn3^`mZlVkkRdkPkkM`lLnlJkmIinIhoIlpImqIorImsJotJiuKkvKawLnwLdxMixMayMfyMjyMnyMoyMczMMgzMMMhzNNizNjzNhzOizOkzOizPjzPhzQfzQczQmyRjyRgyR`yShxSexSmwSewSmvSivS`vShuS`uSmtSftSctSlsTjsTesUlrVhrWdrXarYjqZbq[gp\ko]in^gm^cl^ej^dh]f[mcXbaT-f~O{IbxBlt2ZiqPjnEnk1YjiLmg0^jfOdl@nl/QomCjo.VmqJet-_`wUzLa}D.b`,]obWieSchOijMlKenJooIgqIdrJgsJctKotLguMluO`vPdvQkvQnvRawSgwShwTmwTaxTexTixTlxT`yTgySfySiySmyS`zSczRRRbzRRnyRRjyReyRayRlxRkxQfxQaxQlwQnwPiwPgwOawOovNivNgvMevM`vMkuLfuLntLjtLosLgsLirMnqMlpNnoNonNmmOjlOkOijOfiNkhMmgLfgJdgHEbhAai+]jjXmlSkoMorGbwAn{*[/baUagPjmKktGn{E0icQljRmqTfxWd~\1`d+AbiFimLlqRfuWgx\oz,Am|Fh~JnM2m`PjaRmaTfbUVhbWWWkbVjbVhbVjbUlbUnbT`cTfcSicS`dSgdRkdRbeRfeRneRbfRffRjfRnfRagRegRdgRkgQjgQmgQogPngPlgPngOahOchNahNdhNghMfhMihMhhMMMlhMMhhMMdhM`hMlgMkgLbgLhfLneKgeJhdJlcI`cHdbGoaEbaDn`Cj`Bk`Aj`AbaAlaBmbCedE`fHchKfjPbmVoo]mr-FkuOxZg{.Fk}Sg/A3j`P2hz0@fzNay\iw1IfuUor2@gpJkmSoj[bh3BleHjcLhaPc`R1n~T}U`}Vl|Vk|Ul|Ua}Te}S`~Rh~QdP2``Ol`NiaMgbLacLhcLcdKjdKbeKjeKoeK`fLdfLifLnfLcgLggLdgMhgMmgMahMehMihMjhMnhMbiMgiMkiMhiNmiNniN`jOajOcjOmiPoiPiiQjiQdiRnhRkhRdhSahSmgSegSagSlfSofRifRkfQjfQhfQkfPjfPPkfPifQRbfSjeUodWcZib^n`4B1i~Gb|LmxRauXip^nk5DefJg`O0nyTlrXfkZic[/n{ZitXjmTlfPk`J.`{Emu4_bqYhlTkhNaeJmaF-`Cf|@ny3^iw]fu\bs\cq\bo]nl^oj_ih4AkfBedDoaE,iGc}HhzJaxKiuLmrMdpNkmNakOghOmePccPi`Q+c~Qi{RcyRivS`tToqTfoUmlVhjW`hXoeXgcYn`Z*e~[l{\ky\aw]kt]`r^io^bm^jj^bh^ne^ic^da^)`^c}]oz]cy]`w^eu^ks^ar_ep5@mnAamBjkCliEahFbfGocHjaI(cIg|IyHavGfrDkn@fj4[`fUhaM'b}Cix3XatKcp2\glLai1[jfHce0T-`f@jf/PogAji.SnkFbn-ZnpOdsFju,]iwVdyPhzK`{Gd{Dc{Aez@y+_kw^ju^fs^op^`n_fk_gh_`e,@b@,@c|+_ay_gv^hs^mp]an\ik[aiZmfYedX`bW+lVd}Ua{TmxSfvRctQiqQboPhlPbjOhgObeNgbM*mMg}LlzLexKnuJjsIgqHcoGolFljFhEfDaeCbcBgaA)eAh}Ak{@oy@lwAiuAgsAbqBinC`lDkiDagEddFmaF(aFo|EkzDixC`wAmu*^fuZduVnuPfwJoyCa})\)baTefLlDfs(\e{U*adOemJawG0kc*DfkElrHjyK1a`PneUak[ho+AcsFavLxQhyVgzYhz]cz_by,AlwCbvCgtCbrCooBgmAnj@hh+_bf]lc\jaZ0dYf}Wi{VhyUlwT`vSitRnrQdqQmoPdnPjlO`kOjiNlgNbfMddMibLn`K/o~J`}Ja{IeyHjwGuFosE`rEepDjnCllCfkBmiBdhBofAceAkcA`bBh`B.aBf}Bj{BnyBwBuBhsBfqA`oAml@dj*_`h^oe\ic[daZ-kXo}Wk|Vj{VozVnzWa{Yc|[k}_+D.abKeSdh]mk,HhoUbs-CjvShy.Ec|Wj}/K3l`0@j`O2e^i}1La{Yfx2EauPlqZfn3BckIkgOgdTcaX1~[`{^kx_cv4@msAiqAmoAlmAcl@jj@`i@dg@oe3_dd4@mb@fa@0lAg~Aj|BnzCbyDfwEjuFnsGcrHpIgnJflKjjLmhMlfNbeNecOkaO/mPc~Pi|QlzRbyRdwSkuSnsTarUdpVhnWllXojXhYfZce[bc\aa].o~]m|^oz^`y_w_gu^fs^hq^ap]jn\cm[hk[ejZohYjgYffY`eZhc[bb\f`^-~5Aa|EgyI`vOirUdn\ji6CedK,~Sfw[ap7CngJ+cPjuUokXhaZ*cwXgmUocP)c{JnrCgk6[kdS(j~KcyCet5\bpUjlOhiJnfEkdAhb4_o`\'e[m}Zk|Yg{Y`zZmxZhw[fv[au\ks\er]np]fo]nm]dl]nj\gi[lg[kfYbeXadWobUlaTn`R``Q&eOk~Ma~Lk}Jb}Il|Hh|Gg|Eb|DCn{Bo{Ak{@d{@{3_a{^b{]oz\kz[dz[ezZczYlyYnyXhyXkyWjyWiyWWjyWhyXnyXmyYlyZoyZ[\gy]by^dx_jw_ev_cu^es]iq[foXolTcjOggIbdB`a2Z%b~P{Efx1YnuLat0^nrO'hd@ae/Kjf.WciDal-SioCcs,TovGfz+\l}S(h`KbcDae*_jf[kgXahWmgVegVffVaeWjcXkaY'h[j}\g{]`y_lv+@ot@nrA`qBfoBnmBglBckBjBiBghBkgBlfCefCbfCheDfeDmdEidFedGncHkcIdcKnbLhbNbbOhaQfaRl`Tj`Uc`V&mXeYbZj~[f~\b~]n}^i}_e},@`}Ao|Ag|Bc|Cj{Db{EjzFbzGfyHjxImwJvKcvKeuLtLhsLbsKirJgrHjrForCjs@nt+\kvWoxRm{MeG'cAah*[imUhsPazK(caGihE+ha(FmkGjuJaO,jgUgo\fv)Dk|L-aTne\`i*DgkJllQimVkmZbm^nk+AfjCehE`fFncFgaF,n~F`|FiyEcwDltDjrChpCknBlBojBeiCogCffDndEjcFcbGm`I+fJa~Lk|Ma{OhyQbxRhvTntUgsVhqXmoYbnZjl[oj\bi]jg^bf_id,@acAhaBg`B*bCm}Dl|Ek{EjzFiyGkxGiwHnvHouHtHsHbsHarHcqGdpGeoFinEanDemCbmBolAllAcm@hmAfnAkoBcqDorGntKfwPnyVo|]l-F+kbOjeZfh.FkjSgl/AjmP.`~0@j}Ta|1Hhy[fv2Ljr\hn3KcjWhe4CcaL-k|Tex[t5@pDolFjiHfIncIeaI,m~H|G`{FcyDiwCluBgt@or4_dq_mo^gn]il]lj]`i]dg]he]c]la]+]o}\n{\my\ow[av[btZrYfpXinWllVckTiiSchQifPceNmcMgbKaaJ*lIk~Gf}Fe|Ea{DzCyBxAbw@gv3_u^ht^ls]es\mr[erZarYmqXiqWVjqUkqTlqToqSbrScrSbrTnqUhqWaqY`p\nn_fm4C`kHhhMgeRnaX)f}^kx5DbsJ`mPjfT(iXcxZ.a{)XmxXbwX`vYnuYouY`vZhvZgwYdxYayX`zWmzUj{Sd|Qb}Nj}Kn}Hd~Ej~Ak~(]l~ZVo~Qk~MIf~EAb~']Yn}Uo}Ql}Nn}Jh}Gk}Ci}@}&]l}Zm}WTn}Qo}Nm}Lo}Im}Go}Dn}Bm}@h}%^k}[g}Yf}Wb}Un|So|Qh|Pd|Nb|Lo{Ji{Ic{GmzFdzEczCkyBcyAgx@lw@bw$_cv^fu^dt^gs]cr]np]fo]nm]fl]kj]ci]gg]je]c]ab]g`\-i~\b}[n{ZzYmyXcyVlxUmxSayQjyOnzM`|Lb~J.c`I/gs*DnuDewDgxClxCBgx@mw)_bw]ev[guXitVsSlrParLjqHcqDkp@fp(\apXloTnoOmoKloGC`p'_[dpWepSkpOipLhpIopEBp&_\lpZmpWkpThpRjpOhpMfpJepHgpEbpC`pAcp%^no\ZioXVeoTaoRnnPknNdnMbnKhmJbmHelGlkF`kEdjDiCehBfgAgf@`e@nc$_hb_ea^c`].m~]d}]b|\lz\ky[ex[dw[gvZuZtZksZlr[er[kq[bq\np]fp^lo%@foAlnCcnDgmFflHbkJhiLjgMfeNobNb`N-n}M`|LizJfyHxFgwDlvCevAou$_fu^nt]ft\os[es[krZoqZbqZpZcoZnZll[ek[bj[hh\ag\je\oc\ab]j`],o~]a}^f{^dy_iw_ou_at%@gr@ipAlnBcmBfkCiiDmgEafFedGmbHbaI+gJh}La|MgzNixPcwQeuSosTerVhpXcoYim[dl]lj_ki&@chBnfDkeFgdHdcKabMcaO*lRo~Tj}Wi|Zd{]z'@`yCmwFivIfuLosOgrRlpV`oYdm\kk^ni(A`hDafFfdHibJl`L)fMc~N`}Pk|Pj|Qd}Rn~R.mb$IgeIjgJdiLojMnkOjlQmlSllUglVmkXnjYoiZfh[mf\ge\ic]na]b`]-c~]g|]jz]nx]fw]iu]at]ir]aq]no]fn]`m^mk^kj^ei_ch_bg%@meAddB`cClaDd`E,`Fh}Ga|HezInxJgwKhuMmsNfrOhpQmnRcmSikUoiVahXkfYnd[dc]oa^c`&@+j~Bb}Dk{FczHhxKbwMhuPbtRhrUcqWfoZnm]el'@mjCeiFahIifLeeOadR`cUcbWeaZk`\``_*l(AoB+b`Dg`Eo`FjaGdbHecHadHeHkeGneGleGbeFmcF,ez6TjsTlTbeT+o}TlvUfpUjjVfeWl`Y*c}Zdz]nw_fv7BcuEjtIetMjtQduVbvZw_ax8DfyIjzNn{Sb}Xj~]n9B+aaGkbKlcPdeTlfXfh[oi^jk:AimDjoFiqH`tJivKayLc|L`M,bMkeLbiLklKgpJctIbxHm{GoE-mcDlgCjkAho@fs9^aw]iz\`~[.iaZndY`hYbkXanXnpXgsXmuYgxYozZ`}\a]/`a_cc:@eBmfEjhGejJmkMemPnnS`pWfqZir^s;BjtFguJdvObwSiwXdx]by\YWW/\T^[\__B[^]'_^ +M]#]_^GGOS]\T_J/Y3JY-O6\@7[6B2/#ORS=VGX!SGQZ::%N5JX)R/Q;`3LU0 +MZR[1;:T38&)GZMK6I*L)7S.KFEW7_*9FMW6_J\M]0Q\:\!B[8TQ.B3PE,$M8 +MEJ@L<5GBLP2?DX2'6R+.S:8\-]6Y*6[IY[6MSFUQ[K!S!Y\[-NNJK,NS +M+LAZXM2CIYX]]NBQ9P\]>>B!0T_L>V#?L[L>V_7PKF>V?;7MT^W`;(9B,R*; +M,=Q,U'J*UC.^FFN?2K?@=H'-@JH%$2F;63Q&L/_*[JU+#9WR9O=]*M=MY4I. +M?TR4C"W_ME"L]>?__3,QD3/O'6\+RK\-[;I.=Z]+^QM.K34U^>^N;4!UF?9SV6]636LUD/G'OXW.UV4;BXK/LL"\VZ,.N:4U>?.NS4 +M@:>..7;VZSTXC)UU- +MNHAV&>TZVD6LRUA7L:YC74;QC>=XA(@$@,3S2/$8\%BQUM<%H7I&YP#>`J014/2P@6'2@H +MD-<@IT`.P9R!>8L*E)0`JV+18*J-[-#[U&Y>RWK?.DWYY:VL;SW^>,_]4*`= +M"O5=G+]%[-R$V5P>/VIL/_";[Q%?A=GJ>35#XD?>T*K"L8!M#+H?[MZ_#^O36`_>NN'?(H_T=@)8!30D3CF(8_@S'F#04:2#:4+3A:0.P +MF+!8AG^*Q9C'G,>$)X*'E4Z@2.C/)KA9=(GI0]"SO4=Z#O&=8S[.N9%W-.HIU!.MHUE:LW0[? +M).N$)>LI.O!DA*<2+1SX/?\A[Q5TC>VI"_=CN5HX_4>1LCH'K6\NZYO-F.EI +MJ)G$LW=WF>GBK/L4H%W?AR;W`VN&0HV`&'LZYGCBP/0+O<_,9:ZS +M.3RF>I>"S4+Z!;(+I19(+!Q=2+P@J/ +MR+H&APC9%[2*F?I\!-A`P^0W="O+T +M8PQW#;SZ/NYY1\ZSE=1NYUZE8MLBVK_==4 +M'H%VB_8=N%7"^"63"^Y6`+Z-4+1UT>$KR]+ +MF"WY82&V"[M*H9M+/8-R:MF$DC%`HQ?S&)+;`%[Z]M1CAR[>=>2Z@WQ;F#92 +M+<%;B#8Y2K[81\)OL3G']-1P^[K:!@VM8E_QIFQ46918$=("PGD.B/!7`,6?W7Q9L +M/R7[H=NWV;'NLP*\?9Y_#F9`66R*;/MI3B^#+Y"TJ*W#8^6I:QI_*3)=,INJ +MRAH?$+0='4`]$_XEA[=E>(A/'9$-^7DBPG*>ERC[FC/'`CH4^*Z`-@7O\]SF +MG(J$>%DBEAH\5W#ZC3PF[#:2EZ'(!N;8#ZXF=UVWZ9!UQ_HV<>T@RD"WE&P: +MWD0L(221*':@\>[O=7"KPTN-9E5UK.S+?EL"FQ)=%94K&%-@.F]EGHB\9SE, +MK7/`YZR)B/JR!&+AZ3R,&H'35_T8 +M^]M(7X?J,O3GH3N/X&6"KS-]6SY>BF\0-6@O>*G57ZO"#]#VM:"",6=O)7P= +MJ=M[(U3NAP'?(@5:W^EC(6\?<7@!=OI>@ONV64^9^Y''NJ9YBY,^AN./^PQ< +M%OJTQ(??([O-R77.^IRQ.6PBI2(@(\(C3W\L"0G/HXC!Z)MYY/@]IZYY=RZ@ +MK,B.);4ONVT%;ZJK&G=U9AI*Q38(.VN&/J.XI6'KW3[:^-Z6UXXY=U'6)<>> +MWO?I +M[W_DX+7$LQHXM&1X$S=7\J_!,QI? +M[SUVG,'5WPJ.UU_PHZV"%^AQ*)V`TR_X..9VX''[,[[4W:;`]5]GFO0^J7L# +M9P6Z^V..5H/0)4+6'2MIDA/H]Z4'\]_H8V9O4WV=\$M@NJD]3<5QQ@XSN)_K +M[9QN4K=*6=!#FQ*3.C7G%VSQ![3=!(DC?&XJ]C7"0`//:D[Z` +MMU_[/LCE^65N;KU/`C00#DKR9:G83/,Q%"/+AY0/&1M".E)XK.'D-_&8J=N< +M7]*PUN;P$OE=Y#8YL,XSGWUK!&XY?\WQ:QY?"^I21)>2.I?1N<+"T)]J]E@_-/"A0??Q+A;;&&T;,@!G +MD*A-V6\*:ANYW&F)K(-.77'HN]V`;X=B/;9^@MQ4F9E7(+27Y&D&<$S#/ +M0?X+>A3LK6B"QO\LD,PJ^E21QZH[5/V^NJMNJR'/P$T5KRMD5:&^+%T)NB*U +M!63SWN2,R6$;"9MC+J=]'J^+`7+=KL&.;9<-_34UC]?RBT8M1:=,!)13/6[> +M<\H^2>X-W(/`W?KP^E$561BQ[[':S(7[T#_;_1&MBL', +ME*RRFL,U"FM?[;UZK8!+&6=%>2R8?9[O(K_Y?4G62^L7W*72I$:E0*:$IX*F +M.#4P?7FD_C9WE[G-YCZ(QV&&=M/-A*W&\JE<0ZS[4H8XTI&LC6G3XD"%#0CK +M7\RCIN\5=BO3:PE>BN="EC_ET#'BAQ_+_4+L%F:;TNW<;F9T,PT!RJ['QN@X!H!NO3(M8-N375KN%N5W$OJGM/W3ZFY3X?^W@FJ5&/W4@[=?TLG[C;PMXZY +M-=VM+FX5'6#H%MU^3RMXF]%=\O;6R1NORST;<9O +M3RM&MX&[]ORU(Z[MD(X#E/I+75YJ^%*QYS(YE_"YH+,\SG+\%+`C0L>_!*\* +M.+$@NP7?IOB_=)695*L4RY3S5#T7#J*4@_FK#$-^FP60/4]L-L;9T)P&`8Q@ +MUE%9RYT3<(W1O?Z&02V4ZIUOOQ3=ODB/17XJF%,A'][8'C\OT3&EAQD/O+P; +M;GMFTX:;6`5:6A?U*F*K3W.X&AO?=[YE?YMG9-XA+D&L+6D:U24S&Z#'2)J*(,HI!G/,=9!&CD\%^6`BTI7&"0OME[ +M2FXINLY-<(EL%N:"'&?\,-U/=U.]G9IG[\WT>H;6\V"KS($"'`CWD_/XOR[!";I>R +MW=QO9W0[TYNI?^X-3%=3[*=N:LR,ZAE2,R'FD,\5G?M@^2A5(/T:7!_>%NRR +M(-E2'I=^OX2[7R*^B>0J?*8\MGFF"U(6+2]!]M1\BZH(UE[X([1A#*\)/S?E +MJ8V/';KO^6V?;H9B-<9^(NV,/(=[J>6O$19YQXJ:ECFI!KN`*,&P%>:UZ^]] +M%1CQ.B67]/Q;!+*"/9;E(43&$.5;?-,UJR'P$V+G6B^<_)0#HA@^!R-5B>H& +MQ)_9(\'W)KBU];6MKAURZ[I[]SF%%OVEQFE-A9PO8Z\2%TC3=$+*-V;`S=#J +ML5,3+X/DS2R;\R<5I@ZF"*2O^)[R:ZK.J3NE[)C*?0IWJ=RD<)TZGS*7`KNP +M>J'5@LHE%DO$?XDLS9'@WKA@8)&`TE?P*(U)/?!R",4X@(DC,X)3_VRB7Z,7=<^C6U$'X3Q7Q:F!CHG8M]&N*S8# +MO!ZQL*@VI>:WR`9_DF4H:B'Y4MJ"I`OP`*,1A5,-Y@`L0XT_Y?PC_X)`D8.2 +M!V4%*P15*:Y"4J5532N.5@RM(%JVN!P*]Y6>__K<;#)]1/LO_M8WAP$+%*:& +MC(X,F'S!MRD)I3DNV>%O>;POJ5V-[A*UZX3,@0[3XQ*>_EYD64V=F^[20[>Q +M"J;_^$?^!<**1@V#VX2&@#L.A?=RH?0_<](65;"M=17LZO+0@%F,KS%X)%]1 +MHFF,9*Q-@Z_J>%=#IZJ]5/RC]&IQT?""TCGA([;]QR*D47F>@_OL3<*I(Q,@ +M)DB/H1N[U9AOQW8_X:>)/T_!;0X?Z3N`2XS_&=&\924E*E35K4ZH;3O7`ZL1 +M6T_E9K']5U[MRGQ?)X<6.O;D<4Q.@>'^G;-969_KXM(RUQZZ#]5C\HW!6:C= +M%P1#[7C?N3XZ]/6M_R))"%)#M!Z)PX1>9N2Q^&K0WW*>%K&H.IE`W44FF%K* +M[-_STE:-;7K;@VZ"W8*X?X0(7$4^\;ZCPQ*L)WHS=]LEV?\S#XY%=RKY<_E: +M08_J*X?5$*$9JUI15;K"71FO2WY;U(<"R_+TF@./Z,W#?RPT"8H]QVKFS92$ +M/EI/R&[B#V,4^/4R-K>)>TS>$9J2&69SRQ=&_C,2.D]M$?FR7=7$)@:[EMEW +MZ7$0G$R=9RR$AMN_N( +MZG^F7$V0'&K>\[3S<_NC0V#W73^>%377J;^DZ/*OG#R7R+G&SC$_M]2Y:\X# +M>@F1,L2TJ;C.P2W5MQ3>%_J^@(^E>BR_`?#OB(+(@0C`'/NY>X50GJ""1@6' +MBA"72$`Y7%;X2:^0U#BI*5(WI(%I`]"8T3CTG*$)9$G(I(PEBB6)"S?(DP3P +MA/"$/[4/&8HY)K[/`P,N2_Y_=\1N1?DO80>%?VH +M?2,@YC"AZ)D%!)Y;.@M)#,NA4CVM6_2Y>5VEMB0#]=E_+7&0J9#;W)2X*7>3 +MB713[:;>S;"?D__Y,7H^<)MJ@/(JVU3II@HV5;^NJ,"BZPI>AXXIZU4( +M[L%IB\(7F2]XEY?!5US.VARW$;21-O]:4K,$9NGT0N@%U2G6)74[O +MXJ=EMCVP;8-O6F'5"/K8=J-0G6[Y;6?N2%*6E=(4$+1"QX$[.6 +M(1V"NQYV">A]P$=/W'KLVL67CL_:^M2BQR8_Q&3?$+N:V5;`ML0W>;^.V#ID +MMM5\:WPG`8GS3^]CY1KWF?=7ZJO<5Z2O"5XBO`%\QKD)= +M!;F*L-7`'<+4G*X!7>>J+F7#B-CSV+($_,S[@+0@;GG8`JUO)H3^1PO=6_#6 +MXM4 +M9C-[FLC3B)T&^-0+:0>>.FT<2G5JB5-+GEKNU#*!%[(V>&[S]U#6A]D09&-_ +MFNC3C)]2<'H/\)D/3&@/97JHVGT]9$"Y:YIM&VT[9-.3Z[Y;#;P?(C]R8V`G +MR$R`GJHIE%,Q-6SJZ<22B<=CB\8(C3`<$C#\)AX#\.B+^W-?V0=@N+74$Z>? +MT9_>&_9>5X_:!P-5`*L(52"N_%<[Z=W[4NV68K>TNT5J=G.TGP8\U<]MMCXX +M=.6AQ9XG0S5U*K.L@,X1OKREX#H+_@?N0_SH_2"@2V&;H!9N0I(8\O0V\%-> +M+&M"WD*\[9][RCW(!H2.R`3/`J-9L/S.'B&.W0K^$@"]% +M[4K=4[+/^(`.)1YI./H(H1O?Q^0Z,><)R2;@]!1XM1^+W5AM1V(SA_0\M'X, +M5E.RFO_WT)G056`?R7T$#Y$Z1/P8T5..9SEVSLM+P5Z+]%YRC_(/$NP*U1!I +M*!JTM16R')!]J(9>C0.I>IT"\Q$QDT6Y;$]CY +MKA]M=6N+2SMK'9O/DZ!MXWDTY8,2EG51Y@6/#/VVP&3&T<2#T0=_#/#]9PBZ +MM)\G=%FB3PUWK,-CC1VJ:E\!^TJP?;`KBVT9;TMZ4R*;LEV7=1#&=<6O*FQ5 +MA<$(?9V$[.'BD!*":U/;"D5CIJ-T%^L>5WTM!TX,^0CP,6)C3)^;7B"L*@XM +M.09PC,#H&W\,Y7WHGH#-=AZR34K]0;JGM1R1,WNJ"5T6HREA6D*A1WB`LH2U!.A+W%!J$OK`_ +M;68N[TMQ^YY783$N%7ZN!=SRQR8]=-"^I[<#OAGYU83YF7F&O.=Y@I8_`L#G +M%,L36D"D8%!1PJ(&Q3?Q*`5[DKUJY.316HDN:1(]]#HP]>R:.I0VX_?\SUL:/V9;C[-D7; +MY+D_+8[1\7UACG-PFM+36)^&]C0`61]GW0[(.O;45J<6.+74L0F>DIRP?2)V +MB7Z>!,9D';-5`_@&<>V*XD#CF=O01Q&;Y#V)$T=JH2 +M3/P0V>N7YT!^`/)>@8'J607PJN-5*6I8UIRL`]50JJ%5PZA8JEBHF*@8A8>R +MP60]_(X0-2BJEE=H*`XK258DK(!90-9(TK>EH`L=LA*=:3H)_ZZC0\SZA/4$ +MZQC6"F3D>)V**I8E*0M<15"_+I"9&3.Q=NA=S_H.7C?1)J;;^JXJ]V5W*()3 +M`67/XYC+U^5U@6XIN*?J/B>/N7_,OB,PHS\9B8$I`-,/_9B0QT3=@\:-R&TD +MKD-P#538M^<>/W?)N8O/G7!UYZZZ].1UX$.^#"]#X5+AUZ*G=2*Z+F"%?2M* +MWPQ0C;?OI9"MGF43JV\16>6+(&"+KU!?\ZXN7`Q=(FT3V)8W+6;:X#GE':*[ +M@=Z=Z@K5HZJ'50^HOI-]$^9>#HPQH%WZ2WE]R5\?,^';OJN +M0(7"NH$)0RV!N@[U/1H"/#%HYM%P@&#!@X(&!0X*"!0@ +M*`2?*,C0E8\"?Q3*IY`L@EE`N@5HJO8`V]3.Z#M[:#ZN6U:YY\O@^?9&HK0+ZBX]) +MF#-JOBV4;?VG7#_)"T0"1!B^+W5H3+04>.G(0K.4B!"-9M),L1^K]9#N^CCT +M0=94UP9Y5#];6*0D,NQMCN6(!J,)?>GK:E4"FYS:OLZ#Q^_[^M`BQSB$97DJ +MD2QOLZ]+?IZK\Q1=0LI[SHN^]MRURYZ[AFUR;]M[BS^:]M'\PD%B0<)A+&&, +M48.BAD-U@.L,UR2N:5P-J0F0*B%532J>5`"M4EI]KBBK.5:3O(Y%W8F@)[%2 +M,=EP@L`5A"L/C-/%+[F(G'A#Z&X-%3`7OO#7XKDVN>7][F +M[#PRIZXZQF9?P;L\2B8&PMWM'GRNS4U:&O,UERXNIIU`4]JSE?UJ@+6E4`6=%.RFR+=%NPV +M[[8YLPTK&>%M!#RV_?P[CWG +M-NW_/XQ1J$\D'A%\1/(>J5LDKCEVR 3071) + y = 3071; + if (x > 4095) + x = 4095; + hiy = (y >> 7) & 0x1f; + loy = (y >> 2) & 0x1f; + hix = (x >> 7) & 0x1f; + lox = (x >> 2) & 0x1f; + eb = (x & 3) | ((y & 3) << 2); + + if (hiy != lhiy) + SC(hiy | 0x20); + if (eb != leb) + SC( eb | 0x60); + if (eb != leb || loy != lloy || hix != lhix) + SC(loy | 0x60); + if (hix != lhix) + SC(hix | 0x20); + SC(lox | 0x40); + lhiy = hiy; + lhix = hix; + lloy = loy; + leb = eb; +} + +void +tek4014_pen(void) +{ + SC(29); +} + +void +tek4014_text(void) +{ + SC(31); +} + +void +tek4014_curve(unsigned x, unsigned y, int *p, unsigned len, int scalex, int scaley) +{ + int i; + + tek4014_pen(); + tek4014_coord(0, y); + tek4014_coord(50, y); + tek4014_pen(); + for (i = 0; i < len; i++) + tek4014_coord(i * scalex + x, y + p[i] / scaley); +} diff --git a/tek4014-2.c b/tek4014-2.c new file mode 100644 index 0000000..d836c5f --- /dev/null +++ b/tek4014-2.c @@ -0,0 +1,324 @@ +/* $Id$ */ + +#include +#include +#include + +#define TEKHEIGHT 3072 +#define TEKWIDTH 4096 + +#define FIVEBITS 037 +#define HIBITS (FIVEBITS << SHIFTHI) +#define LOBITS (FIVEBITS << SHIFTLO) +#define SHIFTHI 7 +#define SHIFTLO 2 +#define TWOBITS 03 + +#undef GS +#undef RS +#undef US + +#define GS 0x001D +#define RS 0x001E +#define US 0x001F + +/* + * Switch to/from tek4014/vt100 mode. + */ +static void +tek_enable(int flag) +{ + if (flag) + do_csi("?38h"); + else + esc("\003"); +} + +/* + * Switch to GIN (graphics-in) mode. + */ +static void +tek_GIN(void) +{ + esc("\032"); +} + +/* + * Switch back to alpha (text) mode. + */ +static void +tek_ALP(void) +{ + printf("%c", US); +} + +/* + * Select a font + */ +static void +tek_font(int code) +{ + switch (code) { + case 1: + esc("8"); /* large */ + break; + case 2: + esc("9"); /* #2 */ + break; + case 3: + esc(":"); /* #3 */ + break; + default: + esc(";"); /* small */ + break; + } +} + +/* + * Decode 2 bytes from a mouse report as a coordinate value. + */ +static int +tek_coord(char *report, int offset) +{ + int hi = FIVEBITS & CharOf(report[offset]); + int lo = FIVEBITS & CharOf(report[offset + 1]); + return (hi << 5) + lo; +} + +/* + * Send coordinates for a single point. xterm reads this info in getpoint(). + * There are several possibilities for encoding the coordinates. + */ +static void +tek_point(int pen, int y, int x) +{ + char temp[20]; + + if (pen) { + sprintf(temp, "%c\007", GS); + } else { + sprintf(temp, "%c", GS); + } + sprintf(temp + strlen(temp), "%c%c%c%c%c", + 0x20 | (((y & HIBITS) >> SHIFTHI) & FIVEBITS), + 0x60 | (((y & TWOBITS) << SHIFTLO) | (x & TWOBITS)), /* tests/sets lo_y */ + 0x60 | (((y & LOBITS) >> SHIFTLO) & FIVEBITS), /* sets lo_y */ + 0x20 | (((x & HIBITS) >> SHIFTHI) & FIVEBITS), + 0x40 | (((x & LOBITS) >> SHIFTLO) & FIVEBITS)); /* must be last */ + fprintf(stdout, "%s", temp); + if (LOG_ENABLED) { + fprintf(log_fp, "*Set point (%d,%d)\n", y, x); + fputs("Send: ", log_fp); + put_string(log_fp, temp); + fputs("\n", log_fp); + } +} + +static void +tek_linestyle(int style) +{ + char temp[10]; + sprintf(temp, "%c", 0x60 + style); + esc(temp); +} + +static void +log_mouse_click(char *report) +{ + if (LOG_ENABLED) { + int new_x = tek_coord(report, 1); + int new_y = tek_coord(report, 3); + fprintf(log_fp, "Report: "); + if ((report[0] & 0x80) != 0 + && strchr("lmrLMR", report[0] & 0x7f) != 0) { + fprintf(log_fp, "mouse %c", report[0] & 0x7f); + } else { + fprintf(log_fp, "key %d", CharOf(report[0])); + } + fprintf(log_fp, " (%d,%d)\n", new_y, new_x); + fflush(log_fp); + } +} + +/* + * Clear the display + */ +static int +tek_clear(MENU_ARGS) +{ + tek_enable(1); + esc("\014"); + tek_enable(0); + return FALSE; +} + +static int +tek_hello(MENU_ARGS) +{ + int n; + + tek_clear(PASS_ARGS); + + tek_enable(1); + for (n = 0; n < 4; ++n) { + tek_font(n); + println("Hello world!\r"); + } + tek_enable(0); + return FALSE; +} + +/* + * Wait for a mouse click, printing its coordinates. While in GIN mode, we + * may also see keys pressed. Exit the test when we see the same event twice + * in a row. + */ +static int +tek_mouse_coords(MENU_ARGS) +{ + char *report; + char status[6]; + int new_x = -1; + int new_y = -1; + + tek_clear(PASS_ARGS); + + tek_enable(1); + set_tty_raw(TRUE); + set_tty_echo(FALSE); + + report = ""; + println("Any key or mouse click twice to exit..."); + do { + strncpy(status, report, 5)[5] = 0; + /* + * The graphics-in mode is reset each time users send a mouse click. So we + * set it in the loop. + */ + tek_GIN(); + log_mouse_click(report = instr()); + new_x = tek_coord(report, 1); + new_y = tek_coord(report, 3); + /* + * If we do not start a new line after reading the mouse, we will see no + * text. So we do it before the rest of the report rather than after. + */ + printf("\r\n"); + if ((report[0] & 0x80) != 0 + && strchr("lmrLMR", report[0] & 0x7f) != 0) { + printf("mouse %c:", report[0] & 0x7f); + } else { + printf("key: %d", CharOf(report[0])); + } + printf(" (%d,%d)", new_y, new_x); + fflush(stdout); + } while (strcmp(report, status)); + + tek_ALP(); + restore_ttymodes(); + tek_enable(0); + return FALSE; +} + +/* + * Wait for a mouse click, drawing a line point-to-point from each click. + * Ignore keys pressed. Exit the test when we see the same event twice + * in a row. + * + * xterm pretends the screen is 4096 by 3072 (height by width). So the lines + * appear in the lower-right of the screen. Since we cannot ask xterm how + * large the screen actually is, we do not try to (cannot) scale the lines. + */ +static int +tek_mouse_lines(MENU_ARGS) +{ + char *report; + char status[6]; + int old_x = -1; + int old_y = -1; + int new_x = -1; + int new_y = -1; + + tek_clear(PASS_ARGS); + + tek_enable(1); + set_tty_raw(TRUE); + set_tty_echo(FALSE); + + report = ""; + println("Any mouse click twice to exit..."); + do { + strncpy(status, report, 5)[5] = 0; + if (old_x >= 0 && old_y >= 0) { + tek_point(0, old_y, old_x); + tek_point(1, new_y, new_x); + fflush(stdout); + } + old_x = new_x; + old_y = new_y; + tek_GIN(); + log_mouse_click(report = instr()); + new_x = tek_coord(report, 1); + new_y = tek_coord(report, 3); + } while (strcmp(report, status)); + + restore_ttymodes(); + tek_enable(0); + return FALSE; +} + +/* + * Draw a grid using a different line-type for each line, if possible. + */ +static int +tek_grid_demo(MENU_ARGS) +{ + int y, x; + int style = 0; + + tek_clear(PASS_ARGS); + tek_enable(1); + for (y = 0; y <= TEKHEIGHT; y += TEKHEIGHT / 16) { + tek_linestyle(style++ % 4); + tek_point(0, y, 0); + tek_point(1, y, TEKWIDTH - 1); + } + for (x = 0; x <= TEKWIDTH; x += TEKWIDTH / 16) { + tek_linestyle(style++ % 4); + tek_point(0, 0, x); + tek_point(1, TEKHEIGHT - 1, x); + } + tek_ALP(); /* flush the plot */ + tek_enable(0); + return FALSE; +} + +/* + * The common versions of xterm (X11R5, X11R6, XFree86) provide a Tektronix + * 4014 emulation. It can be configured out of XFree86 xterm, but that fact is + * ignored by the cretins who quote rxvt's misleading manpage. (The emulation + * if unused accounts for 30kb of shared memory use). + * + * Other than its association with xterm, these tests do not really belong + * in vttest, since the Tektronix is not even an ANSI terminal. + */ +int +tst_tek4014(MENU_ARGS) +{ + static MENU my_menu[] = { + { "Exit", 0 }, + { "Clear screen", tek_clear }, + { "'Hello World!' in each font", tek_hello }, + { "Get mouse-clicks, showing coordinates", tek_mouse_coords }, + { "Get mouse-clicks, drawing lines between", tek_mouse_lines }, + { "Draw a grid", tek_grid_demo }, + { "", 0 } + }; + + do { + vt_clear(2); + title(0); println("XTERM/tek4014 features"); + title(2); println("Choose test type:"); + } while (menu(my_menu)); + return MENU_NOHOLD; +} diff --git a/tekpot.c b/tekpot.c new file mode 100644 index 0000000..81c5fd1 --- /dev/null +++ b/tekpot.c @@ -0,0 +1,284 @@ +/* $Id$ */ +/* + * Copyright (c) 2009 Dimitri Sokolyuk + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include +#include + +typedef struct point Point; +typedef struct patch Patch; + +struct point { + float x, y, z; +} *point, *ppoint, max; + +struct patch { + int p[16]; +} *patch, *ppatch; + +int tekheight = 3072; +int tekwidth = 4096; +int npoints = 100; + +void +sc(char c) +{ + putchar(c); +} + +void +ss(char *s) +{ + while (*s) + putchar(*s++); +} + +void +tekenable(int flag) +{ + if (flag) { + sc(27); ss("[?38h"); + } else { + sc(27); sc(003); + } +} + +void +tekclear() +{ + tekenable(1); + sc(27); sc(014); + tekenable(0); +} + +void +tekpen(int flag) +{ + if (flag) { + sc(29); sc(007); + } else { + sc(29); + } +} + +void +tekcoord(unsigned int x, unsigned int y) +{ + unsigned char lox, loy, hix, hiy, eb; + static unsigned char lloy = -1, lhix = -1, lhiy = -1, leb = -1; + + if (y >= tekheight) + y = tekheight - 1; + if (x >= tekwidth) + x = tekwidth - 1; + hiy = (y >> 7) & 0x1f; + loy = (y >> 2) & 0x1f; + hix = (x >> 7) & 0x1f; + lox = (x >> 2) & 0x1f; + eb = (x & 3) | ((y & 3) << 2); + + if (hiy != lhiy) + sc(hiy | 0x20); + if (eb != leb) + sc(eb | 0x60); + if (eb != leb || loy != lloy || hix != lhix) + sc(loy | 0x60); + if (hix != lhix) + sc(hix | 0x20); + sc(lox | 0x40); + lhiy = hiy; + lhix = hix; + lloy = loy; + leb = eb; +} + +void +loadpatch(char *filename, int *patches, int *verticles) +{ + int ii, jj; + float x, y, z; + int a, b, c, d; + FILE *fd; + + fd = fopen(filename, "r"); + if (!fd) + err(1, "can't open %s", filename); + + fscanf(fd, "%i\n", patches); + + patch = calloc(*patches, sizeof(Patch)); + if (!patch) + err(1, "can't allocate memory"); + ppatch = patch; + + for (ii = 0; ii < *patches; ii++) { + jj = 0; + a = 0; + b = 0; + c = 0; + d = 0; + fscanf(fd, "%i, %i, %i, %i,", &a, &b, &c, &d); + ppatch->p[jj++] = --a; + ppatch->p[jj++] = --b; + ppatch->p[jj++] = --c; + ppatch->p[jj++] = --d; + fscanf(fd, "%i, %i, %i, %i,", &a, &b, &c, &d); + ppatch->p[jj++] = --a; + ppatch->p[jj++] = --b; + ppatch->p[jj++] = --c; + ppatch->p[jj++] = --d; + fscanf(fd, "%i, %i, %i, %i,", &a, &b, &c, &d); + ppatch->p[jj++] = --a; + ppatch->p[jj++] = --b; + ppatch->p[jj++] = --c; + ppatch->p[jj++] = --d; + fscanf(fd, "%i, %i, %i, %i\n", &a, &b, &c, &d); + ppatch->p[jj++] = --a; + ppatch->p[jj++] = --b; + ppatch->p[jj++] = --c; + ppatch->p[jj++] = --d; + ++ppatch; + } + + fscanf(fd, "%i\n", verticles); + + point = calloc(*verticles, sizeof(Point)); + if (!point) + err(1, "can't allocate memory"); + ppoint = point; + + max.x = 0; + max.y = 0; + max.z = 0; + + for (ii = 0; ii < *verticles; ii++) { + fscanf(fd, "%f, %f, %f\n", &x, &y, &z); + ppoint->x = x; + if (abs(x) > max.x) + max.x = abs(x); + ppoint->y = y; + if (abs(y) > max.y) + max.y = abs(y); + ppoint->z = z; + if (abs(z) > max.z) + max.z = abs(z); + ++ppoint; + } + + fclose(fd); +} + +int +rnd(float f) +{ + if (f > 0) + f += 0.5; + else + f -= 0.5; + + return (int)f; +} + +void +rotx(Point *p) +{ + p->y = 0.5 * p->y + 0.866 * p->z; + p->z = -0.866 * p->y + 0.5 * p->z; +} + +void +project(Point *p) +{ + float d = 100 * max.z; + float zoom = 1000; + + rotx(p); + + p->x *= d/(2*d - p->z); + p->y *= d/(2*d - p->z); + + p->x *= zoom; + p->y *= zoom; + + p->x += tekwidth/2; + p->y += tekheight/3; + + tekcoord(rnd(p->x), rnd(p->y)); +} + +void +vec(Point *a, Point *b, float lambda) +{ + a->x += lambda*(b->x - a->x); + a->y += lambda*(b->y - a->y); + a->z += lambda*(b->z - a->z); +} + +void +bezier(Patch *pp, int step, int steps) +{ + Point p[16]; + int i, j, k; + float s = (float)step/(float)steps; + + for (i = 0; i < 16; i++) { + k = pp->p[i]; + p[i].x = point[k].x; + p[i].y = point[k].y; + p[i].z = point[k].z; + } + + for (i = 15; i > 0; i--) + for (j = 0; j < i; j++) + vec(&p[j], &p[j + 1], s); + + project(p); +} + +void +usage() +{ + extern char *__progname; + + fprintf(stderr, "usage: %s datafile\n", __progname); + + exit(1); +} + +int +main(int argc, char **argv) +{ + int patches, verticles; + int i, j; + + if (argc != 2) + usage(); + + loadpatch(*++argv, &patches, &verticles); + + tekclear(); + tekenable(1); + for (i = 0; i < patches; i++) { + tekpen(0); + for (j = 0; j < npoints; j++) + bezier(&patch[i], j, npoints); + tekpen(1); + } + tekenable(0); + + return 0; +} -- cgit v1.2.3