CONST LineWidth = 1.5, TickIn = 1, TickOut = 1.1, NumTicks = 15, BaseWidth = 10, TipWidth = 2; /* The "TickIn" and "TickOut" constants are the fractions of the gauge radius at which the tick marks start and end. The "BaseWidth" and "TipWidth" constants control the width of the gauge. */ PROC DrawSemi(a, b) IS PS.MoveTo(b); Circle.DrawQuarterCC(a); Circle.DrawQuarterCC(a) END; UI PointTool(DrawSemi); PROC p := SpeedPoint(a, b, rFrac, theta) IS VAR q IN q := (rFrac * COS(theta), rFrac * SIN(theta)); p := q REL (a, b) END END; PROC DrawTicks(a, b) IS VAR i = 0, theta IN DO i < NumTicks -> theta := Math.Pi * (i / (NumTicks - 1)); PS.MoveTo(SpeedPoint(a, b, TickIn, theta)); PS.LineTo(SpeedPoint(a, b, TickOut, theta)); i := i + 1 OD END END; UI PointTool(DrawTicks); PROC Needle(a, d) IS IF VAR b ~ (0.0082495455, -0.10449872) REL (a, d), c ~ (0.00824955, 0.10449873) REL (a, d), e ~ (1, 0.026205964) REL (a, d), f ~ (1, -0.026205964) REL (a, d) IN Angle.Right(a, d, f) AND Angle.Right(f, b, a) AND d = Geometry.Mid(e, f) AND (c, a) CONG (a, b) AND (c, d) CONG (d, b) AND BaseWidth = Geometry.Dist(a, b) AND TipWidth = Geometry.Dist(d, e) -> SAVE PS IN PS.MoveTo(b); Arc.Draw(a, c); PS.LineTo(e); PS.LineTo(f); PS.Close(); PS.SetColor(Color.Red); PS.Fill() END END FI END; UI PointTool(Needle); PROC NeedleOnGauge(a, b, c) IS IF VAR d ~ c IN Geometry.Colinear(c, d, a) AND Geometry.Dist(a, d) = TickOut * Geometry.Dist(a, b) -> Needle(a, d) END FI END; UI PointTool(NeedleOnGauge); PROC Cmd0() IS IF VAR a = (-2.2721457, -17.445251), b ~ (88.61368, -17.445251), c ~ (166.62401, 44.750862), d = (-2.2721457, 28.184856), e ~ (110.57776, 94.81114), f = R2.Plus(e, (5.3016663, 5.3094254)), g ~ (-120.42371, -43.750854) IN a HOR b AND a VER d AND d = Geometry.Mid(g, f) -> SAVE PS IN Rect.DrawC(d, e); PS.SetColor(Color.Grey50); PS.Fill(); Shadow.SetWidth(4); Shadow.RectC(d, e) END; PS.SetWidth(LineWidth); SAVE PS IN DrawSemi(a, b); PS.SetEndStyle(PS.SquareEnds); PS.Stroke() END; DrawTicks(a, b); PS.Stroke(); NeedleOnGauge(a, b, c); PS.SetBBox(g, f) END FI END;