smartDrawing(300, (rac, shared) => {
const Q2 = rac.Point(353,279)
const Q1 = rac.Point(98,21)
const P1 = rac.Point(452,106)
const P2 = rac.Point(53,209)
const R = rac.Point(207,84)
const p = P1.rayToPoint(P2)
const q = Q1.rayToPoint(Q2)
const calibration = rac
.Composite([
p,
q,
markPoint(rac, R, "R", rac.Text.Format.bc),
q.text("q"),
p.text("p").upright()
])
.draw();
const C = p.pointAtIntersection(q);
const k = C.arc(50, 6/10,1);
const S1 = k.intersectionChordWithRay(p).startPoint();
const S2 = k.intersectionChordWithRay(q).startPoint();
const S = S1.pointAtBisector(S2);
const o = C.rayToPoint(S)
const MN = R.rayToProjectionInRay(o).translateToDistance(-100);
const M = MN.pointAtIntersection(p);
const N = MN.pointAtIntersection(q);
const NK = N.rayToProjectionInRay(MN);
const K = NK.pointAtIntersection(p);
const ML = M.rayToProjectionInRay(MN);
const L = ML.pointAtIntersection(q);
const steps = rac.Composite([
markPoint(rac, C, "C", rac.Text.Format.tr),
k,
markPoint(rac, S1, "S1", rac.Text.Format.tr),
markPoint(rac, S2, "S2", rac.Text.Format.tr),
o,
o.pointAtCanvasEdge().text("o"),
MN,
markPoint(rac, M, "M", rac.Text.Format.tr),
markPoint(rac, N, "N", rac.Text.Format.tr),
NK,
markPoint(rac, K, "K", rac.Text.Format.tr),
ML,
markPoint(rac, L, "L", rac.Text.Format.tr),
polygon(rac, [K,L,M,N])
]).draw();
})