DIRECTORY G3dBasic, G3dMatrix, Rope; G3dQuaternion: CEDAR DEFINITIONS ~ BEGIN Pair: TYPE ~ G3dBasic.Pair; Triple: TYPE ~ G3dBasic.Triple; Quad: TYPE ~ G3dBasic.Quad; Matrix: TYPE ~ G3dMatrix.Matrix; Quaternion: TYPE ~ G3dBasic.Quad [x: 0.0, y: 0.0, z: 0.0, w: 1.0]; AxisAngle: TYPE ~ RECORD [unitAxis: Triple, theta: REAL]; QuaternionSequence: TYPE ~ REF QuaternionSequenceRep; QuaternionSequenceRep: TYPE ~ RECORD [ length: CARDINAL 0, element: SEQUENCE maxLength: CARDINAL OF Quaternion ]; origin: Triple ~ G3dBasic.origin; qZero: READONLY Quaternion; -- All components 0, sum identity, does not give a rotation quW: READONLY Quaternion; -- Pure w component, product identity, gives null rotation quX: READONLY Quaternion; -- Pure x component, gives rotation by p around x axis quY: READONLY Quaternion; -- Pure y component, gives rotation by p around y axis quZ: READONLY Quaternion; -- Pure z component, gives rotation by p around z axis FromComponents: PROC [x, y, z, w: REAL] RETURNS [qq: Quaternion]; FromVectorScalar: PROC [v: Triple, w: REAL 1.0] RETURNS [qq: Quaternion]; FromVector: PROC [v: Triple] RETURNS [qq: Quaternion]; FromScalar: PROC [w: REAL 1.0] RETURNS [qq: Quaternion]; FromAxisAngle: PROC [unitAxis: Triple, theta: REAL] RETURNS [qu: Quaternion]; FromXYZAngles: PROC [forX, forY, forZ: REAL] RETURNS [qu: Quaternion]; FromMatrix: PROC [mat: Matrix] RETURNS [qu: Quaternion]; ToMatrix: PROC [q: Quaternion, out: Matrix NIL] RETURNS [Matrix]; ToAxisAngle: PROC [qu: Quaternion] RETURNS [AxisAngle]; ToXYZAngles: PROC [qu: Quaternion] RETURNS [Triple]; MakeRotateQ: PROC [q: Quaternion, out: Matrix NIL] RETURNS [Matrix]; MakeRotateAboutQ: PROC [q: Quaternion, base: Triple origin, out: Matrix NIL] RETURNS [Matrix]; Id: PROC RETURNS [qu: Quaternion]; Zero: PROC RETURNS [qq: Quaternion]; Components: PROC [q: Quaternion] RETURNS [Quad]; Vector: PROC [q: Quaternion] RETURNS [Triple]; Scalar: PROC [q: Quaternion] RETURNS [REAL]; PureVector: PROC [q: Quaternion] RETURNS [qq: Quaternion]; Norm: PROC [q: Quaternion] RETURNS [REAL]; Neg: PROC [q: Quaternion] RETURNS [qq: Quaternion]; Conjugate: PROC [q: Quaternion] RETURNS [qq: Quaternion]; Inverse: PROC [q: Quaternion] RETURNS [qq: Quaternion]; Unit: PROC [q: Quaternion] RETURNS [qu: Quaternion]; Add: PROC [qL, qR: Quaternion] RETURNS [qq: Quaternion]; Sub: PROC [qL, qR: Quaternion] RETURNS [qq: Quaternion]; Mul: PROC [qL, qR: Quaternion] RETURNS [qq: Quaternion]; Scale: PROC [q: Quaternion, w: REAL] RETURNS [qq: Quaternion]; Exp: PROC [q: Quaternion] RETURNS [qq: Quaternion]; Ln: PROC [q: Quaternion] RETURNS [qq: Quaternion]; Rot: PROC [qu: Quaternion, v: Triple] RETURNS [vr: Triple]; Dot: PROC [qa, qb: Quaternion] RETURNS [REAL]; Slerp: PROC [qu0, qu1: Quaternion, t: REAL] RETURNS [qut: Quaternion]; Bisect: PROC [qu0, qu1: Quaternion] RETURNS [qu: Quaternion]; Double: PROC [qu0, qu1: Quaternion] RETURNS [qu: Quaternion]; Squad: PROC [qu0, qu1, quq0, quq1: Quaternion, t: REAL] RETURNS [qut: Quaternion]; Bezier: PROC [qu0, qua0, qub1, qu1: Quaternion, t: REAL] RETURNS [qut: Quaternion]; BSpline: PUBLIC PROC [qu0, qu1, qu2, qu3: Quaternion, t1, t2, t3, t4, t5, t6, t: REAL] RETURNS [qut: Quaternion]; CatmullRom: PUBLIC PROC [qu0, qu1, qu2, qu3: Quaternion, t: REAL] RETURNS [qut: Quaternion]; TangentVector: PROC [quNm1, quN, quNp1: Quaternion] RETURNS [vt: Triple]; SquadTanFromPoints: PROC [quNm1, quN, quNp1: Quaternion] RETURNS [quqN: Quaternion]; BezierTanFromPoints: PROC [quNm1, quN, quNp1: Quaternion] RETURNS [quaN: Quaternion]; SquadTanFromVector: PROC [quN, quNp1: Quaternion, vt: Triple] RETURNS [quqN: Quaternion]; BezierTanFromVector: PROC [quN: Quaternion, vt: Triple] RETURNS [quaN: Quaternion]; ConformQuaternionSequence: PROC [qs: QuaternionSequence]; CopyQuaternionSequence: PROC [qs: QuaternionSequence] RETURNS [new: QuaternionSequence]; AddToQuaternionSequence: PROC [qs: QuaternionSequence, q: Quaternion] RETURNS [QuaternionSequence]; LengthenQuaternionSequence: PROC [qs: QuaternionSequence, amount: REAL 1.3] RETURNS [new: QuaternionSequence]; END.  G3dQuaternion.mesa Copyright 1988, 1992 by Xerox Corporation. All rights reserved. Ken Shoemake, April 12, 1989 2:43:54 am PDT Bloomenthal, July 14, 1992 1:48 pm PDT Glassner, July 3, 1990 11:59:47 am PDT Right-handed world coordinate system (longitude, latitude, altitude). Quaternions are used for representing and animating orientations/rotations. You can view them not only as homogeneous coordinates, [x, y, z, w], but also as fancy complex numbers w+ix+jy+kz with i2=j2=k2=ijk=1. Each non-zero quaternion corresponds to a rotation. Like homogeneous coordinates for points, all non-zero scalar multiples of a quaternion give the same rotation, while the zero quaternion does not correspond to any rotation. The product of two quaternions corresponds to the combination of their rotations; the result in both cases is order dependent. The quaternion 1 (i.e., 1+i0+j0+k0) corresponds to the null rotation, a rotation through a zero angle. Unit quaternionsthose with x2+y2+z2+w2=1have an exceptional status among coordinate systems for rotations. Mathematically, they are unique in matching the natural structure, both metric and topological, of 3D rotations. Computationally, they are both concise and extremely efficient. Unit quaternions lie on a sphere in x-y-z-w space. The length of the arc between two of them is half the angle of rotation between their corresponding orientations; travel along the arc corresponds to performing the rotation. For more details, refer to: ``Animating Rotation with Quaternion Curves'', SIGGRAPH '85 Proceedings, and ``Quaternion Calculus and Fast Animation,'' in SIGGRAPH '87 tutorial #10. Type Declarations Common Values Conversion Procedures Construct a (possibly non-unit) quaternion from real components. Construct a (possibly non-unit) quaternion from vector (for x, y, z) and real scalar (for w). Note that FromVectorScalar[v] gives a different scalar component than FromVector[v]. Construct a (possibly non-unit) quaternion from vector (for x, y, z). Scalar will be 0. Construct a (possibly non-unit) quaternion from scalar (for w). Vector will be 0. Construct a unit quaternion for rotation around unitAxis by theta radians. unitAxis should be of unit length. Construct a unit quaternion for rotation (in radians) around body z then y then x axis. Construct a unit quaternion from rotation matrix. Assumes matrix is used to multiply row vector on the right: vnew _ vold mat. Works correctly for right-handed coordinate system and right-handed rotations. Translation and perspective components ignored. Construct rotation matrix from (possibly non-unit) quaternion. Assumes matrix is used to multiply row vector on the right: vnew _ vold mat. Works correctly for right-handed coordinate system and right-handed rotations. Use out if non-NIL. Extract rotation axis of unit quaternion qu as a unit vector, along with rotation angle of qu (in radians). Note that a rotation with an angle of zero will have an undefined axis. Note also that [v,q] and [v,q] are the same rotation (opposite to [v,q] and [v,q]). Return the Euler angles corresponding to the unit quaternion. Compatibility Procedures Construct rotation matrix from (possibly non-unit) quaternion. Assumes matrix is used to multiply row vector on the right: vnew _ vold mat. Works correctly for right-handed coordinate system and right-handed rotations. Use out if non-NIL. Construct translated rotation matrix from (possibly non-unit) quaternion and base point for rotation. Assumes matrix is used to multiply row vector on the right: vnew _ vold mat. Works correctly for right-handed coordinate system and right-handed rotations. Use out if non-NIL. Algebraic Procedures Return quaternion multiplicative identity, gives null rotation. Return quaternion additive identity, does not give a rotation. Return components of quaternion. Return vector part of quaternion. Return scalar part of quaternion. Return quaternion with scalar component zero. Can use as cheap cleanup for Ln, since PureVector[Ln[q]] = Ln[Unit[q]]. Return norm of quaternion; that is, the sum of the squares of components. Return negated quaternion; that is, its additive inverse. Return conjugate of quaternion. Return inverse of quaternion; that is, its multiplicative inverse. Return normalized quaternion; that is, make sum of squares equal 1. Return quaternion sum qL + qR. Return quaternion difference qL - qR. Return quaternion product qL * qR. Note: order is important! Return product of quaternion q by scalar w. Return exponentiated quaternion; that is, S qn/n!. Return the natural logarithm of quaternion, inverse function of Exp. Return v rotated by unit quaternion qu. Faster for single vector than making qu into matrix. Return the 4-D dot product of quaternions qa and qb. Curve Procedures Several procedures are given for constructing and evaluating spherical analogs of cubic polynomial curves: Squad, Bezier, and BSpline. Evaluation is based on the spherical analog of linear interpolation, Slerp. The essential difference between Squad and Bezier is that Squad is about twice as fast, while Bezier has more direct tangent control; both interpolate their end points. The BSpline curve allows non-uniform knots, second order continuity, and variation diminution, but does not interpolate. All give local control. Both Squad and Bezier have control points with which to set the tangents at the end points. The TangentVector procedure will estimate a suitable tangent, while SquadTanFromVector and BezierTanFromVector will construct a control point. The combined effect may be had by using SquadTanFromPoints or BezierTanFromPoints. [Artwork node; type 'Artwork on' to command tool] Spherical linear interpolation of unit quaternions. Takes qu0 to qu1 as t goes from 0 to 1. Fast Slerp for t = 1/2. Fast Slerp for t = 2. Spherical quadrangle curve from qu0 to qu1, for t IN [0..1], with tangents manipulated by quadrangle points quq0 and quq1. All quaternions are assumed to be of unit norm. Spherical Bezier curve from qu0 to qu1, for t IN [0..1], with tangents manipulated by Bezier points qua0 and qub1. All quaternions are assumed to be of unit norm. Spherical cubic B-Spline curve for control points qu0 to qu3 and knots t1 to t6, t IN [t3..t4]. Must have t1 < t2 < t3 < t4 < t5 < t6. All quaternions are assumed to be of unit norm. Spherical cubic Catmull-Rom curve for control points qu0 to qu3, for t IN [0..1]. All quaternions are assumed to be of unit norm. Given unit quaternions quNm1, quN, and quNp1in that orderestimate the tangent at quN for a smooth curve passing through all three. Given unit quaternions quNm1, quN, and quNp1in that orderestimate the tangent at quN for a smooth curve passing through all three. Compute quandrangle point quqN for Squad. Given unit quaternions quNm1, quN, and quNp1in that orderestimate the tangent at quN for a smooth curve passing through all three. Compute Bezier point quaN for Bezier. Given unit quaternions quN and quNp1in that orderand a tangent vector vt at quN, compute quandrangle point quqN for Squad. Given unit quaternion quN, and a tangent vector vt at quN, compute Bezier point quaN for Bezier. Sequence Procedures Make sure each quaternion in the sequence is on the same half-sphere as the preceding element. Note: a cyclic path may return to its origin with a 180-degree phase shift. Return a copy of the input sequence of Quaternions. Add q to the sequence. Return a copy of the input sequence whose maxLength is amount*input.maxLength. :TNewlineDelimiter "cedarcode" styleJ e7BJ+J&J&JJEEJ%i%buEJJJ/zLJIIJk JJJbl  JheadlJJ  J !JJ 4DJ 9JJ6&J J  8J "JJ c;WJ :TJ 'cglPJ 'PJ 'PnA@JKJ^^TTJ  6XXJ :RRJ MJJJ##J FWWJ 8JYYJ d5YLLJ  CJYYJ "#TBBJ  7J]]J\\J g ) RJ  4J=  FJYYJ "#TBBJ PJ J[[J GXJZZJ"?J$>J 0 J .!J,!!J :JU J*IJ39J 9J7BJ4CCJ8J8%J8=J>+J3*2J2DJ;]J.J4JJJ InterpressInterpress/Xerox/3.0 fjkj=xjDܠxjrjsj887\_O+"!c)&+L- JF+"\" J"k)"`Fi Jg77\_O+" Jkk]qY.&stQt;6Rl]qY.xjkxj֏kxjkxjٗ4Ukxj@HXI}?J_UUUkxj;ԙǗ!ŗkxj{ k iWkxjxj*,)2Xerox TiogaFontsTioga10BBezierkkxjxj4M)2Xerox TiogaFontsTioga10BSquadkkxjxj4M)2Xerox TiogaFontsTioga10BBSplinekkxjxjx14M)2Xerox TiogaFontsTioga10BSlerpkkxjxj3z "a"5Xerox TiogaFontsTioga10qu0kkxjxjF"Bj5Xerox TiogaFontsTioga10qu1kkxjxj Dca"5Xerox TiogaFontsTioga10qu0kkxjxj?aBj5Xerox TiogaFontsTioga10qu1kkxjxj9" Ӡa"5Xerox TiogaFontsTioga10qua0kkxjxjBj5Xerox TiogaFontsTioga10qub1kkxjxj "a"5Xerox TiogaFontsTioga10quq0kkxjxjM"Bj5Xerox TiogaFontsTioga10quq1kkxjxj" נa"5Xerox TiogaFontsTioga10qu0kkxjxj#" a"5Xerox TiogaFontsTioga10qu1kkxjxj#" a"5Xerox TiogaFontsTioga10qu2kkxjxj'Dqa"5Xerox TiogaFontsTioga10qu3kkxj`Ws0sUsf@@ Jis@is0s Jis JUsf`Ws0s Jkxj0s^=3kxj0sei3kxjxjh a"5Xerox TiogaFontsTioga10qu0kkxjxjLYBj5Xerox TiogaFontsTioga10qu1kkkkgArtwork InterpressBounds:0.0 mm xmin 0.0 mm ymin 157.5827 mm xmax 125.9482 mm ymax 128.7704 mm bigger topLeading 128.7704 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 outlineBoxBearoffGGFileIGargoyle file for scene: stuffed from ///Users/Shoemake.pa/Mesa/Curves.gg at March 20, 1989 11:15:59 pm PST Produced by version 8811.30 Scripts: Slope: [F 150.0] [F 149.5742] [F 135.0] [F 120.0] [F 90.0] [F 60.0] [F 49.83439] [F 45.0] [F 30.0] [F 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: T Heuristics: F ShowAlignments: T ScaleUnit: 111.4372 DisplayStyle: print Gravity: T GravityExtent: 8.680555e-2 GravityType: pointsPreferred DefaultFont: xerox/pressfonts/helvetica-mrr [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: []F Anchor: T [288.0,454.5391] PaletteForFillColor: F PaletteForStrokeColor: F Entities: [29]: Circle [50.91169 -25.44816 288.0 50.91169 25.44816 454.5391] strokeWidth: 2.0 strokeColor: [1 1.0] fillColor: [] dashes: ( F ) props: ( F ) fwd: T Outline fillColor: [1 0.0] ow: T fillText: T 0 Children: [1] Traj (fence) [4] arrows: 0 j: round e: T round w: 2.0 c: T [] d: T F [212.4071,498.935] (Line ) [212.4071,376.5391] (Line ) [369.4321,376.5391] (Line ) [369.4321,551.0184] (Line ) [289.741,456.6018] (Line ) fwd: T Box [318.0,341.0] [390.0,413.0] [1.0 0.0 -66.0 0.0 1.0 -103.0] strokeWidths: ( 1.0 1.0 1.0 1.0 ) strokeEnds: ( round round round round ) strokeColors: ( [1 1.0] [1 1.0] [1 1.0] [1 1.0] ) fillColor: [] pa: 0 dashes: ( F F F F ) props: ( ( F ) ( F ) ( F ) ( F ) ) fwd: T fillText: F 0 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 [252.0,238.0] (Conic [288.0,310.0] 0.5 ) [324.0,238.0] fwd: T Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [3] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [104.0,244.0] (Line ) [120.0,313.0] (Line ) [148.0,259.0] (Line ) [181.0,268.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 [104.0,244.0] (CubicSpline Type: BSpline 2 [120.0,313.0] [148.0,259.0] ) [181.0,268.0] fwd: T Outline fillColor: [1 0.5] ow: T fillText: T 0 Children: [1] Traj (open) [3] arrows: 0 j: round e: T round w: 1.0 c: T [1 1.0] d: T F [413.5,308.0] (Line ) [487.5,295.0] (Line ) [486.5,247.0] (Line ) [385.0,293.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 [475.0,289.1666] (Bezier [487.1667,279.0] [486.8333,263.0] ) [469.75,262.6666] fwd: T Box [57.2814,194.0] [115.2814,226.0] [1.0 0.0 54.7186 0.0 1.0 4.000008] 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 52 Bezier &Icoden4 Box [67.2814,194.0] [115.2814,226.0] [1.0 0.0 201.7186 0.0 1.0 4.000008] 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 52 Squad &Icoden4 Box [67.2814,194.0] [130.2814,226.0] [1.0 0.0 360.2186 0.0 1.0 4.000008] 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 54 BSpline &Icoden 6 Box [67.2814,194.0] [115.2814,226.0] [1.0 0.0 207.7186 0.0 1.0 145.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 52 Slerp &Icoden4 Box [221.2059,767.0] [255.0,787.5884] [1.0 0.0 4.897064 0.0 1.0 -536.7942] 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 65 qu0 5 "cedar" styleIcodeA Box [228.4116,767.0] [259.4116,787.5884] [1.0 0.0 99.0884 0.0 1.0 -536.7942] 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 65 qu1 5 "cedar" styleIcodeA Box [221.2059,767.0] [255.0,787.5884] [1.0 0.0 -139.1029 0.0 1.0 -536.2942] 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 65 qu0 5 "cedar" styleIcodeA Box [228.4116,767.0] [259.4116,787.5884] [1.0 0.0 -44.9116 0.0 1.0 -506.2942] 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 65 qu1 5 "cedar" styleIcodeA Box [221.2059,767.0] [265.2059,787.5884] [1.0 0.0 -96.20587 0.0 1.0 -461.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 49 qua0 %Icode1 Box [228.4116,767.0] [266.9116,787.5884] [1.0 0.0 -81.9116 0.0 1.0 -525.2942] 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 49 qub1 %Icode1 Box [221.2059,767.0] [265.2059,787.5884] [1.0 0.0 -0.2058716 0.0 1.0 -466.7942] 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 49 quq0 %Icode1 Box [228.4116,767.0] [266.9116,787.5884] [1.0 0.0 100.3384 0.0 1.0 -466.7942] 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 49 quq1 %Icode1 Box [221.2059,767.0] [255.0,787.5884] [1.0 0.0 187.7941 0.0 1.0 -457.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 65 qu0 5 "cedar" styleIcodeA Box [221.2059,767.0] [255.0,787.5884] [1.0 0.0 269.7941 0.0 1.0 -479.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 49 qu1 %Icode1 Box [221.2059,767.0] [255.0,787.5884] [1.0 0.0 269.7941 0.0 1.0 -527.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 49 qu2 %Icode1 Box [221.2059,767.0] [255.0,787.5884] [1.0 0.0 146.8971 0.0 1.0 -490.2942] 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 49 qu3 %Icode1 Circle [73.53913 0.0 288.0 0.0 73.53913 454.5391] strokeWidth: 2.0 strokeColor: [1 0.5] fillColor: [] dashes: ( F ) props: ( F ) 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: 1.0 c: T [1 1.0] d: T T [1.0 3.0] 0.0 -1.0 [288.0,454.5391] (Line ) [256.5,473.0391] 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: 1.0 c: T [1 1.0] d: T T [1.0 3.0] 0.0 -1.0 [288.0,454.5391] (Line ) [334.0,509.0391] fwd: T Box [221.2059,767.0] [255.0,787.5884] [1.0 0.0 9.897064 0.0 1.0 -301.2942] 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 65 qu0 5 "cedar" styleIcodeA Box [228.4116,767.0] [259.4116,787.5884] [1.0 0.0 105.5884 0.0 1.0 -257.9609] 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 65 qu1 5 "cedar" styleIcodeA 33JF\J=J=J'RJ2%YQQJ'SJ.,\FFJ=VJJS ` m 5YJ %AJJQQJ//J !IJVV--J TJVVXXJ UJVVTTJ%=JJRR))JSJXXJ9JJ5J"J33J(EJJJ"MJ"JNJJ.h$