using Luxor using ReCo: ReCo function gen_COM_graphics() box_length = 100 box_height = 100 L = 0.39 * box_length R = 0.37 * box_length A = -0.9 * L B = 0.65 * L particle_radius = 0.05 * L Ap_vec = Vector(ReCo.Shape.project_to_unit_circle(A, L)) Bp_vec = Vector(ReCo.Shape.project_to_unit_circle(B, L)) for p in (Ap_vec, Bp_vec) p[2] *= -1 end Ap = Point(Ap_vec[1], Ap_vec[2]) Bp = Point(Bp_vec[1], Bp_vec[2]) M = R * ((Ap + Bp) / 2) θ = atan(-M[2], M[1]) COM = ReCo.Shape.project_back_from_unit_circle(θ, L) si, co = sincos(θ) COMp = R * Point(co, -si) ## graphics_export_dir = "../../exports/graphics/COM" mkpath(graphics_export_dir) Drawing(box_length, box_height, "$graphics_export_dir/linear.pdf") origin() fontsize(5) setcolor("black") arrow(Point(-1.1 * L, 0), Point(1.2 * L, 0); arrowheadlength=0.1 * L, linewidth=1.0) green_orange = blend(Point(-1.5 * L, 0), Point(1.5 * L, 0)) addstop(green_orange, 0.0, "orange") addstop(green_orange, (L) / (3 * L), "green") addstop(green_orange, (2 * L) / (3 * L), "orange") addstop(green_orange, 1.0, "green") setblend(green_orange) setline(1.0) line(Point(-L, 0), Point(L, 0), :stroke) setcolor("red") setline(0.5) for x in (-L, L) line(Point(x, 0.05 * L), Point(x, -0.05 * L), :stroke) end setcolor("cyan3") line(Point(0, 0.05 * L), Point(0, -0.05 * L), :stroke) setcolor("blue") for p in (A, B) circle(Point(p, 0), particle_radius, :fill) end text("A", Point(A - 0.030 * L, -0.08 * L)) text("B", Point(B - 0.030 * L, -0.08 * L)) setcolor("brown") circle(Point(COM, 0), particle_radius, :fill) text("COM", Point(COM - 0.098 * L, -0.08 * L)) setcolor("black") text("x", Point(1.2 * L, 0.038 * L)) text("-L/2", Point(-L - 0.15 * L, 0.20 * L)) text("0", Point(0 - 0.030 * L, 0.18 * L)) text("+L/2", Point(L - 0.15 * L, 0.20 * L)) finish() ## Drawing(box_length, box_height, "$graphics_export_dir/circular_projection.pdf") origin() fontsize(5) arrow(Point(-1.2 * R, 0), Point(1.2 * R, 0); arrowheadlength=0.1 * R, linewidth=1.0) arrow(Point(0, 1.2 * R), Point(0, -1.2 * R); arrowheadlength=0.1 * R, linewidth=1.0) setcolor("black") text("α", Point(1.22 * R, 0.035 * R)) text("β", Point(-0.04 * R, -1.23 * R)) green_orange = blend(Point(0, -R), Point(0, R), "green", "orange") setblend(green_orange) setline(1.0) circle(Point(0, 0), R, :stroke) setcolor("red") setline(0.5) line(Point(1.05 * R, 0), Point(0.95 * R, 0), :stroke) setcolor("cyan3") line(Point(-1.05 * R, 0), Point(-0.95 * R, 0), :stroke) setcolor("blue") for pp in (Ap, Bp) circle(R * pp, particle_radius, :fill) end text("A", 1.07 * R * Ap) text("B", 1.14 * R * Bp) setcolor("black") setdash("dot") line(R * Ap, R * Bp, :stroke) line(Point(0, 0), COMp, :stroke) setcolor("purple1") circle(M, particle_radius, :fill) text("COM'", 0.019 * R * M + R * Point(0.0, -0.04)) setcolor("brown") circle(COMp, particle_radius, :fill) text("COM", 0.029 * R * COMp) finish() return nothing end