CONST BarWidth = 0.3 * Unit.In, HoleRad = 0.05 * Unit.In, LineWidth = 1.5, Len1 = 0.75 * Unit.In, Len2 = 1.5 * Unit.In, Len3 = 2 * Unit.In, Len4 = 2.5 * Unit.In; PRED IsLink1(a, b) IS Geometry.Dist(a, b) = Len1 END; UI PointTool(IsLink1); PRED IsLink2(a, b) IS Geometry.Dist(a, b) = Len2 END; UI PointTool(IsLink2); PRED IsLink3(a, b) IS Geometry.Dist(a, b) = Len3 END; UI PointTool(IsLink3); PRED IsLink4(a, b) IS Geometry.Dist(a, b) = Len4 END; UI PointTool(IsLink4); PRIVATE PROC DrawHole(a) IS VAR b IN b := R2.Plus(a, (HoleRad, 0)); Circle.DrawCC(a, b) END END; UI PointTool(DrawHole); PRIVATE PROC FillBody() IS SAVE PS IN PS.SetColor(Color.Grey50); PS.Fill() END; PS.SetWidth(LineWidth); PS.Stroke() END; UI PointTool(FillBody); PROC DrawLink(a, b) IS IF VAR c ~ (1, 0.08052) REL (a, b), d = Geometry.Mid(a, b), e ~ (1, 0.08052) REL (b, a) IN Angle.Right(a, b, c) AND BarWidth = 2 * Geometry.Dist(b, c) AND d = Geometry.Mid(c, e) -> PS.MoveTo(c); Circle.DrawQuarter(b); Circle.DrawQuarter(b); PS.LineTo(e); Circle.DrawQuarter(a); Circle.DrawQuarter(a); PS.Close(); DrawHole(a); DrawHole(b); FillBody() END FI END; UI PointTool(DrawLink); PROC LabelLink(a, b, txt) IS VAR c IN c := Geometry.Mid(a, b); TypeLinesC.Center(c, txt) END END; UI TextTool(LabelLink); PROC DrawTriBody(a, b, c) IS IF VAR d ~ (1, 0.12) REL (a, c), e ~ (0, 0.2) REL (c, b), f ~ (1, 0.2) REL (c, b), g ~ (0, 0.138) REL (b, a), h ~ (1, 0.1333) REL (b, a), i ~ (0, 0.2805) REL (a, c) IN Angle.Right(a, c, d) AND Angle.Right(c, a, i) AND Angle.Right(b, c, e) AND Angle.Right(c, b, f) AND Angle.Right(a, b, g) AND Angle.Right(b, a, h) AND BarWidth = 2 * Geometry.Dist(c, d) AND (c, d) CONG (a, h) AND (c, d) CONG (b, f) -> PS.MoveTo(d); Arc.Draw(c, e); PS.LineTo(f); Arc.Draw(b, g); PS.LineTo(h); Arc.Draw(a, i); PS.Close(); DrawHole(c); DrawHole(b); DrawHole(a); FillBody() END FI END; UI PointTool(DrawTriBody); PROC LabelTriBody(a, b, c, txt) IS VAR d IN d := Triangle.InCenter(a, b, c); TypeLinesC.Center(d, txt) END END; UI TextTool(LabelTriBody); PROC BrunkhartFig17() IS IF VAR a = (-23.48, 8.343), b = (-91.64, 69.02), c = (75.74, -33.37), d ~ (-36.46, 161.9), e ~ (-23.16, 62.34), f ~ (64.97, 124.8), g ~ (84.18, 74.3), h = (-21.96, 264) IN IsLink1(a, e) AND IsLink2(c, g) AND IsLink2(d, f) AND IsLink2(b, d) AND IsLink2(g, e) AND IsLink2(e, f) AND IsLink1(f, g) AND Geometry.Colinear(a, e, h) -> PS.SetFontSize(PS.Small); PS.SetFontFace("Times-Bold"); DrawLink(a, e); LabelLink(a, e, "I"); DrawLink(c, g); LabelLink(c, g, "III"); DrawTriBody(e, g, f); LabelTriBody(e, g, f, "II"); DrawLink(b, d); LabelLink(b, d, "V"); DrawLink(d, f); LabelLink(d, f, "IV") END FI END; UI Template(BrunkhartFig17); PROC FourBarLinkage() IS IF VAR a = (-90.89, 56.63), b ~ (-86.75, 110.5), c ~ (20.06, 126.5), d = (45.44, -15.28) IN IsLink1(a, b) AND IsLink2(b, c) AND IsLink3(c, d) -> DrawLink(a, b); DrawLink(b, c); DrawLink(c, d) END FI END; UI Template(FourBarLinkage); PROC Cmd0() IS IF VAR a = (-90.89, 56.63), b ~ (-61.2, 101.7), c ~ (43.38, 128.7), d = (45.44, -15.28) IN IsLink1(a, b) AND IsLink2(b, c) AND IsLink3(c, d) -> DrawLink(a, b); DrawLink(b, c); DrawLink(c, d) END FI END;