DIRECTORY G2dBasic, G3dBasic, G3dMatrix, G3dVector, Real, RealFns; G3dVectorImpl: CEDAR PROGRAM IMPORTS G2dBasic, G3dMatrix, RealFns EXPORTS G3dVector ~ BEGIN Box: TYPE ~ G3dBasic.Box; Pair: TYPE ~ G3dBasic.Pair; Triple: TYPE ~ G3dBasic.Triple; Quad: TYPE ~ G3dBasic.Quad; Ray: TYPE ~ G3dBasic.Ray; TripleSequence: TYPE ~ G3dBasic.TripleSequence; Matrix: TYPE ~ G3dMatrix.Matrix; NearSegment: TYPE ~ G3dVector.NearSegment; origin: Triple ~ G3dBasic.origin; Null: PUBLIC PROC [v: Triple] RETURNS [BOOL] ~ { RETURN[v.x = 0.0 AND v.y = 0.0 AND v.z = 0.0]; }; Negate: PUBLIC PROC [v: Triple] RETURNS [Triple] ~ { RETURN[[-v.x, -v.y, -v.z]]; }; Unit: PUBLIC PROC [v: Triple] RETURNS [ret: Triple] ~ { m: REAL ¬ v.x*v.x+v.y*v.y+v.z*v.z; SELECT m FROM 0.0, 1.0 => RETURN[v]; ENDCASE => { m ¬ RealFns.SqRt[m]; RETURN[[v.x/m, v.y/m, v.z/m]]; }; }; Mul: PUBLIC PROC [v: Triple, s: REAL] RETURNS [Triple] ~ { RETURN[[v.x*s, v.y*s, v.z*s]]; }; Div: PUBLIC PROC [v: Triple, s: REAL] RETURNS [Triple] ~ { RETURN[IF s # 0.0 THEN [v.x/s, v.y/s, v.z/s] ELSE [v.x, v.y, v.z]]; }; Abs: PUBLIC PROC [v: Triple] RETURNS [Triple] ~ { RETURN[[ABS[v.x], ABS[v.y], ABS[v.z]]]; }; Add: PUBLIC PROC [v1, v2: Triple] RETURNS [Triple] ~ { RETURN[[v2.x+v1.x, v2.y+v1.y, v2.z+v1.z]]; }; Sub: PUBLIC PROC [v1, v2: Triple] RETURNS [Triple] ~ { RETURN[[v1.x-v2.x, v1.y-v2.y, v1.z-v2.z]]; }; Equal: PUBLIC PROC [v1, v2: Triple, epsilon: REAL ¬ 0.001] RETURNS [BOOL] ~ { RETURN[ABS[v1.x-v2.x] b.max.x THEN b.max.x ¬ t.x; IF t.y < b.min.y THEN b.min.y ¬ t.y; IF t.y > b.max.y THEN b.max.y ¬ t.y; IF t.z < b.min.z THEN b.min.z ¬ t.z; IF t.z > b.max.z THEN b.max.z ¬ t.z; ENDLOOP; }; Length: PUBLIC PROC [v: Triple] RETURNS [REAL] ~ { RETURN[RealFns.SqRt[v.x*v.x+v.y*v.y+v.z*v.z]]; }; Square: PUBLIC PROC [v: Triple] RETURNS [REAL] ~ { RETURN[v.x*v.x+v.y*v.y+v.z*v.z]; }; Distance: PUBLIC PROC [p1, p2: Triple] RETURNS [REAL] ~ { a: REAL ¬ p2.x-p1.x; b: REAL ¬ p2.y-p1.y; c: REAL ¬ p2.z-p1.z; RETURN[RealFns.SqRt[a*a+b*b+c*c]]; }; SquareDistance: PUBLIC PROC [p1, p2: Triple] RETURNS [REAL] ~ { RETURN[Square[Sub[p1, p2]]]; }; SameLength: PUBLIC PROC [v1, v2: Triple] RETURNS [Triple] ~ { lengthV2: REAL ¬ Length[v2]; RETURN[IF lengthV2 # 0.0 THEN Mul[v2, Length[v1]/lengthV2] ELSE v2]; }; SetVectorLength: PUBLIC PROC [v: Triple, length: REAL] RETURNS [Triple] ~ { sqLength: REAL ¬ v.x*v.x+v.y*v.y+v.z*v.z; IF sqLength = 0.0 THEN RETURN[v]; IF sqLength # 1.0 THEN length ¬ length/RealFns.SqRt[sqLength]; RETURN[[v.x*length, v.y*length, v.z*length]]; }; Collinear: PUBLIC PROC [p1, p2, p3: Triple, epsilon: REAL ¬ 0.01] RETURNS [BOOL] ~ { RETURN[Parallel[Sub[p1, p2], Sub[p2, p3], epsilon]]; }; VecsCoplanar: PUBLIC PROC [v1, v2, v3: Triple, epsilon: REAL ¬ 0.01] RETURNS [BOOL] ~ { e1: REAL ¬ v1.x*(v2.y*v3.z-v3.y*v2.z); e2: REAL ¬ v1.y*(v2.x*v3.z-v3.x*v2.z); e3: REAL ¬ v1.z*(v2.x*v3.y-v3.x*v2.y); RETURN[ABS[e2-e1-e3] < epsilon]; }; PointsCoplanar: PUBLIC PROC [p1, p2, p3, p4: Triple, epsilon: REAL ¬ 0.01] RETURNS [BOOL] ~ { RETURN[VecsCoplanar[Sub[p4, p1], Sub[p3, p1], Sub[p2, p1], epsilon]]; }; Parallel: PUBLIC PROC [v1, v2: Triple, epsilon: REAL ¬ 0.005] RETURNS [BOOL] ~ { RETURN[ABS[CosineBetween[v1, v2, TRUE]] > 1.-epsilon]; }; Perpendicular: PUBLIC PROC [v1, v2: Triple, epsilon: REAL ¬ 0.005] RETURNS [BOOL] ~ { RETURN[ABS[CosineBetween[v1, v2]] < epsilon]; }; FrontFacing: PUBLIC PROC [vector, base: Triple, view: Matrix] RETURNS [BOOL] ~ { IF G3dMatrix.HasPerspective[view] THEN RETURN[FrontFacingWithPerspective[vector, base, G3dMatrix.Invert[view]]] ELSE RETURN[FrontFacingNoPerspective[vector, view]]; }; FrontFacingNoPerspective: PUBLIC PROC [vector: Triple, view: Matrix] RETURNS [BOOL] ~ { RETURN[vector.x*view[0][2]+vector.y*view[1][2]+vector.z*view[2][2] < 0.0]; }; FrontFacingWithPerspective: PUBLIC PROC [vector, base: Triple, invView: Matrix] RETURNS [BOOL] -- New, improved! Faster!! This should always work. ~ { q: Quad ¬ [invView[3][0], invView[3][1], invView[3][2], invView[3][3]]; camera: Triple ¬ IF q.w = 1.0 THEN [q.x, q.y, q.z] ELSE [q.x/q.w, q.y/q.w, q.z/q.w]; RETURN[Dot[Sub[camera, base], vector] > 0.0]; }; NearnessAccelerator: PUBLIC PROC [p0, p1: Triple] RETURNS [n: Quad] ~ { n.x ¬ p1.x-p0.x; n.y ¬ p1.y-p0.y; n.z ¬ p1.z-p0.z; n.w ¬ n.x*n.x+n.y*n.y+n.z*n.z; IF n.w = 0.0 THEN RETURN; n.x ¬ n.x/n.w; n.y ¬ n.y/n.w; n.z ¬ n.z/n.w; }; NearestToSegment: PUBLIC PROC [p0, p1, q: Triple, acc: Quad ¬ [0.0, 0.0, 0.0, 0.0]] RETURNS [nearest: NearSegment] ~ { IF acc # [0.0, 0.0, 0.0, 0.0] THEN { alpha: REAL ¬ (q.x-p0.x)*acc.x+(q.y-p0.y)*acc.y+(q.z-p0.z)*acc.z; SELECT alpha FROM <= 0.0 => { nearest.inside ¬ FALSE; nearest.point ¬ p0; nearest.w0 ¬ 1.0; nearest.w1 ¬ 0.0; }; >= 1.0 => { nearest.inside ¬ FALSE; nearest.point ¬ p1; nearest.w0 ¬ 0.0; nearest.w1 ¬ 1.0; }; ENDCASE => { nearest.inside ¬ TRUE; nearest.w1 ¬ alpha; nearest.w0 ¬ 1.0-nearest.w1; alpha ¬ alpha*acc.w; nearest.point ¬ [p0.x+alpha*acc.x, p0.y+alpha*acc.y, p0.z+alpha*acc.z]; }; } ELSE { delta: Triple ¬ [p1.x-p0.x, p1.y-p0.y, p1.z-p0.z]; nearest.point ¬ p0; IF delta = origin THEN RETURN ELSE { ua: Triple ~ [q.x-p0.x, q.y-p0.y, q.z-p0.z]; deltaSq: REAL ~ delta.x*delta.x+delta.y*delta.y+delta.z*delta.z; alpha: REAL ¬ (ua.x*delta.x+ua.y*delta.y+ua.z*delta.z)/deltaSq; SELECT alpha FROM < 0.0 => {nearest.inside ¬ FALSE; alpha ¬ 0.0}; > 1.0 => {nearest.inside ¬ FALSE; alpha ¬ 1.0}; ENDCASE => nearest.inside ¬ TRUE; nearest.point ¬ [p0.x+alpha*delta.x, p0.y+alpha*delta.y, p0.z+alpha*delta.z]; nearest.w1 ¬ alpha; nearest.w0 ¬ 1.0-alpha; }; }; }; NearestToLine: PUBLIC PROC [line: Ray, q: Triple] RETURNS [Triple] ~ { u: Triple ¬ Unit[line.axis]; RETURN[Add[line.base, Mul[u, Dot[Sub[q, line.base], u]]]]; }; PointOnLine: PUBLIC PROC [p: Triple, line: Ray, epsilon: REAL ¬ 0.005] RETURNS [BOOL] ~ { RETURN[Distance[p, NearestToLine[line, p]] < epsilon]; }; NearestToSequence: PUBLIC PROC [p: Triple, points: TripleSequence] RETURNS [index: NAT ¬ 0] ~ { minSqDist: REAL ¬ Real.LargestNumber; IF points # NIL THEN FOR n: NAT IN [0..points.length) DO sqDist: REAL ¬ SquareDistance[p, points[n]]; IF sqDist < minSqDist THEN {index ¬ n; minSqDist ¬ sqDist}; ENDLOOP; }; ClosestApproach2Lines: PUBLIC PROC [line1, line2: Ray] RETURNS [p1, p2: Triple] ~ { axis1: Triple ¬ Unit[line1.axis]; axis2: Triple ¬ Unit[line2.axis]; den: REAL ¬ Dot[axis1, axis2]; densq: REAL ¬ den*den; dif: Triple ¬ Sub[line1.base, line2.base]; dot1: REAL ¬ Dot[axis1, dif]; dot2: REAL ¬ Dot[axis2, dif]; s: REAL ¬ (dot1/densq-dot2/den)/(1.0-1.0/densq); t: REAL ¬ (s+dot1)/den; p1 ¬ Add[line1.base, Mul[axis1, s]]; p2 ¬ Add[line2.base, Mul[axis2, t]]; }; DistanceBetween2Lines: PUBLIC PROC [line1, line2: Ray] RETURNS [REAL] ~ { x21: REAL ¬ line2.base.x-line1.base.x; y21: REAL ¬ line2.base.y-line1.base.y; z21: REAL ¬ line2.base.z-line1.base.z; ab: REAL ¬ line1.axis.x*line2.axis.y-line2.axis.x*line1.axis.y; bc: REAL ¬ line1.axis.y*line2.axis.z-line2.axis.y*line1.axis.z; ca: REAL ¬ line1.axis.z*line2.axis.x-line2.axis.z*line1.axis.x; den: REAL ¬ ab*ab+bc*bc+ca*ca; IF den < 0.0001 THEN RETURN[Distance[line1.base, NearestToLine[line2, line1.base]]] ELSE RETURN[ABS[x21*bc+y21*ca+z21*ab]/RealFns.SqRt[den]]; }; V90: PUBLIC PROC [v0, v1: Triple, unitize: BOOL ¬ TRUE] RETURNS [t: Triple] ~ { dot: REAL ¬ Dot[v0, v1]; t ¬ IF ABS[dot] > 0.000001 THEN [v1.x-dot*v0.x, v1.y-dot*v0.y, v1.z-dot*v0.z] ELSE v1; IF unitize THEN t ¬ Unit[t]; }; Ortho: PUBLIC PROC [v: Triple, crosser: Triple ¬ [0.0, 0.0, 0.0]] RETURNS [Triple] ~ { length: REAL ¬ Length[v]; IF crosser = [0.0, 0.0, 0.0] THEN crosser ¬ [v.z, -v.x, v.y]; RETURN[IF length = 0.0 THEN [0.0, 0.0, 0.0] ELSE Mul[Unit[Cross[v, crosser]], length]]; }; RotateAbout: PUBLIC PROC [v, axis: Triple, a: REAL, degrees: BOOL ¬ TRUE] RETURNS [t: Triple] ~ { rotate: Matrix ¬ G3dMatrix.MakeRotate[axis, a, degrees, G3dMatrix.ObtainMatrix[]]; t ¬ G3dMatrix.TransformVec[v, rotate]; G3dMatrix.ReleaseMatrix[rotate]; }; PolarFromCartesian: PUBLIC PROC [cartesian: Triple] RETURNS [Triple] ~ { xySum: REAL ¬ cartesian.x*cartesian.x+cartesian.y*cartesian.y; lng: REAL ¬ RealFns.ArcTanDeg[cartesian.y, cartesian.x]; lat: REAL ¬ RealFns.ArcTanDeg[cartesian.z, RealFns.SqRt[xySum]]; mag: REAL ¬ RealFns.SqRt[xySum+cartesian.z*cartesian.z]; RETURN[[lng, lat, mag]]; }; CartesianFromPolar: PUBLIC PROC [polar: Triple] RETURNS [Triple] ~ { cosmag: REAL ¬ RealFns.CosDeg[polar.y]*polar.z; RETURN[[ cosmag*RealFns.CosDeg[polar.x], cosmag*RealFns.SinDeg[polar.x], polar.z*RealFns.SinDeg[polar.y]]]; }; Clip: PUBLIC PROC [p: Triple, box: Box] RETURNS [clipped: Triple] ~ { clipped ¬ [ MIN[MAX[box.min.x, p.x], box.max.x], MIN[MAX[box.min.y, p.y], box.max.y], MIN[MAX[box.min.z, p.z], box.max.z]]; }; Project: PUBLIC PROC [v1, v2: Triple] RETURNS [Triple] ~ { RETURN[IF v2 = origin THEN v2 ELSE Mul[v2, Dot[v1, v2]/Square[v2]]]; }; Average: PUBLIC PROC [triples: TripleSequence] RETURNS [average: Triple] ~ { average ¬ origin; FOR n: NAT IN [0..triples.length) DO average ¬ Add[average, triples[n]]; ENDLOOP; IF triples.length # 0 THEN average ¬ Div[average, triples.length]; }; CosineBetween: PUBLIC PROC [v0, v1: Triple, unitize: BOOL ¬ FALSE] RETURNS [r: REAL] ~ { IF v0 = origin OR v1 = origin THEN RETURN[0.0]; r ¬ (v0.x*v1.x+v0.y*v1.y+v0.z*v1.z); IF unitize THEN r ¬ r/RealFns.SqRt[(v0.x*v0.x+v0.y*v0.y+v0.z*v0.z)*(v1.x*v1.x+v1.y*v1.y+v1.z*v1.z)] }; AngleBetween: PUBLIC PROC [ v0, v1: Triple, degrees: BOOL ¬ TRUE, unitize: BOOL ¬ FALSE] RETURNS [REAL] ~ { RETURN[IF degrees THEN G2dBasic.ArcCosDeg[CosineBetween[v0, v1, unitize]] ELSE G2dBasic.ArcCos[CosineBetween[v0, v1, unitize]]]; }; END. 0 G3dVectorImpl.mesa Copyright Ó 1984, 1992 by Xerox Corporation. All rights reserved. Bloomenthal, April 9, 1993 4:11 pm PDT Heckbert, June 23, 1988 1:49:10 am PDT Glassner, February 14, 1991 9:02 am PST Types Basic Operations on a Single Vector Basic Operations on Two Vectors Basic Operations on Sequence of Vectors Length and Distance Operations Directional Tests Compute determinant of matrix of vectors: The following can be completely bogus (in particular, it can ignore epsilon): ratio: REAL _ Real.LargestNumber; IF v1 = v2 THEN RETURN[TRUE]; IF (v1.x=0) # (v2.x=0) OR (v1.y=0) # (v2.y=0) OR (v1.z=0) # (v2.z=0) THEN RETURN[FALSE]; IF v1.x # 0.0 THEN ratio _ v2.x/v1.x; IF v1.y # 0.0 THEN { IF ratio = Real.LargestNumber THEN ratio _ v2.y/v1.y ELSE IF ABS[ratio-(v2.y/v1.y)] > epsilon THEN RETURN[FALSE]; }; IF ratio = Real.LargestNumber OR v1.z = 0.0 THEN RETURN[TRUE]; RETURN[ABS[ratio-(v2.z/v1.z)] <= epsilon]; This presumes invView to be the INVERSE of the actual world-to-view matrix. same as: camera: Triple ¬ G3dMatrix.Transform[[0, 0, 0], invView]: the following way is fine, and equivalent to the above, but takes more multiplies: plane: Plane ¬ G3dPlane.FromPointAndNormal[base, vector]; RETURN[ invView[2][0]*plane.x+ invView[2][1]*plane.y+ invView[2][2]*plane.z+ invView[2][3]*plane.w < 0.0]; FrontFacingWithPerspective: PUBLIC PROC [vector, base: Triple, view: Matrix] RETURNS [BOOL] -- Way it was yesterday . . . (this is faulty) ~ { end: Triple ~ Add[base, vector]; z0: REAL _ base.x*view[0][2]+base.y*view[1][2]+base.z*view[2][2]+view[3][2]; z1: REAL _ end.x*view[0][2]+end.y*view[1][2]+end.z*view[2][2]+view[3][2]; RETURN[z1 < z0]; }; FrontFacingWithPerspective: PUBLIC PROC [vector, base: Triple, view: Matrix] RETURNS [BOOL] -- Way it was a few minutes ago . . . (this probably corrects above as long as vector doesn't go behind the eye!) ~ { end: Triple ~ Add[base, vector]; z0: REAL _ base.x*view[0][2]+base.y*view[1][2]+base.z*view[2][2]+view[3][2]; w0: REAL _ base.x*view[0][3]+base.y*view[1][3]+base.z*view[2][3]+view[3][3]; z1: REAL _ end.x*view[0][2]+end.y*view[1][2]+end.z*view[2][2]+view[3][2]; w1: REAL _ end.x*view[0][3]+end.y*view[1][3]+end.z*view[2][3]+view[3][3]; RETURN[z1/w1 < z0/w0]; }; Nearness Operations [Artwork node; type 'Artwork on' to command tool] Presumes p1 and p2 form a line segment that is perpendicular to each of the lines. p1 and p2 are given as line1.base+s(line1.axis) and line2.base+t(line2.axis); (p2-p1).line1.axis = 0 and (p2-p1).line2.axis = 0. From Bowyer and Woodwark (A Programmer's Geometry) P. Heckbert writes It looks like the Bowyer and Woodwark formula is equivalent to abs((P2-P1).D1xD2) / ||D1XD2|| where A.BXC is a triple scalar product, equivalent to the determinant of the 3x3 matrix with 3-vectors A, B, and C as rows. Their variables ab, bc, ca are components of vector D1xD2. Since ||D1xD2|| = ||D1|| * ||D2|| * |sin(theta)|, and A.BxC is the volume of the parallelepiped with sides A, B, and C, imagine this parallelepiped with one edge parallel to and sliding along line 1, one edge sliding along line 2, and the other edge connecting one point of line 1 (P1) to one point of line 2 (P2). If you kept the edge on line 1 fixed and changed P2, the origin point of line 2, stretching the parallelogram like a block of jello, the volume of the block would stay fixed because its base has constant area of ||D1xD2|| and its altitude is constant (equal to the distance between the lines). So you can pick any points P1 and P2 that you like and the volume is determined by the sin of the angles between the lines and the distance between the lines. If you divide the volume of the parallelepiped by its base area, you get the height, which is the distance between the lines. Cool! ClosestApproach2Lines: PUBLIC PROC [line1, line2: Ray] RETURNS [p1, p2: Triple] ~ { This works, but .... a, aa: REAL _ 1000000.0; sense: BOOL _ TRUE; DO IF (sense _ NOT sense) THEN p1 _ NearestToLine[line1, p2] ELSE p2 _ NearestToLine[line2, p1]; IF (a _ Distance[p1, p2]) = 0.0 OR ABS[aa-a]/a < 0.0000001 THEN EXIT; aa _ a; ENDLOOP; }; Simple Geometric Operations IF Parallel[crosser, v] THEN crosser _ [crosser.z, crosser.y, crosser.x]; Polar/Cartesian Coordinates [Artwork node; type 'Artwork on' to command tool] These procedures assume right-handed coordinate system: x to the right, y away, and z up. The polar triple consists of longitude, latitude, and magnitude. Latitude is deviation from the horizon; i.e., latitude = 90 is North Pole, -90 is South Pole. Longitude is rotation about the vertical; i.e., longitude = 0 is the xAxis, 90 is the yAxis. Miscellany Ê^S–"cedarcode" style•NewlineDelimiter ™™Jšœ Ïeœ6™BJ™&J™&J™'J˜JšÏk œ9˜BJ˜—–0.320 0.931 0.362 textColoršÐbl œÐbkÏb ˜Jšžœ˜%Jšžœ ˜J˜—Jšœž˜head–0.0 24 .div 1 1 textColoršÏl™J• CharProps'Postfix16.0 24 .div 1 1 textColorš¡œžœ˜J–'Postfix16.0 24 .div 1 1 textColorš¡œžœ˜J–'Postfix16.0 24 .div 1 1 textColorš¡œžœ˜"J–'Postfix16.0 24 .div 1 1 textColorš¡œžœ˜J–'Postfix16.0 24 .div 1 1 textColorš¡œžœ˜J–'Postfix16.0 24 .div 1 1 textColor!š¡œžœ˜/J–'Postfix16.0 24 .div 1 1 textColorš¡œžœ˜#–' Postfix16.0 24 .div 1 1 textColor š¡ œžœ˜+J˜—J–'Postfix16.0 24 .div 1 1 textColorš¡œ˜$—–0.0 24 .div 1 1 textColorš¢#™#–(Postfix0.320 0.931 0.362 textColor,š Ïnœžœžœ žœžœ˜0J–'Postfix16.0 24 .div 1 1 textColor(š œ žœ žœ ˜.J˜J˜—–(Postfix0.320 0.931 0.362 textColor.š£œž œ žœ ˜4J–'Postfix16.0 24 .div 1 1 textColorš œ˜J˜J˜—–(Postfix0.320 0.931 0.362 textColor3š£œžœžœ žœ˜7Jšœžœ˜"šžœž˜ J–) Postfix16.0 24 .div 1 1 textColoršœ  œ˜šžœ˜ J˜J–'Postfix16.0 24 .div 1 1 textColorš œ˜J˜——J˜J˜—–(Postfix0.320 0.931 0.362 textColor7š£œž œžœžœ ˜:J–'Postfix16.0 24 .div 1 1 textColorš œ˜J˜J˜—–(Postfix0.320 0.931 0.362 textColor7š£œž œžœžœ ˜:J–'Postfix16.0 24 .div 1 1 textColor=š œžœ žœžœ˜CJ˜J˜—–(Postfix0.320 0.931 0.362 textColor.š£œž œ žœ ˜1J–'Postfix16.0 24 .div 1 1 textColor!š œžœžœžœ˜'J˜——–0.0 24 .div 1 1 textColorš¢™–(Postfix0.320 0.931 0.362 textColor3š£œž œžœ ˜6J–'Postfix16.0 24 .div 1 1 textColor$š œ$˜*J˜J˜—–(Postfix0.320 0.931 0.362 textColor3š£œž œžœ ˜6J–'Postfix16.0 24 .div 1 1 textColor$š œ$˜*J˜J˜—–(Postfix0.320 0.931 0.362 textColorHš £œžœžœžœ žœžœ˜MJ–'Postfix16.0 24 .div 1 1 textColorQš  œžœžœžœžœžœ˜WJ˜J˜—–(Postfix0.320 0.931 0.362 textColor1š£œž œžœžœ˜4J–'Postfix16.0 24 .div 1 1 textColor$š œ$˜*J˜J˜—–(Postfix0.320 0.931 0.362 textColor3š£œž œžœ ˜8J–'Postfix16.0 24 .div 1 1 textColorBš œB˜HJ˜J˜—–(Postfix0.320 0.931 0.362 textColor3šÐbnœž œžœ ˜;J–'Postfix16.0 24 .div 1 1 textColor6š œ6˜J–'Postfix16.0 24 .div 1 1 textColorNš œN˜TJ˜J˜—–( Postfix0.320 0.931 0.362 textColor3š£ œž œžœ ˜=J–'Postfix16.0 24 .div 1 1 textColor$š œ$˜*J˜J˜—–( Postfix0.320 0.931 0.362 textColor3š£ œž œžœ ˜=J˜Jšžœ žœ˜&Jšžœ žœ˜&Jšžœ žœ˜&J–'Postfix16.0 24 .div 1 1 textColorš œ˜ J˜——–0.0 24 .div 1 1 textColorš¢'™'–(Postfix0.320 0.931 0.362 textColor+š£œžœžœ˜:š žœ žœžœžœžœžœž˜:J˜Jšžœ˜—J˜J˜—–(Postfix0.320 0.931 0.362 textColor+š£œžœžœ˜9š žœ žœžœžœžœžœž˜:J˜ Jšžœ˜—J˜J˜—–(Postfix0.320 0.931 0.362 textColor<š£œž œžœ ˜JJšœžœ˜ J˜J˜J–)Postfix16.0 24 .div 1 1 textColoršžœ žœžœ œ˜/šžœžœžœž˜$J˜Jšžœžœ˜$Jšžœžœ˜$Jšžœžœ˜$Jšžœžœ˜$Jšžœžœ˜$Jšžœžœ˜$Jšžœ˜—J˜——–0.0 24 .div 1 1 textColorš¢™–(Postfix0.320 0.931 0.362 textColor,š£œž œ žœžœ˜2J–'Postfix16.0 24 .div 1 1 textColor(š œ(˜.J˜J˜—–(Postfix0.320 0.931 0.362 textColor,š£œž œ žœžœ˜2J–'Postfix16.0 24 .div 1 1 textColorš œ˜ J˜J˜—–(Postfix0.320 0.931 0.362 textColor1š£œž œžœžœ˜9Jšœžœ ˜Jšœžœ ˜Jšœžœ ˜J–'Postfix16.0 24 .div 1 1 textColorš œ˜"J˜J˜—–(Postfix0.320 0.931 0.362 textColor1š£œž œžœžœ˜?J–'Postfix16.0 24 .div 1 1 textColorš œ˜J˜J˜—–( Postfix0.320 0.931 0.362 textColor3š£ œž œžœ ˜=Jšœ žœ˜J–'Postfix16.0 24 .div 1 1 textColor>š œžœžœžœ˜DJ˜J˜—–(Postfix0.320 0.931 0.362 textColor<š£œž œžœžœ ˜KJšœ žœ˜)J–)Postfix16.0 24 .div 1 1 textColoršžœžœ œ˜!Jšžœžœ(˜>J–'Postfix16.0 24 .div 1 1 textColor'š œ'˜-J˜——–0.0 24 .div 1 1 textColorš¢™–( Postfix0.320 0.931 0.362 textColorKš £ œžœžœžœ žœžœ˜TJ–'Postfix16.0 24 .div 1 1 textColor.š œ.˜4J˜J˜—–( Postfix0.320 0.931 0.362 textColorKš £ œž œžœ žœžœ˜WJ™)Jšœžœ˜&Jšœžœ˜&Jšœžœ˜&J–'Postfix16.0 24 .div 1 1 textColorš œžœ˜ J˜J˜—–(Postfix0.320 0.931 0.362 textColor<š£œž œ#žœ˜JJšžœžœ˜J˜J–'Postfix16.0 24 .div 1 1 textColor?š œ?˜EJ˜J˜—–(Postfix0.320 0.931 0.362 textColorHš £œžœžœžœ žœžœ˜PJ–'Postfix16.0 24 .div 1 1 textColor0š œžœžœ˜6–16.0 24 .div 1 1 textColor™MJšœžœ™!J–)Postfix16.0 24 .div 1 1 textColoršžœ žœ œžœ™šžœžœžœ™DJ–)Postfix16.0 24 .div 1 1 textColor šžœ œžœ™—Jšžœ žœ™%šžœ žœ™šžœ™Jšžœ™J–).Postfix16.0 24 .div 1 1 textColorš žœžœžœžœ œžœ™<—J™—J–)1Postfix16.0 24 .div 1 1 textColorš žœžœ žœ œžœ™>J–'Postfix16.0 24 .div 1 1 textColor$š œžœ ™*—J˜J˜—–( Postfix0.320 0.931 0.362 textColorHš £ œžœžœžœ žœžœ˜UJ–'Postfix16.0 24 .div 1 1 textColor'š œžœ#˜-J˜J˜—–( Postfix0.320 0.931 0.362 textColorEš £ œžœžœ&žœžœ˜Pšžœ˜!J–)Postfix16.0 24 .div 1 1 textColorBšžœ œ*¡œ˜MJ–)Postfix16.0 24 .div 1 1 textColor)šžœ œ)˜4—J˜J˜—–(Postfix0.320 0.931 0.362 textColor?š£œž œ žœžœ˜WJ–'Postfix16.0 24 .div 1 1 textColorDš œD˜JJ˜J˜—–(Postfix0.320 0.931 0.362 textColor5š£œž œ(˜OJ–'5Postfix16.0 24 .div 1 1 textColoršžœžœÏc5˜DJ–16.0 24 .div 1 1 textColoršœ ¡œ$™KJ˜–16.0 24 .div 1 1 textColor™BJ˜GJšœžœ žœžœ˜T—J–'Postfix16.0 24 .div 1 1 textColor'š œ'˜-–16.0 24 .div 1 1 textColor™RJ™9–'Postfix16.0 24 .div 1 1 textColorš œ™J™J™J™J™——J˜J™—–(Postfix0.320 0.931 0.362 textColor2š£œž œ%™LJ–'/Postfix16.0 24 .div 1 1 textColoršžœžœ1™>J™J™ JšœžœD™LJšœžœA™IJ–'Postfix16.0 24 .div 1 1 textColor š œ ™J™J™—–(Postfix0.320 0.931 0.362 textColor2š£œž œ%™LJ–'%Postfix16.0 24 .div 1 1 textColoršžœžœ¥%™4J–16.0 24 .div 1 1 textColorš¥K™KJ™J™ JšœžœD™LJšœžœD™LJšœžœA™IJšœžœA™IJ–'Postfix16.0 24 .div 1 1 textColorš œ™J™——–0.0 24 .div 1 1 textColorš¢™–(Postfix0.320 0.931 0.362 textColor4š£œžœžœžœ˜GJ˜J˜J˜J˜J–)Postfix16.0 24 .div 1 1 textColoršžœ ž œ˜J˜J˜J˜J˜J˜—–(Postfix0.320 0.931 0.362 textColorCš£œžœžœ6˜SJšžœ˜J˜šžœ˜šžœ˜Jšœžœ6˜Ašžœž˜˜ Jšœžœ˜J˜J˜J˜J˜—˜ Jšœžœ˜J˜J˜J˜J˜—šžœ˜ Jšœžœ˜J˜J˜J˜J˜GJ˜——J˜—šžœ˜J˜2J˜šžœ˜J–'Postfix16.0 24 .div 1 1 textColoršžœ ˜ šžœ˜J˜,Jšœ žœ3˜@Jšœžœ4˜?šžœž˜Jšœžœ˜/Jšœžœ˜/Jšžœžœ˜!—J˜MJ˜J˜J˜——J˜——J˜J˜—–( Postfix0.320 0.931 0.362 textColor9š£ œž œžœ ˜FJ• Interpress„Interpress/Xerox/3.0  f j k j¡¥“ļ= ¤ ¨ x jÄÖÒ7Ä¢I ¢ ¨Ä¡¨ ¡ ¡™ x j r j  Š ªÄ).7ÄuÅÄ)¹3Ä 0¡£¡¡¨¢¯“¢°“¢·“ÄJÕ0Ät¢?™Ä)œ7ÄÿÅ—˜ k é k x j r j  Š ªÄdµVÄB@3Ä$oÄ$o¡£ x j À £¡ˆ¡¡ÅXeroxÅResearchÅ RGBLinear£¡¡¦ ç • ” ç­“Ä´o ¤ÄÜqŽÄuïY ¢ ¥ ¨Ÿ ™ ¡¡ ¡“ ŸŸ ¡“¡¡ ¡™ k À £¡ˆ¡¡ÅXeroxÅResearchÅ RGBLinear£¡¡¦ ç • ” ç­“¢¯“¢°“¢·“ÄeaVÄuïY™ÄeaVÄ(âÝÄÜqŽÄ(âÝÄÙ J¡”ÄôÄ(âÝÄôÄuïYÄÙ J¡”ÄôÄB¦3ÄÜqŽÄB¦3ÄÙ J¡”ÄeaVÄB¦3ÄeaVÄuïYÄÙ J¡”¡¸ k é k x j r j  Š ªÄ"6!ĵ Ä$oÄ$o¡£ x j  À£¡ˆ¡¡ÅXeroxÅResearchÅ RGBLinear£¡¡¦ ç • ” ç­“Ä´o ¤Ä-³+Ä+N ¢ ¥ ¨Ÿ ™ ¡¡ ¡“ ŸŸ ¡“¡¡ ¡™ k  À£¡ˆ¡¡ÅXeroxÅResearchÅ RGBLinear£¡¡¦ ç • ” ç­“¢¯“¢°“¢·“Ä"x!Ä+N™Ä"x!ÄB‚)Ä-³+ÄB‚)ÄÙ J¡”Ä;u7ÄB‚)Ä;u7Ä+NÄÙ J¡”Ä;u7Ä·7Ä-³+Ä·7ÄÙ J¡”Ä"x!Ä·7Ä"x!Ä+NÄÙ J¡”¡¸ k é k x j r j  Š ªÄfîOÄoAÄ$oÄ$o¡£ x jÀÀ £¡ˆ¡¡ÅXeroxÅResearchÅ RGBLinear£¡¡¦ ç • ” ç­“Ä´o ¤ÄBs2ÄU1 ¢ ¥ ¨Ÿ ™ ¡¡ ¡“ ŸŸ ¡“¡¡ ¡™ kÀÀ £¡ˆ¡¡ÅXeroxÅResearchÅ RGBLinear£¡¡¦ ç • ” ç­“¢¯“¢°“¢·“ÄgŒOÄU1™ÄgŒOÄnz?ÄBs2Änz?ÄÙ J¡”Ä@«0Änz?Ä@«0ÄU1ÄÙ J¡”Ä@«0ÄoœAÄBs2ÄoœAÄÙ J¡”ÄgŒOÄoœAÄgŒOÄU1ÄÙ J¡”¡¸ k é k¡¡¨ ¡ ¡™ x j r j  Š ªÄ¾d£Äu=YĆ“Ī÷¡£À À£¡ˆ¡¡ÅXeroxÅResearchÅ RGBLinear£¡¡¦ ç • ” ç­“¢¯“¢°“¢·“ÄÜqŽÄuïY™Ä¿ª£Ä|Y[—ÄÜqŽÄuïY—Äå¹ÄOo;—˜ k é kÄ¡¨ ¡ ¡™ x j r j  Š ªÄÙUŽÄu=YÄ&[Ä?”¡£À À£¡ˆ¡¡ÅXeroxÅResearchÅ RGBLinear£¡¡¦ ç • ” ç­“¢¯“¢°“¢·“ÄBs2ÄU1™ÄÜqŽÄuïY—˜ k é kÄ¡¨ ¡ ¡™ x j r j  Š ªÄDOAÄgvAÄ:åÎÄî}¡£À  £¡ˆ¡¡ÅXeroxÅResearchÅ RGBLinear£¡¡¦ ç • ” ç­“¢¯“¢°“¢·“ÄBs2ÄU1™ÄDÑAÄgøA—˜ k é k¡¡¨ ¡ ¡™ x j r j  Š ªÄDOAÄi©CÄœYÄ%–ù¡£À  £¡ˆ¡¡ÅXeroxÅResearchÅ RGBLinear£¡¡¦ ç • ” ç­“¢¯“¢°“¢·“ÄDÑAÄgøA™ÄI‰3Ääw‹—ÄDÑAÄgøA—Ä%"Äj/C—˜ k é k x j x jÄ ¤Äè0—ÄÓt7 ¢ ¥ ¨¡¡¨Ä—ÝPŠÅXeroxÅ PressFontsÅ Helvetica-MRR£¡ “Ä#P ¤ ” •  —Á((–ÅxeroxÅ pressfontsÅ helvetica-brr£¡ “Ä#P ¤ ”¡•¡ —Áq–  —Á-–¡ —Áb–  —Á)–ÅXeroxÅ PressFontsÅTimesRoman-BRR£¡ “Ä#d ¤ ”¢•¢ —Ä#ÈÁ.–ÄüÝÈ¡ —Áu–  —Á)–¡ —Áu– k k x j x jÄ ¤Ä## ijK ¢ ¥ ¨¡¡¨Ä—ÝPŠÅxeroxÅ pressfontsÅ helvetica-brr£¡ “Ä#P ¤ ” •  —Áq–ÅXeroxÅ PressFontsÅ Helvetica-MRR£¡ “Ä#P ¤ ”¡•¡ —Á-–  —Áb– k k x j x jÄ ¤Ä$NÄÿ¼ ¢ ¥ ¨¡¡¨Ä—ÝPŠÅxeroxÅ pressfontsÅ helvetica-brr£¡ “Ä#P ¤ ” •  —Áq– k k x j x jÄ ¤ÄΓĶÄY ¢ ¥ ¨¡¡¨Ä—ÝPŠÅxeroxÅ pressfontsÅ helvetica-brr£¡ “Ä#P ¤ ” •  —Áb– k k k k g•Artwork Interpress•Bounds:0.0 mm xmin 0.0 mm ymin 73.88272 mm xmax 52.30466 mm ymax –é55.12688 mm bigger topLeading 55.12688 mm bigger topIndent 1.411111 mm bigger bottomLeading 0.5 0.3 0.95 backgroundColor the topLeading 6 pt .sub backgroundAscent 3 pt backgroundDescent 4 pt outlineBoxThickness 1 pt outlineBoxBearoff•GGFileƒ Gargoyle file for scene: stuffed from Gargoyle at January 25, 1992 1:12:55 pm PST Produced by version 9106.27 Scripts: Slope: [F 150.0] [F 135.0] [F 120.0] [T 90.0] [F 60.0] [F 45.0] [F 30.0] [T 0.0] Angle: [F 90.0] [F 60.0] [F 45.0] [F 30.0] [T 0.0] [F -30.0] [F -45.0] [F -60.0] [T -90.0] Radius: [F 5.555556e-2 1/18] [F 0.1111111 1/9] [F 0.125 1/8] [F 0.25 1/4] [F 0.3333334 1/3] [F 0.5 1/2] [F 0.6666668 2/3] [F 0.75 3/4] [F 1.0 1] [F 2.0 2] [F 4.0 4] LineDistance: [F 0.0 0] [F 5.555556e-2 1/18] [F 0.1111111 1/9] [F 0.5 1/2] [F 1.0 1] Midpoints: F Heuristics: F ShowAlignments: T ScaleUnit: 72.0 DisplayStyle: print Gravity: T GravityExtent: 0.3472222 GravityType: pointsPreferred DefaultFont: xerox/xc1-2-2/helvetica [r1: 0.0 s: [10.0 10.0] r2: 0.0] 1.0 1.0 Defaults: [1 0.5] [1 1.0] 2.0 round round Dashed: F Shadows: [1 1.0]F Anchor: F Palette: F Entities: [12]: Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 2.0 c: T [1 1.0] d: T F [399.104,473.9365] (Line ) [193.6727,370.3502] fwd: T pList: ( ) Circle [4.675747 0.0 306.4548 0.0 4.675747 339.2247] strokeWidth: 2.0 strokeColor: [0 0.0 0.8 0.0] fillColor: [0 0.0 0.8 0.0] dashes: ( F ) props: ( F ) fwd: T pList: ( ) Circle [4.675747 0.0 272.0697 0.0 4.675747 410.5928] strokeWidth: 2.0 strokeColor: [0 0.0 0.0 0.8] fillColor: [0 0.0 0.0 0.8] dashes: ( F ) props: ( F ) fwd: T pList: ( ) Circle [4.675747 0.0 340.2202 0.0 4.675747 444.245] strokeWidth: 2.0 strokeColor: [0 0.8 0.8 0.0] fillColor: [0 0.8 0.8 0.0] dashes: ( F ) props: ( F ) fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (open) [3] arrows: 0 j: round e: T round w: 2.0 c: T [0 0.8 0.0 0.8] d: T F [306.4548,339.2247] (Line ) [301.0184,349.8132] (Line ) [306.4548,339.2247] (Line ) [317.0432,344.661] fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 2.0 c: T [0 0.8 0.0 0.8] d: T F [340.2202,444.245] (Line ) [306.4548,339.2247] fwd: T pList: ( ) Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 2.0 c: T [0 0.8 0.0 0.0] d: T F [340.2202,444.245] (Line ) [271.0309,409.477] fwd: T pList: ( ) Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (open) [3] arrows: 0 j: round e: T round w: 2.0 c: T [0 0.8 0.0 0.0] d: T F [271.0309,409.477] (Line ) [274.7915,420.7698] (Line ) [271.0309,409.477] (Line ) [282.3236,405.7163] fwd: T pList: ( ) Box [223.0,477.5] [284.5,497.0] [1.3225 0.0 -40.37086 0.0 1.3225 -207.3454] strokeWidths: ( 2.0 2.0 2.0 2.0 ) strokeEnds: ( round round round round ) strokeColors: ( [] [] [] [] ) fillColor: [] pa: 0 dashes: ( F F F F ) props: ( ( F ) ( F ) ( F ) ( F ) ) fwd: T strokeJoint: round fillText: F 93 ((q-b).u)u  ÊI•NewlineDelimiter ™Jš ÏoÐbožÐbužž˜ —…— ] pList: ( ) Box [223.0,484.25] [257.75,497.0] [1.3225 0.0 33.68913 0.0 1.3225 -260.9066] strokeWidths: ( 2.0 2.0 2.0 2.0 ) strokeEnds: ( round round round round ) strokeColors: ( [] [] [] [] ) fillColor: [] pa: 0 dashes: ( F F F F ) props: ( ( F ) ( F ) ( F ) ( F ) ) fwd: T strokeJoint: round fillText: F 71 q-b  Ê;•NewlineDelimiter ™JšÐboÏo˜—…—G pList: ( ) Box [223.0,484.25] [248.75,497.0] [1.3225 0.0 24.26632 0.0 1.3225 -310.335] strokeWidths: ( 2.0 2.0 2.0 2.0 ) strokeEnds: ( round round round round ) strokeColors: ( [] [] [] [] ) fillColor: [] pa: 0 dashes: ( F F F F ) props: ( ( F ) ( F ) ( F ) ( F ) ) fwd: T strokeJoint: round fillText: F 64 q  Ê6•NewlineDelimiter ™JšÐbo˜—…—@ pList: ( ) Box [223.0,484.25] [248.75,497.0] [1.3225 0.0 51.54288 0.0 1.3225 -210.6516] strokeWidths: ( 2.0 2.0 2.0 2.0 ) strokeEnds: ( round round round round ) strokeColors: ( [] [] [] [] ) fillColor: [] pa: 0 dashes: ( F F F F ) props: ( ( F ) ( F ) ( F ) ( F ) ) fwd: T strokeJoint: round fillText: F 64 b  Ê6•NewlineDelimiter ™JšÐbo˜—…—@ pList: ( ) š£3™3J˜J–'Postfix16.0 24 .div 1 1 textColor4š œ4˜:J˜J˜—–( Postfix0.320 0.931 0.362 textColorNš £ œžœžœ!žœ žœžœ˜YJ–'Postfix16.0 24 .div 1 1 textColor0š œ0˜6J˜J˜—–(Postfix0.320 0.931 0.362 textColorJš£œÏsž¦ž¦œ¦œ¦œ¦œ¦ž¦œ¦žœ˜[Jšœ¦œ˜Jšœ žœ˜%š žœ žœžœžœžœž˜8Jšœžœ ˜,Jšžœžœ!˜;Jšžœ˜—J˜J˜—–(Postfix0.320 0.931 0.362 textColor>š£œ¦ž œžœ˜SJ–16.0 24 .div 1 1 textColoršœR™RJ–16.0 24 .div 1 1 textColoršœM™MJšœÐbuœ§œ™2J˜!J˜!Jšœžœ˜Jšœžœ ˜J˜*Jšœžœ˜Jšœžœ˜Jšœžœ)˜0Jšœžœ˜J˜$J˜$J˜J˜—–(Postfix0.320 0.931 0.362 textColor4š£œž œžœžœ˜IJ–16.0 24 .div 1 1 textColor™2–16.0 24 .div 1 1 textColor™–16.0 24 .div 1 1 textColoršœ>™>J–16.0 24 .div 1 1 textColoršœ §œ Ïmœ™—J–16.0 24 .div 1 1 textColoršœ§œ¨œM™WJ–16.0 24 .div 1 1 textColoršœX™XJ–16.0 24 .div 1 1 textColoršœX™XJ–16.0 24 .div 1 1 textColoršœ\™\J–16.0 24 .div 1 1 textColoršœZ™ZJ–16.0 24 .div 1 1 textColoršœ[™[J–16.0 24 .div 1 1 textColoršœ[™[J–16.0 24 .div 1 1 textColoršœX™XJ–16.0 24 .div 1 1 textColoršœ[™[J–16.0 24 .div 1 1 textColoršœT™TJ–16.0 24 .div 1 1 textColoršœV™VJ–16.0 24 .div 1 1 textColoršœV™VJ–16.0 24 .div 1 1 textColoršœ ™ —Jšœžœ˜&Jšœžœ˜&Jšœžœ˜&Jšœžœ7˜?Jšœžœ7˜?Jšœžœ7˜?Jšœžœ˜šžœ ˜J–)Postfix16.0 24 .div 1 1 textColor8šžœ œ8˜CJ–)Postfix16.0 24 .div 1 1 textColor.šžœ œžœ*˜9—J˜J˜—–(Postfix0.320 0.931 0.362 textColor>š£œ¦ž œžœ™SJ–16.0 24 .div 1 1 textColor™Jšœžœ ™Jšœžœžœ™šž™šžœ žœ™Jšžœ™"Jšžœ ™$—J–)@Postfix16.0 24 .div 1 1 textColorš žœžœžœžœ œ™EJšœ™Jšžœ™—J™——–0.0 24 .div 1 1 textColorš¢™–(Postfix0.320 0.931 0.362 textColorMš ¡œžœžœžœžœžœ˜PJšœžœ˜Jš œžœžœžœ.žœ˜VJšžœ žœ ˜J˜J˜—–(Postfix0.320 0.931 0.362 textColorQš¤œžœžœ0žœ ˜VJšœžœ ˜Jšžœžœ˜=Jšžœžœ-™IJ–'Postfix16.0 24 .div 1 1 textColorQš œžœžœžœ'˜WJ˜J˜—–( Postfix0.320 0.931 0.362 textColor>š £ œž œžœ žœžœ˜IJšžœ˜J˜RJ˜&J˜ J˜——–0.0 24 .div 1 1 textColorš¢™J–ýGargoyle file for scene: stuffed from ///Users/Bloomenthal.pa/gg/Polar.gg at January 1, 1989 3:42:52 pm PST Produced by version 8811.30 Scripts: Slope: [F 150.0] [F 135.0] [F 120.0] [T 90.0] [F 60.0] [F 45.0] [F 30.0] [T 0.0] Angle: [F 90.0] [F 60.0] [F 45.0] [F 30.0] [F 0.0] [F -30.0] [F -45.0] [F -60.0] [F -90.0] Radius: [F 5.555556e-2 1/18] [F 0.1111111 1/9] [F 0.125 1/8] [F 0.25 1/4] [F 0.3333333 1/3] [F 0.5 1/2] [F 0.6666667 2/3] [F 0.75 3/4] [F 1.0 1] [F 2.0 2] [F 4.0 4] LineDistance: [F 0.0 0] [F 5.555556e-2 1/18] [F 0.1111111 1/9] [F 0.5 1/2] [F 1.0 1] Midpoints: F Heuristics: F ShowAlignments: T ScaleUnit: 72.0 DisplayStyle: print Gravity: T GravityExtent: 0.3472222 GravityType: pointsPreferred DefaultFont: xerox/pressfonts/Modern-mrr [r1: 0.0 s: [14.0 14.0] r2: 0.0] 1.0 1.0 Defaults: [1 0.5] [1 1.0] 2.0 round round Dashed: F Shadows: []F Anchor: F PaletteForFillColor: F PaletteForStrokeColor: F Entities: [12]: Circle [72.0 0.0 213.0 0.0 72.0 438.0] strokeWidth: 2.0 strokeColor: [1 1.0] fillColor: [] dashes: ( F ) props: ( F ) fwd: T Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (open) [3] arrows: 0 j: round e: T round w: 2.0 c: T [1 1.0] d: T F [213.0,534.0] (Line ) [219.364,527.636] (Line ) [213.0,534.0] (Line ) [206.636,527.636] fwd: T Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (open) [3] arrows: 0 j: round e: T round w: 2.0 c: T [1 1.0] d: T F [305.0,438.0] (Line ) [298.636,431.636] (Line ) [305.0,438.0] (Line ) [298.636,444.364] fwd: T Outline fillColor: [1 1.0] ow: T fillText: T 0 Children: [1] Traj (open) [4] arrows: 0 j: round e: T round w: 2.0 c: T [1 1.0] d: T T [2.0 2.0] 0.0 30.0 [212.9086,438.088] (Line ) [251.4836,476.5714] (Line ) [250.9438,467.5876] (Line ) [251.4836,476.5714] (Line ) [242.4998,477.1112] fwd: T Circle [25.2 0.0 213.0 0.0 72.0 438.0] strokeWidth: 2.0 strokeColor: [1 1.0] fillColor: [] dashes: ( T [5.0 5.0] 2.5 10.0 ) props: ( F ) fwd: T Box [270.0,249.0] [546.0,321.0] [1.0 0.0 -35.0 0.0 1.0 229.0] strokeWidths: ( 2.0 2.0 2.0 2.0 ) strokeEnds: ( round round round round ) strokeColors: ( [] [] [] [] ) fillColor: [] pa: 0 dashes: ( F F F F ) props: ( ( F ) ( F ) ( F ) ( F ) ) fwd: T fillText: T 138 A purely vertical direction is 0 degrees pitch, 0 degrees yaw ÊD˜J–8 pt bigger bottomLeadingšÏl˜Jš˜—…—@Š Box [270.0,249.0] [546.0,321.0] [1.0 0.0 44.0 0.0 1.0 132.0] strokeWidths: ( 2.0 2.0 2.0 2.0 ) strokeEnds: ( round round round round ) strokeColors: ( [] [] [] [] ) fillColor: [] pa: 0 dashes: ( F F F F ) props: ( ( F ) ( F ) ( F ) ( F ) ) fwd: T fillText: T 140 A purely horizontal direction is 90 degrees pitch, 0 degrees yaw ÊD˜J–8 pt bigger bottomLeadingšÏl ˜ Jš˜—…—BŒ Box [160.0,249.0] [546.0,328.0] [1.0 0.0 122.0 0.0 1.0 174.0] strokeWidths: ( 2.0 2.0 2.0 2.0 ) strokeEnds: ( round round round round ) strokeColors: ( [] [] [] [] ) fillColor: [] pa: 0 dashes: ( F F F F ) props: ( ( F ) ( F ) ( F ) ( F ) ) fwd: T fillText: T 154 A direction pointing away from the viewer is 90 degrees pitch, 90 degrees yaw ÊD˜J–8 pt bigger bottomLeadingšÏl,˜,Jš ˜ —…—Pš Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 2.0 c: T [1 1.0] d: T T [2.0 2.0] 0.0 30.0 [213.0,438.0] (Line ) [283.0,438.0] fwd: T Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [1] arrows: 0 j: round e: T round w: 2.0 c: T [1 1.0] d: T F [285.0,438.0] (Line ) [305.0,438.0] fwd: T Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [2] arrows: 0 j: round e: T round w: 2.0 c: T [1 1.0] d: F [213.0,438.0] (Line T [2.0 2.0] 0.0 30.0 ) [213.0,510.0] (Line F ) [213.0,534.0] fwd: T Circle [3.162298 0.0 213.0 0.0 3.162298 438.0] strokeWidth: 2.0 strokeColor: [1 1.0] fillColor: [1 1.0] dashes: ( F ) props: ( F ) fwd: T –ã69.85 mm bigger topLeading 69.85 mm bigger topIndent 1.411111 mm bigger bottomLeading 0.5 0.3 0.95 backgroundColor the topLeading 6 pt .sub backgroundAscent 3 pt backgroundDescent 4 pt outlineBoxThickness 1 pt outlineBoxBearoff–:0.0 mm xmin 0.0 mm ymin 188.0306 mm xmax 67.02778 mm ymax – Interpress–Á Interpress/Xerox/3.0  f j k j¡¥“ļ= ¤ ¨ x j6 ¢ ¨ x j¡¡¨ r j  Š ª) 88¡£¢¯“¢°“¢·“-V™-žužÄÙ J¡”½ž½VÄÙ J¡”½uÄÙ J¡”--VÄÙ J¡”¡¸ k é k¡¡¨ ¡ ¡™ x j¢¯“¢°“¢·“¡¡¨u¶™ÄÖ9úÄì™ï—u¶—ÄÉËúÄì™ï—˜ k¡¡¨ ¡ ¡™ x j¢¯“¢°“¢·“¡¡¨ÑV™ÄÎïÄ’ùï—ÑV—ÄÎïÄžÛï—˜ k¡¡¨ ¡ ¡™ x j¢¯“¢°“¢·“¡¡¨Ä‘‹¯ÄÕé}™ÄYe[Ä —ÄW>YÄ’P—ÄYe[Ä —ħ§ #ÄÆ —¢¢¢¡ ¾¡º k x j¡¡¨ r jë5Š ªÞu88¡£¢¯“¢°“¢·“Ä4Á™Ä4 * ÄÙ J¡”Ä0 Ä0ÁÄÙ J¡”Ä0y*yÄÙ J¡”Ä4yÄ4ÁÄÙ J¡”¥¥¢¡Äª¡º k é k x j x j}… ¢ ¨¡¡¨®Ä`ÝPŠÅXeroxÅ TiogaFontsÅ TimesRoman12£¡ “ •  —ÁA purely vertical direction is–®ÄáÁÄŠ  —Á0 degrees pitch, 0 degrees yaw– k k x j x jÌ$ ¢ ¨¡¡¨®Ä`ÝPŠÅXeroxÅ TiogaFontsÅ TimesRoman12£¡ “ •  —Á A purely horizontal direction is–®ÄáÁÄŠ  —Á90 degrees pitch, 0 degrees yaw– k k x j x jN ¢ ¨¡¡¨@Äc PŠÅXeroxÅ TiogaFontsÅ TimesRoman12£¡ “ •  —Á,A direction pointing away from the viewer is–@Ä™I‚Š  —Á 90 degrees pitch, 90 degrees yaw– k kÄ¡¨ ¡ ¡™ x j¢¯“¢°“¢·“¡¡¨uV™»Ž¢¢¢¡ ¾¡º kÄ¡¨ ¡ ¡™ x j¢¯“¢°“¢·“¡¡¨½V™ÑŽ˜ kÄ¡¨ ¡ ¡™ x j¢°“¢¯“¡¡¨uV™ž¢¢¢¡ ¾¡º¢°“¢¯“¡¡¨už™¶˜ k x j x j¡¡¨Ä å! ¤uV ¢ ¥ ¨Ÿ ™ ¡¡ ¡“ ŸŸ ¡“¡¡ ¡™ k¡¡¨ r jÄÄ€Š ªÄ™“¿ÄAr¿Ä1Ä1¡£¢¯“¢°“¢·“Äœ¿V™Äœ¿ÄI&¿uÄI&¿ÄÙ J¡”Ä¡G¿ÄI&¿Ä¡G¿VÄÙ J¡”Ä¡G¿ÄDn¿uÄDn¿ÄÙ J¡”Äœ¿ÄDn¿Äœ¿VÄÙ J¡”¡¸ k é k k k gš£3™3J–16.0 24 .div 1 1 textColor™ZJ–16.0 24 .div 1 1 textColor™@J–16.0 24 .div 1 1 textColor™]–16.0 24 .div 1 1 textColor™\J™—–(Postfix0.320 0.931 0.362 textColor6š£œžœžœžœ ˜HJšœžœ3˜>Jšœžœ/˜8Jšœžœ7˜@Jšœžœ/˜8J–'Postfix16.0 24 .div 1 1 textColorš œ˜J˜J˜—–(Postfix0.320 0.931 0.362 textColor2š£œžœžœžœ ˜DJšœžœ#˜/–'Postfix16.0 24 .div 1 1 textColorš œ˜J˜J˜J˜"—J˜——–0.0 24 .div 1 1 textColorš¢ ™ –(Postfix0.320 0.931 0.362 textColorAš£œžœžœžœ˜E˜ Jšžœžœ˜$Jšžœžœ˜$Jšžœžœ˜%—J˜J˜—–(Postfix0.320 0.931 0.362 textColor3š£œžœžœžœ ˜:J–'Postfix16.0 24 .div 1 1 textColor>š œžœ žœžœ"˜DJ˜J˜—–(Postfix0.320 0.931 0.362 textColorEš£œžœžœžœ˜LJ˜šžœžœžœž˜$J˜#Jšžœ˜—Jšžœžœ(˜BJ˜J˜—–( Postfix0.320 0.931 0.362 textColor5š £ œžœžœžœžœ˜BJšžœžœ˜J˜J–)#Postfix16.0 24 .div 1 1 textColoršžœ žœ žœ œ˜/J˜$šžœ žœ˜J˜O—J˜J™—–( Postfix0.320 0.931 0.362 textColorš£ œžœžœ˜J˜Jšœ žœžœ˜Jšœ žœžœ˜Jšžœžœ˜–'Postfix16.0 24 .div 1 1 textColor š œžœ˜Jšžœ3˜7Jšžœ2˜6—J˜—J™—Jšžœ˜J˜J˜—…—-zý