DIRECTORY Imager, ImagerPath, SVPadGraphics, Real, RealFns, SV2d, SVLines2d, SVVector2d; SVPadGraphicsImpl: CEDAR PROGRAM IMPORTS Imager, ImagerPath, Real, RealFns, SVLines2d, SVVector2d EXPORTS SVPadGraphics = BEGIN Path: TYPE = SV2d.Path; Point2d: TYPE = SV2d.Point2d; Polygon: TYPE = SV2d.Polygon; Vector2d: TYPE = SV2d.Vector2d; squareSide: REAL _ 6.0; globalOutline: Imager.Trajectory; ScreenToPad: PUBLIC PROC [screenPoint: Point2d, origin: Point2d, scalar: REAL _ 1] RETURNS [padPoint: Point2d] = { padPoint[1] _ screenPoint[1] - origin[1]; padPoint[2] _ screenPoint[2] - origin[2]; padPoint _ SVVector2d.Scale[padPoint, 1/scalar]; }; PadToScreen: PUBLIC PROC [padPoint: Point2d, origin: Point2d, scalar: REAL _ 1] RETURNS [screenPoint: Point2d] = { padPoint _ SVVector2d.Scale[padPoint, scalar]; screenPoint[1] _ padPoint[1] + origin[1]; screenPoint[2] _ padPoint[2] + origin[2]; }; MoveTo: PUBLIC PROC [dc: Imager.Context, padPoint: Point2d, origin: Point2d] = { screenPoint: Point2d; screenPoint _ PadToScreen[padPoint, origin]; globalOutline _ ImagerPath.MoveTo[[screenPoint[1], screenPoint[2]]]; }; DrawTo: PUBLIC PROC [dc: Imager.Context, padPoint: Point2d, origin: Point2d] = { screenPoint: Point2d; screenPoint _ PadToScreen[padPoint, origin]; globalOutline _ ImagerPath.LineTo[globalOutline, [screenPoint[1], screenPoint[2]]]; Imager.SetStrokeWidth[dc, 1]; Imager.SetStrokeEnd[dc, square]; Imager.MaskStrokeTrajectory[dc, globalOutline]; }; MirrorMoveTo: PUBLIC PROC [dc: Imager.Context, padPoint: Point2d, origin: Point2d] = { screenPoint: Point2d; padPoint[1] _ -padPoint[1]; screenPoint _ PadToScreen[padPoint, origin]; globalOutline _ ImagerPath.MoveTo[[screenPoint[1], screenPoint[2]]]; }; MirrorDrawTo: PUBLIC PROC [dc: Imager.Context, padPoint: Point2d, origin: Point2d] = { screenPoint: Point2d; padPoint[1] _ -padPoint[1]; screenPoint _ PadToScreen[padPoint, origin]; globalOutline _ ImagerPath.LineTo[globalOutline, [screenPoint[1], screenPoint[2]]]; Imager.SetStrokeWidth[dc, 1]; Imager.SetStrokeEnd[dc, square]; Imager.MaskStrokeTrajectory[dc, globalOutline]; }; DrawPathNeighborHood: PUBLIC PROC [dc: Imager.Context, path: Path, index: NAT, origin: Point2d] = { DrawSquare[dc, squareSide, path[index], origin]; IF index>0 THEN { MoveTo[dc, path[index-1], origin]; DrawTo[dc, path[index], origin]; }; IF index0 THEN { MirrorMoveTo[dc, path[index-1], origin]; MirrorDrawTo[dc, path[index], origin]; }; IF index0, so (1-cos(theta/2) < z/r. -cos(theta/2) < z/r - 1. cos(theta/2) > (1 - z/r). Theta/2 < ArcCos[1 - z/r]. Theta < 2*ArcCos[1 - z/r]. Let z = 0.5. Now find a deltaTheta smaller than this which goes evenly into 45 degrees. Draw three parallel lines, 2 black with 1 white in between so that the total width is three screen dots. This requires that we calculate the points with are 1 unit from the given central line segment and normal to that line segment. Find the left and right segments given the center segment Now draw the left line Now draw the center line Finally, draw the right line Just a private utility used by Circle. ส ฎ– "cedar" style˜Iheadšœ™Iprocšœ2™2Lšœ4™4Lšœ7™7L˜šฯk ˜ LšœN˜N—L˜Lšœ ˜ Lšœ9˜@Lšœ˜L˜Lš˜˜Lšœ˜Lšœ œ˜Lšœ˜Lšœ œ˜L˜Lšœ˜L˜!L˜—šฯn œœœ;œ˜rLšœ/™/Lšœ)˜)Lšœ)˜)Lšœ0˜0Lšœ˜—šž œœœ8œ˜rLšœ.˜.Lšœ)˜)Lšœ)˜)Lšœ˜—L˜šžœœœ=˜PLšœ˜Lšœ,˜,LšœD˜DLšœ˜—šžœœœ=˜PLšœ˜Lšœ,˜,LšœS˜SJ˜Jšœ ˜ Jšœ/˜/Lšœ˜—šž œœœ=˜VLšœ˜Lšœ˜Lšœ,˜,LšœD˜DLšœ˜—šž œœœ=˜VLšœ˜Lšœ˜Lšœ,˜,LšœS˜SJ˜Jšœ ˜ Jšœ/˜/Lšœ˜—L˜šžœœœ)œ˜cLšœO™OLšœ™LšœJ™JLšœ0˜0šœ œ˜Lšœ"˜"Lšœ ˜ Lšœ˜—šœœ˜Lšœ"˜"Lšœ ˜ Lšœ˜—Lšœ˜—šžœœœ)œ˜iLšœO™OLšœ™LšœJ™JLšœ6˜6šœ œ˜Lšœ(˜(Lšœ&˜&Lšœ˜—šœœ˜Lšœ(˜(Lšœ&˜&Lšœ˜—Lšœ˜—šžœ œ,œ˜fLšœO™OLšœ™Lšœ=™=Lšœ'™'Lšœ!˜!Lšœ;˜;Lšœ<˜˜>šœœœ˜Lšœ3˜3LšœG˜G—Lšœ˜J˜Jšœ˜Jšœ)˜)Lšœ˜—šž œœœK˜cLšœ™LšœA™ALšœ2˜2Lšœœœ˜LšœC˜Cšœœœ˜Lšœ4˜4LšœU˜ULšœ˜—Lšœ˜LšœU˜ULšœ˜—L˜šž œœœ*˜ALšœC˜CLšœ˜Lšœ˜Lšœ˜Lšœ˜Lšœ-˜-LšœD˜DLšœ.˜.LšœS˜SJ˜Jšœ ˜ Jšœ/˜/J˜Lšœ,˜,LšœD˜DLšœ/˜/LšœS˜SJ˜Jšœ ˜ Jšœ/˜/Lšœ˜—L˜šž œœœœ'˜^Lšœœ ˜Lšœ˜Lšœ˜Lšœ,™,LšœF˜FLšœ=˜=LšœF˜FLšœE˜ELšœF˜FLšœE˜ELšœF˜FLšœE˜EJ˜Jšœ(œ˜.Lšœ˜—šžœœœœ'˜dLšœœ ˜Lšœ˜Lšœ˜Lšœ,™,Lšœ˜LšœF˜FLšœ=˜=LšœF˜FLšœE˜ELšœF˜FLšœE˜ELšœF˜FLšœE˜EJ˜Jšœ.˜.Lšœ˜—L˜šž œœœF˜_Lšœ˜Lšœœ˜ Lšœ2˜2Lšœ˜Lšœ˜Lšœ˜Lšœ˜Lšœ˜Lšœ5˜5Lšœ˜—šžœœœ0œ˜LJšœm™mJšœล™ลJšœ‘™‘Jšœ6œ˜;Jšœœ˜Jšœœ˜#Jšœœ˜Jšœ˜Jšœ%˜%Jšœ-˜-JšœJ™JJšœ0˜0Jšœ,˜,Jšœ˜Jšœ˜Jšœ˜J˜šœœœ˜+Jšœ˜Jšœ%˜%Jšœ'˜'Jšœ8˜8Jšœ(˜(Jšœ8˜8Jšœ%˜%Jšœ8˜8Jšœ%˜%Jšœ8˜8Jšœ%˜%Jšœ8˜8Jšœ%˜%Jšœ8˜8Jšœ%˜%Jšœ8˜8Jšœ%˜%Jšœ8˜8Jšœ%˜%Jšœ˜Jšœ˜Jšœ˜—Jšœ˜Jšœ˜—Jšœ<ž˜=šž œœœ.œ˜Pšœ8˜8Jšœ้™้Jšœ9™9—JšœI˜IJšœJ˜JJšœF˜FJšœW˜WšœQ˜QJšœ™—Jšœ+˜+Jšœ@˜@JšœQ˜QJ˜Jšœ˜šœ/˜/Jšœ™—Jšœ+˜+Jšœ2˜2Jšœ=˜=šœ/˜/Jšœ™—Jšœ+˜+JšœB˜BJšœS˜SJšœ/˜/Jšœ˜—šžœ œ.œ˜M™&Jšœ2˜2Jšœ=˜=J˜Jšœ ˜ Jšœ/˜/Jšœ˜——L˜Lšœ˜—…—+V?f