Perfect French Billiards: The Magic of Vectors
Loading the math board and drawing, please wait…
This GeoGebra example demonstrates the perfect rebound paths in French billiards (pocketless table) using vector-based reflections and translations. It visually explores how vectors govern the angle of incidence equals angle of reflection, and how repeated translations create elegant polygonal trajectories. Core mathematical concepts include vector operations, reflection laws, translation transformations, and optimization of path lengths or areas. The construction employs commands such as Segment, Line, OrthogonalLine, Intersect, Vector, Translate, If, Circle, Polygon, and Ray to build the table boundaries, rebound points, and dynamic path visualization. Sliders allow interactive adjustment of initial direction and position. Suitable for high school and university students studying vectors, geometric transformations, and optimization problems, as well as for physics demonstrations of elastic collisions.
GeoGebra Commands & Parameters
Segment(A, B) → fLine(C, f) → g1OrthogonalLine(A, g1) → i1Line(D, g1) → h1Intersect(h1, i1) → ABCD1Vector(D, ABCD1) → abcd1OrthogonalLine(B, h1) → j1Intersect(g1, j1) → ABCD2Translate(ABCD2, Vector[(-abcd1)]) → ABCD2'Segment(F, B) → hLine(E, h) → i3Line(C, i3) → j3OrthogonalLine(F, j3) → n3Intersect(i3, n3) → BCEF1Vector(E, BCEF1) → bcef1OrthogonalLine(B, i3) → m3Intersect(j3, m3) → BCEF2Translate(BCEF2, Vector[(-bcef1)]) → BCEF2'If(f < (2 * r), ABCD2', If[h < (2 * r), BCEF2', C]) → C1Vector(C, BCEF2) → bcef2Translate(BCEF1, Vector[(-bcef2)]) → BCEF1'Segment(A, F) → gLine(E, g) → h2Line(D, h2) → i2OrthogonalLine(A, i2) → m2Intersect(i2, m2) → ADEF2Vector(D, ADEF2) → adef2OrthogonalLine(F, h2) → j2Intersect(h2, j2) → ADEF1Translate(ADEF1, Vector[(-adef2)]) → ADEF1'Vector(E, ADEF1) → adef1Translate(ADEF2, Vector[(-adef1)]) → ADEF2'Vector(C, ABCD2) → abcd2Translate(ABCD1, Vector[(-abcd2)]) → ABCD1'If(f < (2 * r), ABCD1', If[g < (2 * r), ADEF2', D]) → D1Translate(C1, cb) → C2Translate(D1, da) → D2Translate(B, cb) → B2Translate(A, da) → A2If(x(B2) < 0, (-x(B2)), If[x(B2) > Lx, (2 * Lx) - x(B2), x(B2)]) → xBIf(x(B2) < 0, (-x(C2)), If[x(B2) > Lx, (2 * Lx) - x(C2), x(C2)]) → xCIf(x(A2) < 0, (-x(D2)), If[x(A2) > Lx, (2 * Lx) - x(D2), x(D2)]) → xDIf(y(B2) < 0, (-y(C2)), If[y(B2) > Ly, (2 * Ly) - y(C2), y(C2)]) → yCIf(y(A2) < 0, (-y(D2)), If[y(A2) > Ly, (2 * Ly) - y(D2), y(D2)]) → yDCircle(A3, r) → cCircle(B3, r) → dSegment(D3, A3) → kIf(g ≤ (2 * r), ADEF1', If[h < (2 * r), BCEF1', E]) → E1Segment(C3, B3) → lTranslate(F, ef) → F2Translate(E1, ef) → E2If(x(F2) < 0, (-x(E2)), If[x(F2) > Lx, (2 * Lx) - x(E2), x(E2)]) → xEIf(y(F2) < 0, (-y(E2)), If[y(F2) > Ly, (2 * Ly) - y(E2), y(E2)]) → yECircle(F3, r) → eSegment(E3, F3) → iIntersect(m, n) → GIntersect(j, m) → HIntersect(j, p) → IIntersect(n, p) → JPolygon(G, H, I, J) → q1, p4, p3, p1, p2If(y(B2) < 0, (-y(B2)), If[y(B2) > Ly, (2 * Ly) - y(B2), y(B2)]) → yBIf(y(A2) < 0, (-y(A2)), If[y(A2) > Ly, (2 * Ly) - y(A2), y(A2)]) → yAIf(x(F2) < 0, (-x(F2)), If[x(F2) > Lx, (2 * Lx) - x(F2), x(F2)]) → xFIf(x(A2) < 0, (-x(A2)), If[x(A2) > Lx, (2 * Lx) - x(A2), x(A2)]) → xAIf(y(F2) < 0, (-y(F2)), If[y(F2) > Ly, (2 * Ly) - y(F2), y(F2)]) → yFRay(D3, A3) → q