DIRECTORY CubicPaths, CubicSplines, GGBasicTypes, GGInterfaceTypes, GGModelTypes, GGSegmentTypes, Imager, ImagerPath, ImagerTransformation; GGSegment: CEDAR DEFINITIONS = BEGIN NotFound: SIGNAL; BitVector: TYPE = GGModelTypes.BitVector; Point: TYPE = GGBasicTypes.Point; Scene: TYPE = GGModelTypes.Scene; Segment: TYPE = GGSegmentTypes.Segment; SegmentClass: TYPE = GGSegmentTypes.SegmentClass; SelectionClass: TYPE = GGSegmentTypes.SelectionClass; DefaultData: TYPE = GGInterfaceTypes.DefaultData; Vector: TYPE = GGBasicTypes.Vector; ClassDef: TYPE = REF ClassDefRec; ClassDefRec: TYPE = RECORD[type: ATOM, class: SegmentClass]; MakeLine: PROC [p0, p1: Point, props: LIST OF REF ANY] RETURNS [seg: Segment]; MakeBezier: PROC [p0, p1, p2, p3: Point, props: LIST OF REF ANY] RETURNS [seg: Segment]; MakeConic: PROC [p0, p1, p2: Point, r: REAL, props: LIST OF REF ANY] RETURNS [seg: Segment]; MakeArc: PROC [p0, p1, p2: Point, props: LIST OF REF ANY] RETURNS [seg: Segment]; MakeCubicSpline: PROC [cps: CubicSplines.KnotSequence, type: CubicSplines.SplineType, props: LIST OF REF ANY] RETURNS [Segment]; BezierGetParams: PROC [seg: Segment] RETURNS [p0, p1, p2, p3: Point]; ConicGetParams: PROC [seg: Segment] RETURNS [p0, p1, p2: Point, r: REAL]; ConicSetRatio: PROC [seg: Segment, r: REAL]; ConicSetControlPoint: PROC [seg: Segment, p1: Point]; ArcGetParams: PROC [seg: Segment] RETURNS [p0, p1, p2: Point]; CubicSplineGetParams: PROC [seg: Segment] RETURNS [CubicPaths.Path]; SetDefaults: PROC [seg: Segment, defaults: DefaultData]; CopySegment: PROC [seg: Segment] RETURNS [copy: Segment]; CopyLooks: PROC [from: Segment, to: Segment]; SameLooks: PROC [seg1: Segment, seg2: Segment] RETURNS [BOOL]; SameShape: PROC [seg1: Segment, seg2: Segment] RETURNS [same: BOOL]; UniformLooks: PROC [scene: Scene, selectClass: SelectionClass] RETURNS [seg: Segment]; ReverseSegment: PROC [seg: Segment]; OpenUpSegment: PROC [seg: Segment]; FetchSegmentClass: PROC [type: ATOM] RETURNS [class: SegmentClass]; RegisterSegmentClass: PROC [classDef: ClassDef]; TransformSegment: PROC [seg: Segment, transform: ImagerTransformation.Transformation]; TranslateSegment: PROC [seg: Segment, vector: Vector]; MoveEndPointSegment: PROC [seg: Segment, lo: BOOL, newPoint: Point]; DrawLine: PROC [dc: Imager.Context, p1, p2: Point, seg: Segment]; CSControlPointAdd: PROC [seg: Segment, pos: Point] RETURNS [Segment]; CSControlPointDelete: PROC [seg: Segment, cpVec: BitVector] RETURNS [Segment]; BZSpecialTransformPath: PROC [seg: Segment, transform: ImagerTransformation.Transformation, lo, hi: BOOL, controlPoints: BitVector, loTransform, hiTransform: ImagerTransformation.Transformation, curveTo: ImagerPath.CurveToProc]; BZControlPointMovedTo: PUBLIC PROC [seg: Segment, newPos: Point, controlPointNum: NAT]; NoOpTightBoxProc: GGSegmentTypes.TightBoxProc; NoOpSameShapeProc: GGSegmentTypes.SameShapeProc; NoOpControlPointMoved: GGSegmentTypes.ControlPointMovedProc; NoOpControlPointGet: GGSegmentTypes.ControlPointGetProc; NoOpControlPointCount: GGSegmentTypes.ControlPointCountProc; NoOpControlPointFieldSet: GGSegmentTypes.ControlPointFieldSetProc; NoOpControlPointFieldGet: GGSegmentTypes.ControlPointFieldGetProc; NoOpClosestControlPoint: GGSegmentTypes.ClosestControlPointProc; NoOpClosestPointAndTangent: GGSegmentTypes.ClosestPointAndTangentProc; NoOpLineIntersection: GGSegmentTypes.LineIntersectionProc; NoOpCircleIntersection: GGSegmentTypes.CircleIntersectionProc; NoOpAsSimpleCurve: GGSegmentTypes.AsSimpleCurveProc; NoOpAsPolyline: GGSegmentTypes.AsPolylineProc; NoOpJointNormal: GGSegmentTypes.JointNormalProc; NoOpCPNormal: GGSegmentTypes.CPNormalProc; NoOpAddJoint: GGSegmentTypes.AddJointProc; NoOpFileOut: GGSegmentTypes.FileOutProc; END. ’GGSegment.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Last edited by Bier on December 29, 1986 4:27:27 pm PST Contents: Procedures which implement the Gargoyle segment classes. Stone, August 5, 1985 3:25:55 pm PDT Pier, July 13, 1987 2:57:09 pm PDT Kurlander August 28, 1986 6:13:29 pm PDT Eisenman, September 17, 1987 3:36:48 pm PDT Bier, May 19, 1989 11:26:37 am PDT Making Segments (much like the Imager interface) Create a straight line segment between the two points. Create a Bezier segment which passed thru p0 and p3, guided by p1 and p2. Let m be the midpoint of [p0, p2]. Let p be the point on [m, p1] such that Length[m, p]/Length[m, p1] = r. The curve starts at p0, passes through p, and ends at p2. It is a line if r=0; an ellipse if 0KšŸœžœžœ˜DK˜K™ KšŸ œžœ'˜8KšŸ œžœžœ˜9KšŸ œžœ˜-KšŸ œžœ žœžœ˜>KšŸ œžœ žœžœ˜DšŸ œžœ-žœ˜VKšœfžœ5™ž—KšŸœžœ˜$KšŸ œžœ˜#šŸœžœžœžœ˜CK™CK™+—KšŸœžœ˜0KšŸœžœ@˜VKšŸœžœ ˜6šŸœžœžœ˜DKšœ]™]KšœF™F—K˜K™ šŸœžœ3˜AKšœ™—šŸœžœžœ ˜EK™8—šŸœžœ"žœ ˜NK™C—K™šŸœžœHžœ|˜δKšœ#™#—KšŸœž œ0žœ˜WK™™@K™—KšŸœΟb œ˜.KšŸœ  œ˜0KšŸœ œ˜KšŸœ œ˜4KšŸœ œ˜.Kš œ œ˜0Kš  œ  œ˜*KšΠbn œ  œ˜*KšŸ œ  œ˜(š  œ™K˜—K˜Kšžœ˜—…—¦&