CONST HeadDist = 35, EndLimbDist = 1.5 * HeadDist, ForeLimbDist = 1.8 * EndLimbDist, WholeLimbDist = EndLimbDist + ForeLimbDist; PRIVATE PRED FixDist(a, b, d) IS d = Geometry.Dist(a, b) END; PRED FixHeadDist(a, b) IS FixDist(a, b, HeadDist) END; UI PointTool(FixHeadDist); PRED FixEndLimbDist(a, b) IS FixDist(a, b, EndLimbDist) END; UI PointTool(FixEndLimbDist); PRED FixForeLimbDist(a, b) IS FixDist(a, b, ForeLimbDist) END; UI PointTool(FixForeLimbDist); PRED FixWholeLimbDist(a, b) IS FixDist(a, b, WholeLimbDist) END; UI PointTool(FixWholeLimbDist); PROC Head(a, b) IS VAR c IN c := R2.Plus(b, (18.59, -0.9642)); PS.MoveTo(a); PS.LineTo(b); PS.Stroke(); Circle.Draw(b, c); PS.Fill() END END; UI PointTool(Head); PROC Limb(a, b) IS VAR c IN c := R2.Plus(b, (12.78, -0.9642)); PS.MoveTo(a); PS.LineTo(b); PS.Stroke(); Circle.Draw(b, c); PS.Fill() END END; UI PointTool(Limb); PROC Feet(d, a) IS IF VAR b ~ R2.Plus(a, (-42.43, -42.43)), c ~ R2.Plus(a, (42.43, -42.43)) IN b HOR c AND FixEndLimbDist(a, b) AND FixEndLimbDist(a, c) AND Angle.Right(b, a, c) -> Limb(a, b); Limb(a, c); PS.MoveTo(d); PS.LineTo(a); PS.Stroke() END FI END; UI PointTool(Feet); PROC Arm(a, b) IS IF VAR c ~ R2.Plus(b, (0, -60)) IN b VER c AND FixEndLimbDist(b, c) -> PS.MoveTo(a); PS.LineTo(b); PS.Stroke(); Limb(b, c) END FI END; UI PointTool(Arm); PROC Cmd0() IS IF VAR a = (-9.194, 38.5), b ~ (-35.86, 61.17), c ~ (62.8, -22.71), d ~ (-70.41, -33.49), e ~ (86.03, 150.5) IN Angle.Right(e, a, c) AND Geometry.Colinear(b, a, c) AND Geometry.Colinear(e, a, d) AND FixHeadDist(a, b) AND FixWholeLimbDist(a, e) AND FixForeLimbDist(a, d) AND FixForeLimbDist(a, c) -> PS.SetEndStyle(PS.RoundEnds); PS.SetWidth(10); Head(a, b); Feet(a, c); Arm(a, d); Limb(a, e) END FI END;