perm filename GEOMED.DOC[GEO,BGB] blob sn#019099 filedate 1973-01-11 generic text, type T, neo UTF8

00100 SAILON NUMBER 68 GEOMED MANUAL 00200 00300 00400 STANFORD ARTIFICIAL INTELLIGENCE LABORATORY MAY 1972 00500 OPERATING NOTE NUMBER 68 00600 00700 00800 GEOMED - A GEOMETRIC EDITOR. 00900 01000 01100 Bruce g. Baumgart 01200 01300 01400 ABSTRACT: 01500 01600 GEOMED is for making and editing polyhedra and so may be 01700 characterized as a 3D drawing program. 02000 02100 CONTENTS 02200 02300 02400 INTRODUCTION. 02500 02600 POLYHEDRONS. 02700 02800 COMMANDS. 02900 03000 REPRESENTATIONS. 03100 03200 EXAMPLES. 03300 03400 APPENDICES. 00100 INTRODUCTION - 1971 of GEOMED-II. 00200 00300 GEOMED itself is for making and editing polyhedra. However 00400 the larger goal I had in mind when undertaking GEOMED was to achieve 00500 a means of entering 3D data into the computer to form a World Model, 00600 so that a synthetic image could be generated to be compared, 00700 contrasted and correlated with real images. 00800 00900 GEOMED can now do about all that I need from it for the 01000 moment, the demands of the larger goal now seem to lie in comparing, 01100 contrasting and correlating images as well as projecting 2D blobs 01200 into 3D bodies, solving for camera locations and orientations and 01300 pushing the cart hardware around. 01400 01500 A binary dump copy of GEOMED can be started by typing R 01600 GEOMED at a III display. The source files of GEOMED are filed under 01700 the pppn [GEO,BGB] and may either be on the DSK or on the cart 01800 project UDP. The GEOMED of 1971 was written in SAIL and did use 01900 SAIL's associative data structure facility, LEAP. 02000 02100 02200 INTRODUCTION - 1972 of GEOMED-IV. 02300 02400 GEOMED has been rewritten twice again now, the third version 02500 involved getting GEOMED's models out of LEAP and into the "Winged 02600 Edged" data structure that was orginally developed for the hidden 02700 line eliminator, OCCULT. The fourth version was started as a 02800 conversion to NEW SAIL, but the pain of being a guinea pig to frequent 02900 and poorly thought out compiler changes coercised me to convert GEOMED 03000 into the PDP-10's machine code, using the FAIL assembler. 03100 03200 03300 03400 Abbreviations 03500 wrt with respect to 03600 pdl push down list 03700 ccw counter clockwise 03800 cw clockwise 03900 α control key 04000 β meta key 04100 ε meta control keys 00100 POLYHEDRONA & THE SCHLEGEL DIAGRAM. 00200 00300 "Leonardo da Vinci made skeletal models of polyhedra, using 00400 strips of wood for their edges and leaving the faces to be imagined. 00500 When such a model is seen in perspective from a position just outside 00600 the center of one face, this face appears as a large polygon with all 00700 the remaining faces filling its interior. Such a drawing of the 00800 solid is called a Schlegel Diagram." 00900 01000 "The Schlegel diagram for a polyhedron shows at a glance 01100 which vertices belong to which edges and faces. Each face appears as 01200 a region bounded by edges, except the `initial' face, which encloses 01300 all the others. To ensure a one-to-one correspondence between faces 01400 and regions we merely have to associate the initial face with the 01500 infinite exterior region." 01600 01700 - page 152, Coxeter's Geometry. 00100 POLYHEDRA - THE EULER EQUATION. 00200 00300 "Any polyhedron that can be represented by a Schlegel diagram 00400 is said to be `simply connected' or `Eulerian', because its numerical 00500 properties satisfy Euler's formula: 00600 00700 F - E + V = 2 00800 00900 which is valid not only for the Schlegel diagram of such a 01000 polyhedron, but for any connected `map' formed by a finite number of 01100 points and line segments decomposing a plane into non-overlapping 01200 regions: the only restriction is that there must be at least one 01300 vertex. 01400 01500 "A proof resembling Euler's may be expressed as follows. Any 01600 connected map can be built up, edge by edge, from the primitive map 01700 that consists of a single isolated vertex. At each stage, the new 01800 edge either joins an old vertex to a new vertex, or joins two old 01900 vertices. In the former case, V and E are each increased by 1 while F 02000 is unchanged; in the latter, V is unchanged while E and F are each 02100 increased by 1. In either case, the combination F-E+V is unchanged. 02200 At the beginning, when there is only one vertex and one region 02300 (namely, all the rest of the plane), we have 02400 02500 F - E + V = 1 - 0 + 1 = 2. 02600 02700 "This value 2 is maintained throughout the whole construction. 02800 Thus, Euler's formula holds for every plane map. In particular, it 02900 holds for every Schlegel diagram, and so for every simply connected 03000 polyhedron." 03100 03200 - page 152, Coxeter's Geometry. 03300 03400 03500 03600 Euler's formula can be extended for polyhedra that are allowed to 03700 have Holes or Handles: 03800 03900 F - E + V = 2 - 2*H 04000 04100 GEOMED commands preserve the above formula, so consequently all 04200 GEOMED polyhedrons are Topologically Eulerian. 00100 COMMANDS. 00200 00300 00400 GEOMED is invoked by single character commands. Commands that 00500 require arguments refer to the topmost positions of a scratch pad 00600 pushdown list. The commands fall into five major groups: 00700 00800 00900 GROUP - 1. 01000 The Four Primitive Topology Commands. 01100 V - Vertex Body Creation. 01200 E - Edge and Vertex Creation. 01300 J - Join two old vertices forming a new edge and face. 01400 G - Glue two faces together. 01500 01600 01700 GROUP - 2. 01800 Compound Topology Commands. 01900 K - Delete. 02000 S - Sweep. 02100 M - Midpoint of an edge creation. 02200 αR - Rotational solid completion. 02300 02400 02500 GROUP - 3. 02600 Geometric Commands. 02700 Translation. 02800 Rotation. 02900 Dilation. 03000 Reflection. 03100 ...on 3 axes: x, y, and z; 03200 ...in 2 directions + or -, ccw or cw, more or less; 03300 ...wrt a frame of reference: World Frame, Body Frame, Relative Frame. 03400 ...wrt a strength of transformation, 1 foot, 20 degrees, 16 percent. 03500 03600 03700 GROUP - 4. 03800 The Scratch Pad PDL Commands. 03900 push, pop, swap, get, and so on. 04000 04100 04200 GROUP - 5. 04300 The Input, Output and Display Commands. 00100 COMMANDS - GROUP 1. 00200 00300 THE FOUR PRIMITIVE TOPOLOGY COMMANDS. 00400 00500 00600 V - VERTEX BODY CREATION. 00700 00800 This command creates a polyhedron consisting of one vertex 00900 and one face. The vertex is placed at the world origin. Every 01000 polyhedron is derived from a Vertex Body. The terms "body" and 01100 "polyhedron" are equivalent in GEOMED. 01200 The V command takes no arguments and leaves the new body, 01300 face and vertex on the stack with the vertex on top. 01400 01500 01600 E - EDGE AND VERTEX CREATION. 01700 01800 This command creates a new edge and a new vertex starting 01900 from an old vertex. The E command requires two arguments, the top 02000 argument is the old vertex and the second argument must be one of the 02100 faces to which the vertex belongs. The new edge and vertex become 02200 associated with the given face. 02300 The E command, increments the NCNT, which is mentioned 02400 elsewhere, and is used to form solids of rotation. 02500 02600 02700 J - JOIN OLD VERTICES - FACE AND EDGE CREATION. 02800 02900 This command creates a new face and a new edge. The J 03000 command has two forms. The general form of the J command expects two 03100 vertices of the same face to be given on the top of the pdl, and it 03200 returns in their place a new edge and a new face with the edge on 03300 top. 03400 The wire form of the J command applies only to a face that 03500 doesn't have a closed perimeter, which in fact approximates a wire 03600 with two ends free. In this case the top argument is a Vertex End of 03700 the wire and the second argument is the Face of the wire. The wire J 03800 command returns the other end of the wire in top and leaves the 03900 second argument unchanged. The J command clears the NCNT. 04000 04100 04200 G - GLUE TWO FACES TOGETHER. 04300 04400 This command takes two faces from the top of the pdl. The 04500 faces must be nearly coincidant and of opposite orientation. The two 04600 faces are deleted along with all the edges and vertices of one of 04700 them. If there were two bodies, then one remains. A body glued to 04800 itself forms either a hole or a handle. When the glue drys, the 04900 resulting body is returned. 00100 COMMANDS - GROUP 2. 00200 00300 COMPOUND TOPOLOGY COMMANDS. 00400 00500 00600 D - DELETE. 00700 00800 This command takes the top body, face, edge or vertex and 00900 deletes all parts of the body to which it belongs. The camera body 01000 and NIL will not be deleted. 01100 01200 01300 S - SWEEP. 01400 01500 This command sweeps a face into either a sheet or a solid 01600 depending on the NCNT. If the NCNT is zero, then SWEEP returns a new 01700 face coincident with the given face and connected to it by new sweep 01800 edges and rectangular sweep faces forming a prism. Furthermore, a β 01900 sweep forms a pyramid on the given face and returns the peak vertex, 02000 while α sweep and ε sweep form antiprisms. An antiprism is merely a 02100 prism with the rectangular sweep faces split into triangles. 02200 When the NCNT is non-zero, only the first NCNT edges of the 02300 argument face's perimeter are swept into new faces. Thus NCNT new 02400 faces are created and the argument face is returned somewhat more 02500 complicated than before. See the SPHERE example to clarify sweeping 02600 out a solid of rotation. 02800 02900 03000 R - Rotational Solid Completion. 03100 03200 After a wire has been swept around, you have a shell of 03300 rotation. To change a shell into a solid all that remains to be done 03400 is do a series of J commands on the leading and lagging vertices of 03500 the shell. The R command, using the NCNT to step around the pole 03600 caps, calls the J-command for all the necessary pairs. The sweep face 03700 is taken as an argument and nothing is returned. 03800 03900 04000 M - MIDPOINT. 04100 04200 This command takes an edge argument and creating a new edge 04300 and a new vertex makes the appropriate modifications to the body and 04400 returns a the midpoint vertex of the given edge. 00100 COMMANDS - GROUP 3. 00200 00300 HOMEOMORPHIC COMMANDS. 00400 00500 "The criterion that distinguishes one geometry from another 00600 is the group of transformations under which the propositions 00700 remain true." - Klein's Erlangen Program, 1872. 00800 00900 The Euclidean Transformations are Translation, Rotation, Reflection 01000 and Dilation. Homeomorphic is Greek for "same form", and refers to 01100 the so called "rubber sheet" transformations that do not change the 01200 topology of faces, edges and vertices. The Top of the scratch pad pdl 01300 is transformed by hitting one of the following Euclidean Transform 01400 characters: 01500 01600 : Transform in the positive direction wrt the X-axis. 01700 ; Transform in the negative direction wrt the X-axis. 01800 ) Transform in the positive direction wrt the Y-axis. 01900 ( Transform in the negative direction wrt the Y-axis. 02000 * Transform in the positive direction wrt the Z-axis. 02100 - Transform in the negative direction wrt the Z-axis. 02200 02300 Clearly these characters are not mnemonics, they were chosen because 02400 they do not require the TOP key and are conveniently grouped in pairs 02500 under one's right hand. 02600 02700 The Transform is selected by keying the control bits or or prefixing 02800 the command with a control key character of suffering a preselected 02900 default Transform: 03000 03100 default - usually TRANSLATION. 03200 α ROTATION. 03300 β DILATION. 03400 ε REFLECTION. 03500 03600 03700 The Euclidean Transformation default selection characters are: 03800 03900 ! TRANSLATION. 04000 @ ROTATION. 04100 = DILATION. 04200 ∃ REFLECTION. 00100 COMMANDS - GROUP 3 - continued. 00200 00300 Euclidean Transformations. 00400 00500 Translation moves the Top object in the direction specified 00600 by one unit of translation strength. Similairly Rotation rotates the 00700 Top object about the axis specified by one unit of rotational strength. 00800 Positive Rotations are ccw and negative rotations are cw. 00900 01000 Dilations refer to a three state dilation axis selector. 01100 Dilation state 1 causes dilation on the specified axis, dilation 01200 state 2 causes dilation on the two axes not indicated, and dilation 01300 state 3 causes dilation on all the axis indicated. The dilation 01400 selector is advanced by typing the letter A, Advance Axis Selector. 01500 The state of the dilation axis selector is displayed as a digit 1, 2 01600 or 3 just to the right of the dilation strength's per cent sign in 01700 the editor status display at the upper right of the III screen. 01800 01900 And finally, Reflections act only on the axis specified and 02000 always in the world frae of reference. I have found little use for 02100 reflections and consquently their power has atrophied. 00100 COMMANDS - GROUP 3 - continued. 00200 00300 Frames of Reference 00400 00500 00600 The Frame of Reference of the Euclidean Transformations 00700 is determined by the FRAME switch. 00800 FRAME 0 is the world frame. 00900 FRAME 1 is the body frame. 01000 FRAME 2 is the relative frame. 01100 The Frame switch is incremented modulo 3 by the F-command. 01200 01300 The body frame of a body is its datum. 01400 01500 The body frame of a face is a frame of reference with a 01600 z-axis thru the center of mass of the face and pointing out the 01700 exterior side of the face normal to the plane of the face. 01800 01900 The body frame of a face is computed by placing an origin at 02000 the face's average vertex (a pseudo center of mass), and by extending 02100 the i-unit-vector from the origin towards the first vertex of the 02200 face's perimeter list, the k-unit-vector is normal to the plane of 02300 the face, as determined by the first three points of the perimeter 02400 list, and points outwards from the face's exterior side. The 02500 j-unit-vector is the k-unit-vector crossed into 02600 the i-unit-vector for right handedness. 02700 02800 The body frame of an edge or vertex is taken from the body to 02900 which it belongs. 03000 03100 Transformation in the Relative frame of reference transform 03200 the Top object wrt to body frame of reference of the second object on 03300 the PADPDL. If the second object doesn't exist or isn't a body then 03400 the world frame is used. 00100 COMMANDS - GROUP 3 - continued. 00200 00300 Strength of Transformation 00400 00500 The strength of a Euclidean Transformation can be halved or 00600 doubled by keying the Transform's control bits and by striking 00700 a left or right square bracket respectively. 00800 00900 / Halve a Transformation Strength. 01000 \ Double a Transformation Strength. 01100 01200 The strength of a Euclidean Transformation can be set by keying the 01300 Transform's control bits and by striking a digit from 0 to 9. 01400 01500 For Translation: 01600 0 1/16 of a foot, A "binary inch". 01700 4 One Foot. 01800 9 32 Feet. 01900 N Where 0 ≤ N ≤ 9 yield 2.0↑(N-4) feet, 02000 but you only need to memorize the 0,4,9 in 02100 order to keep your head straight. 02200 For Rotation: 02300 9 π/2 02400 8 π/4 02500 etc 02600 For Dilation: 02700 0 100% 02800 1 10% 02900 2 20% 03000 etc 03100 9 90% 00100 COMMANDS - GROUP 3 - continued. 00200 00300 Setting the Strengths 00400 00500 The strengths of the Euclidean Transformations can be entered 00600 numerically by typing λ,π or % followed by a numerical argument. In 00700 command formats given below x & y are scanned as real numbers, while 00800 n, m, d & s are scanned as integers. Integers can be typed in place 00900 of reals with no ill affect, whereas reals typed for integers are 01000 Fixed. 01100 01200 For Translation: 01300 λx feet. Initially set to 1 foot. 01400 λx' feet. 01500 λx'y" feet and inches. 01600 λy" inches. 01700 For Rotation: 01800 π/m pi fraction. Initially set to π/4. 01900 πn/m pi fraction. 02000 πx radians. 02100 πd,m,s degrees, minutes, seconds of arc. 02200 For Dilation: 02300 %x 0.01 ≤ x ≤ 100.00. Divisions by zero are shunned. 02400 Initial set to 75% 02500 00100 COMMANDS - GROUP 4. 00200 00300 THE SCRATCH PAD PDL COMMANDS. 00400 00500 All GEOMED commands that require arguments refer to the top 00600 elements of an itemvar pushdown stack. The stack is displayed on the 00700 leftside of the III screen. The first element on the stack is called 00800 "TOP" or "ARG1", the second element will be called "ARG2", and the 00900 third element "ARG3". 01000 01100 ↑ POP the scratch pad pdl. 01200 ↓ PUSH the TOP of the scratch pad pdl onto the scratch pad pdl. 01300 01400 ↔ SWAP the TOP and ARG2. 01500 , SWAP TOP and ARG3. 01600 ~(tilde)SWAP ARG2 and ARG3. 01700 01800 . PUSH the camera body item onto the scratch pad pdl. 01900 02000 ⊗link Retrieve the Values of the link. Namely the set link⊗TOP is 02100 pushed onto the stack. 02200 `link Retrieve the Objects of the link. Namely the set link`TOP is 02300 pushed onto the stack. 02400 02500 → Cdr a perimeter list. To look at a perimeter of a face, get 02600 the face on the top of the stack and push it, then cdr along. 02700 ← UnCdr a perimeter list. 02800 02900 α↑ POP and then keep popping until a Body is on top 03000 or the stack becomes empty. 03100 β↑ Clear the stack. 03200 03300 Nstr Name the top body by the string str. 03400 Wstr Push the body named string str on the PADPDL. 03500 Wn Get the body, item numbered n. 03600 ? List all the bodies. 00100 COMMANDS - GROUP 5. 00200 00300 INPUT, OUTPUT AND DISPLAY COMMANDS. 00400 00500 O Output the top body of the PADPDL into a B3D file. 00600 I Input a B3D file to the PADPDL. 00700 P Output a PLT file of the current display. 00800 00900 GEOMED will ask the user for file names when they are needed. 01000 On B3D output if you wish to make a file of several bodies then you 01100 do not close the output when you are given the chance. 01200 01300 PLT Files can be plotted on the CALCOMP by running PLTVEC and 01400 answering it self explanatory questions. 01500 01600 01700 CO Camera location, orientation, focal and raster constants Output. 01800 CI Camera location, orientation, focal and raster constants Input. 01900 CP Camera focal and raster constants printed on the TTY. 02000 02100 02200 MODIFICATION OF CAMERA PARAMETERS 02300 02400 GEOMED's camera model is parameterized by three integers and 02500 three real numbers called respectively LDX, LDY, LDZ, PDX, PDY, and 02600 FOCAL. LDX and LDY are the logical raster half size and are 02700 initially 144 by 108, and represent half the number of rows and 02800 columns in the image. PDX and PDY are the physical raster half size, 02900 which is initially 5.3 by 4 millimeters and FOCAL is the focal length 03000 of the camera model and is initially 12.5 millimeters which 03100 corresponds to the wide angle lens that is on the cart. LDZ happens 03200 to always be 1000 and is inaccessibe to users. 03300 03400 αX LDX βX PDX 03500 αY LDY βY PDY 03600 03700 αF FOCAL 00100 INPUT-OUTPUT OF GEOMED COMMAND LANGUAGE EXTERNAL FILES 00200 00300 ⊂ - LEFT HORSE SHOE, OPEN COMMAND FILE. 00400 ⊃ - RIGHT HORSE SHOE, CLOSE COMMAND FILE. 00500 X - EXECUTE EXTERNAL COMMAND FILE. 00600 00700 The Examples at the end of this write up are in the FILE.GEO 00800 external command format. GEO files are written in ASCII mode 0, with 00900 or without line numbers. Lines without tabs are ignored and are 01000 presumed to be commentary. In a line with tabs all characters before 01100 the first tab are presumed to be sequence numbers or tags, all 01200 characters between the first tab and the second tab or end of line 01300 are executed as GEOMED commands. All characters beyond the second 01400 tab are presumed to be commentary. Thus the line format is: 01500 01600 TAG Operations Comment 01700 TAG Operations Comment 01800 TAG Operations Comment 01900 TAG Operations Comment 02000 02100 02200 For what it may be worth, the GEO file format is clearly a 02300 representation for polyhedrons and scenes of polyhedrons. At one time 02400 I considered it very significant that GEOMED commands were so utterly 02500 concise as compared to B3D files for the same object, and I had hoped 02600 that my robot could have a large dictionery of objects which would 02700 only be expanded into B3D when such an object was expected to be in 02800 view. 00100 COMMANDS - GROUP 5. 00200 00300 Editor Status Display 00400 00500 _ flip FLAGV, Display markings on the TOP object. 00600 All the vertices of the top object are marked with asterisks 00700 and if the object is a face the edges are marked by a perimeter 00800 serial number. 00900 01000 ∂ flip FLAGD, Display the datum of the TOP object. 01100 01200 ≡ flip FLAGED, Suppress the Editor Status Display. 01300 01400 ≠ flip FLAGRS, Suppress the main display refresh. 01500 01600 # output a screen full of carriage return line feeds. 01700 01800 L flip Label mode flag. 01900 00100 COMMANDS - GROUP 5. 00200 00300 Koloring and Fotometry. 00400 00500 K - KOLOR COMMAND. 00600 00700 The color command sets the parameters named RED, GREEN, BLUE, 00800 ALBEDO, SPECUL and LUMEN of a face datum. These six parameters are 00900 presently packed into a single word of six bytes and assume values 01000 between 0 and 100 (well really 0 to 63). The Kolor command takes a 01100 string argument which is an arbitrarily ordered concatenation of 01200 color words, where a color word begins with the initial letter of one 01300 of the six parameters (R, G, B, A, S, or L) followed by one or two 01400 digits. Thus: KOLORING ← G40 B60 would tend to give things a 01500 Turquoise appearance when Video Synthesized. 01600 Koloring can be applied to both faces and bodies, naturaly in the 01700 later case all the faces of that body are colored. 01800 01900 The approximate meanings of the Kolor and Fotometry coefficients are: 02000 RED - percent of intensity seen thru a red filter. 02100 GREEN - percent of intensity seen thru a green filter. 02200 BLUE - percent of intensity seen thru a blue filter. 02300 ALBEDO - equivalent to reflectance, per cent of light 02400 power out wrt light power into a face. 02500 SPECUL - per cent of "metalic-look", zero specul is 02600 diffuse Lambert law's cosine light scattering, 02700 100% specul will mirror the light source 02800 angle of incidence is equal to the angle of 02900 reflection law light scattering. 03000 LUMEN - per cent of "glows-in-the-dark", GEO bodies 03100 can not be light sources wrt to each other 03200 but a little luminousity models the appearance 03300 of an Ambient light level and diminishes that 03400 high-contrast 2001 deep-space look. 00100 TVCUT and TVHIDE 00200 00300 In order to generate a sixbit synthetic Television picture in 00400 the so called "Pingle" or ".DAT" or "Ten Word Header" format, Output 00500 the bodies you want, and the desired camera; then type "RU 00600 TVCUT[GEO,BGB]" and answer the easy questions having to do with file 00700 names; then type "RU TVHIDE[GEO,BGB]" and again give file names when 00800 asked. TVHIDE also may ask for other parameters, type zeroes to get 00900 default values. 00100 GEOMED'S POLYHEDRON REPRESENTATION 00200 Polyhedrons in LEAP 00300 00400 Bodies, Faces, Edges and Vertices are represented by items. 00500 In GEOMED only Bodies and Vertices have datums. The datum of a 00600 vertex is a real array [1:3] containing the x, y, and z coordinates 00700 of that vertex in feet wrt an arbitrary frame of reference called the 00800 World Frame. 00900 01000 The datum of a body is a real array [1:4,1:3] of which the fourth row 01100 is the locus of the body in world coordinates. The first three rows 01200 of the body datum contain the components of the i, j, and k unit 01300 vectors which determine the orientation of the body. 01400 01500 Body items are linked to Face, Edge, and Vertex items by Linking 01600 Items named BF, BE, and BV respectively: 01700 01800 BF⊗body≡face 01900 BE⊗body≡edge 02000 BV⊗body≡vertex 02100 02200 Face items are linked to Edge and Vertex items by linking items named 02300 FE and FV respectively: 02400 02500 FE⊗face≡edge 02600 FV⊗face≡vertex 02700 02800 Edge items are linked to Vertex items by a linking item named EV: 02900 03000 EV⊗edge≡vertex 03100 03200 Furthermore, Face items themselves are used to link edges and 03300 vertices in ccw order as seen from the exterior side of the face. 03400 The faces of solid bodies have two sides, an exterior side and an 03500 interior side. The canonical form of the perimeter list of a 03600 triangular face would include the following associations: 03700 03800 face⊗face≡vertex1, 03900 face⊗vertex1≡edge1 04000 face⊗edge1≡vertex2 04100 face⊗vertex2≡edge2 04200 face⊗edge2≡vertex3 04300 face⊗vertex3≡NIL 04400 04500 NIL is merely an item used to terminate perimeter lists. 04600 04700 GEOMED's linking items happened to come out going in the same 04800 direction as Hand Eye's linking items, namely from larger things to 04900 smaller. The correspondence is as follows: 05000 BF for FACE FE for BOUNDARY 05100 BE for LINE FV for CORNER 05200 BV for POINT EV for ENDPT 00100 GEOMED'S POLYHEDRON FILE FORMAT 00200 00300 B3D, Bodies in 3D, formated files are the primary product of 00400 the Geometric Editor. 00500 00600 A B3D file is written in binary mode and is composed of an 00700 arbitrary number of body blocks terminated by a zero word or an EOF 00800 condition. A body block is composed of a Body Header, a Table of 00900 Vertices, a Table of Edges and a Table of Face Perimeter Lists. 01000 01100 The Body Header must have at least three words. The first 01200 word must contain the Vertex Count, the second word must contain the 01300 Edge Count. Further words are optional for Input to GEOMED. GEOMED 01400 outputs The last 12 words contain the Body's Datum. 01500 01600 The Table of Vertices is made up of 3-word blocks containing 01700 the x, y, and z World Coordinates of each vertex of the body. The 01800 Table of Edges has 1-word per edge. Each half of an edge word 01900 contains a non-zero positive integer which is the number of a vertex 02000 in the vertex table. 02100 02200 The Table of Face perimeter lists consists of variable length 02300 blocks of Perimeter Words which are prefixed by a zero word. Each 02400 Perimeter Word contains two non-zero positive integers which 02500 represent a Vertex Table Number and an Edge Table Number and are 02600 stored in the left and right halves respectively. As mentioned 02700 above, the end of the body block, which is also the end of the Table 02800 of Face Perimeter Lists, is marked by a -1 word. 00100 SUMMARY OF THE B3D FILE FORMAT 00200 00300 begin "body block" 00400 α BODY HEADER - The minimal body header consists of XWD -1,3 ↔ M ↔ N; 00500 XWD -1,WRDCNT; α BODY DELIMITER, WRDCNT = NUMBER OF WORDS IN THE HEADER; 00600 INTEGER M; α NUMBER OF VERTICES IN THIS BODY; 00700 INTEGER N; α NUMBER OF EDGES IN THIS BODY; 00800 SIXBIT BNAME; α NAME OF THE BODY OR ZERO; 00900 REAL RADIUS; α MAXIMUM DISTANCE BETWEEN A VERTEX AND THE BODY'S ORIGIN; 01000 REAL ARRAY BDATUM[1:4,1:3]; α THE BODY'S DATUM - ORIENTATION/LOCATION MATRIX; 01100 01200 α TABLE OF VERTICES; 01300 REAL X1,Y1,Z1; 01400 REAL X2,Y2,Z2; 01500 etc. 01600 REAL Xm,Ym,Zm; 01700 01800 α TABLE OF EDGES; 01900 XWD I1,J1; α I's & J's are vertex table indices; 02000 XWD I2,J2; 02100 etc. 02200 XWD In,Jn; 02300 02400 α TABLE OF FACES; 02500 begin "face block" 02600 02700 α face header - the minimal face header consists of XWD -2,1; 02800 XWD -2,WRDCNT; α FACE DELIMITER, WRDCNT = NUMBER OF WORDS IN FACE HEADER; 02900 BYTES Q; α Reflectance [0-8], Specular Coef [9-17], Radiance [18-35]; 03000 α face contents; 03100 XWD V1,E1; α Perimeter List of Vertex and Edge pointers in ccw order; 03200 XWD V2,E2; 03300 etc. 03400 XWD Vp,Ep; 03500 end "face block" 03600 until an XWD -1, or XWD -2 shows up. 03700 end "body block" 03800 until a 0 or an EOF shows up. 03900 04000 α EOF; 04100 0; 00100 EXAMPLES 00200 00300 In the hard cover version of this write up there are 00400 illustrations which go along with the examples. However, since you 00500 are reading the cheap paper back version, you will have to key the 00600 examples into the machine at a III display console in order to see 00700 the illustrations. 00800 00900 A CUBE 01000 01100 1. V_ Vertex body creation and "MARKED" display mode. 01200 2. :) positions the vertex in the first quadrant. 01300 3. \ doubles strength of translation. 01400 4. E; make an edge and vertex and move left. 01500 5. E( edge vertex down. 01600 6. E: edge vertex right. 01700 7. J↑ connect the first and last vertices of the wire 01800 forming a new edge and a new face, you now 01900 have a square lamina. 02000 8. / halves the strength of translation. 02100 9. - pushes the face lamina away from you. 02200 10. S sweeps the square face into a very thin solid. 02300 11. **↑ moves the new face towards you. 02400 02500 ANOTHER CUBE 02600 02700 1. V_ Vertex body creation and "MARKED" display mode. 02800 2. :) positions the vertex in the first quadrant. 02900 3. \ doubles strength of translation. 03000 4. E; make an edge and vertex and move left. 03100 5. ↑S( get the wire face on top and sweep it into a lamina. 03200 6. J clear the NCNT. 03300 7. /*\ position the lamina face in the z direction. 03400 8. S-↑ sweep the lamina into a solid and pop it off. 03500 03600 A TETRAHEDRON (not regular) 03700 03800 1. V:π2/3 Position a vertex. 03900 2. @E*E*J!↑ Make a triangular base. 04000 3. β S*↑ Sweep out a pyramid from the base. 04100 04200 A REGULAR OCTAHEDRON 04300 04400 1. V:) Position a vertex. 04500 2. \E;E(E:J Make a square lamina. 04600 3. ↑↑⊗BF Get the faces of the lamina. 04700 4. λ1.414212 Enter the square root of two. 04800 5. β S -↑ Sweep out two pyramids. 04900 β S *↑ 00100 EXAMPLES - continued. 00200 00300 A REGULAR ICOSAHEDRON 00400 1. V\\: 00500 2. π2/5 00600 3. @E*E*E*E*J! 00700 4. ↑↑⊗BF 00800 5. α 9 α ; π/5 00900 6. λ1.4 01000 7. ( α S )) α ( 01100 8. β S λ2.4 01200 9. )↑ β S( 01300 01400 A SPHERE 01500 1. V\\( Position a vertex to the south pole. 01600 2. @6*\ Move it north to the antarctic circle. 01700 3. E*E*E*E* Sweep out a meridian wire. 01800 E*E*E*↑ 01900 4. S(S(S(S( Form the globe by sweeping the first meridian 02000 S(S(S(S( about the Y-axis. 02100 S(S(S(S( 02200 S(S(S( 02300 5. R↑ Seal up the sweep face forming pole cap faces 02400 and converting a spherical sheet into a solid. 02500 02600 A TORUS 00100 A DODECAHEDRON 00200 1. \\v/:)-\E;E(E:J↑S*↑ 00300 Like in Euclid's construction, 00400 (Elements, Book XIII, proposition 17) 00500 we start with a cube. 00600 2. ⊗BE Make Midpoints on the twelve edges. 00700 M↑M↑M↑M↑ 00800 M↑M↑M↑M↑ 00900 M↑M↑M↑M↑ 01000 3. λ0.191 The edges of the cube are 01100 \\ diagonals in the faces of the 01200 duodecahedron. The 0.191 as well 01300 as the 0.308 below are derived 01400 by alittle trigonometry on the sly. 01500 4. ⊗BV Position the midpoints on their faces. 01600 (↑ *↑ )↑ *↑ 01700 ;↑ :↑ (↑ :↑ 01800 -↑ ;↑ )↑ -↑ 01900 5. α ↑ Flush the other points. 02000 6. λ0.308 Another magic constant. 02100 \\ 02200 7. ⊗BV Position the midpoints above their faces. 02300 -↑ ;↑ -↑ :↑ 02400 )↑ )↑ *↑ (↑ 02500 ;↑ (↑ *↑ :↑ 00500 TETRAHEDRON 00600 00800 00900 SOMA BLOCKS 01000 the step: V![:)-]E;E(E:J↑S*↑⊗BFS:↑↑↑S)↑↑↑ 01100 the el: V![:)-]E;E(E:J↑S*↑⊗BFS:↑↑S;↑S)↑↑↑ 01200 the te: V![:)-]E;E(E:J↑S*↑⊗BFS:↑↑↑S)↑↑S*↑ 01300 the zigzag: V![:)-]E;E(E:J↑S*↑⊗BFS:↑↑↑S)⊗FE↑`FES*↑↑↑↑↑↑↑↑ 01400 the left hand: V![:)-]E;E(E:J↑S*↑⊗BFS:↑↑↑S)⊗FE↑↑`FES;↑↑↑↑↑↑↑ 01500 the right hand: V![:)-]E;E(E:J↑S*↑⊗BFS:↑↑↑S)⊗FE↑↑↑`FES-↑↑↑↑↑↑ 01600 the corner stone: 01700 V]>∧E]<`FVS∨JS¬↔↑`BF↔↑[⊃[@[∧>]! 01800 V]>∧E]<`FVS∨JS¬↔↑`BF↔↑[⊃[@[∧>]!]>∧¬]>¬ 01900 02000 A KNOT 02100 "J" S@:!:S@:!:S@:!:S@:!:S@:!:S@:!:S)))))),((((((, 02200 "K" S@*!*S@*!*S@*!*S@*!*S@*!*S@*!*S::::::,;;;;;;******, 02300 "L" S@)!)S@)!)S@)!)S@)!)S@)!)S@)!)S******,------, 02400 END; 00100 APPENDIX - THE HOMOGENEOUS HOBGOBLIN. 00200 00300 I wish to justify GEOMED's Euclidean Representation of 00400 vertices. For the benefit of the innocent reader, the orthodox and 00500 academically respectable representation is the Homogeneous 00600 Representation. The Homogeneous Representation was used and 00700 published by Roberts - in an appendix to his Machine Perception 00800 paper. 00900 01000 GEOMED does not use the homogeneous representation because 01100 Rotation, Translation and Perspective Projection require more 01200 execution time and vertices require more memory when homogeneous 01300 coordinates are used in a floating format on conventional computer 01400 hardware such as a PDP-10. 01500 01600 Although Roberts' paper clearly states that the advantage of 01700 the homogeneous representation is for scaling integers, others have 01800 gone forth teaching and implementing the homogeneous representation 01900 in circumstances where the Euclidean representation would have been 02000 more concise and economical. 02100 02200 For me, homogenity really becomes a hobgoblin not when it is 02300 wasting CPU and memory cycles but rather when some one attempts to 02400 convince me that it is more mathematically elegant than the Euclidean 02500 geometry of three space polyhedrons. 00100 APPENDIX - SHORT COMINGS. 00200 00300 GEOMED doesn't have: 00400 00600 Animation. 00700 Space War Buttons. 00800 Light pen or Tablet. 00900 Arcs and Higher Ordered Surfaces. 01000 Compound Bodies. 01100 Advanced Language Features - Macros, Iteration, 01200 Conditional, Command Editing, External 01300 Command Files, and so on. 01400 Conflicting Bodies. 01500 Cuts. 01600 Data Disc Display. 01700 Blunder Recovery. 01800 Extraordinary Speed. 01900 or a completely worked out mathematical formalism. 02000 02100 02200 RESERVE 02300 The iteration notation will be { n | commands }. 00100 SUMMARY OF SWITCHES 00200 00300 switch commentary 00400 00500 00600 Q - FRMORG 00700 FRMORG affects world frame rotations. 00800 TRUE * rotation about a world axis, 00900 thru the world origin. 01000 FALSE rotation about a parallel to a world axis, 01100 thru the body origin. 01200 FRMORG is flipped by the Q-command. 01300 The state of FRMORG is indicated by an asterisked in the 01400 Editor's Status Display. The asterisk is present when 01500 FRMORG is true and absent when FRMORG is false. 01600 01700 F - FRAME 01800 FRAME is a three state switch that affects translation, 01900 rotation and dilation. 02000 state-1 indicates World Frame of Reference. 02100 state-2 indicates Body Frame of Reference. 02200 state-3 indicates Relative Frame of Reference. 02300 FRAME is incremented, modulo 3, by the F-command. 02400 02500 A - AXECNT 02600 AXECNT affects only dilations. 02700 state-1 indicates dilation only on the specified axis. 02800 state-2 indicates dilation on the two axes not specified. 02900 state-3 indicates dilation on all three axes. 03000 The state of dilation is indicated by a digit to the right of 03100 the dilation strength's percent sign in the GEOMED Status Display. 03200 AXECNT is incremented, modulo 3, by the A-command. 03300