link graphics procedure main() WOpen("height=500", "width=700", "label=Curve Editor") # whm pts := [] repeat case Event() of { &lpress: if not(i := nearpt(&x, &y, pts)) then {pts |||:= [&x, &y]; draw(pts)} &ldrag: if \i then {pts[i] := &x; pts[i + 1] := &y; draw(pts)} !"Qq": break } end procedure draw(pts) EraseArea() DrawCurve!(pts ||| [pts[1], pts[2]]) every i := 1 to *pts by 2 do FillCircle(pts[i], pts[i + 1], 3) end procedure nearpt(x, y, pts) every i := 1 to *pts by 2 do if abs(x - pts[i]) < 4 & abs(y - pts[i + 1]) < 4 then return i end