El billar arbitrariamente curvo (el borde es un spline) 
presenta problemas porque a veces GeoGebra 
es incapaz de encontrar todos los puntos de corte 
del spline con algunas rectas.

V0 = (1.0450216450215795, 1.1401271852614063)
V = (1.3681385281385132, 1.2064475315817824)
anima = 0.2 (slider from 0 to 1, step 0.01)
v0 = Vector(V0)
P1 = (-3, 3)
P2 = (1, 3)
P3 = (2, 1)
P4 = (5, 0)
P5 = (3, -3)
P6 = (-3, -2)
P7 = (-3, 0)
P8 = (-5, 1)
P9: P1
c = Spline(P1:P9, 3)
P0 = Point(c)
A1: {Intersect[Line[P0, Vector[V0]], c]}
B1 = Sort(A1, Sequence[abs(A1(k) - P0), k, 1, Length[A1]])
C1: B1(2)
D1 = Mirror(C1 + V0, Tangent[C1, c])
A2: {Intersect[Line[C1, D1], c]}
B2 = Sort(A2, Sequence[abs(A2(k) - C1), k, 1, Length[A2]])
C2: B2(2)
D2 = Mirror(C2 + D1 - C1, Tangent[C2, c])
A3: {Intersect[Line[C2, D2], c]}
B3 = Sort(A3, Sequence[abs(A3(k) - C2), k, 1, Length[A3]])
C3: B3(2)
D3 = Mirror(C3 + D2 - C2, Tangent[C3, c])
A4: {Intersect[Line[C3, D3], c]}
B4 = Sort(A4, Sequence[abs(A4(k) - C3), k, 1, Length[A4]])
C4: B4(2)
D4 = Mirror(C4 + D3 - C3, Tangent[C4, c])
A5: {Intersect[Line[C4, D4], c]}
B5 = Sort(A5, Sequence[abs(A5(k) - C4), k, 1, Length[A5]])
C5: B5(2)
D5 = Mirror(C5 + D4 - C4, Tangent[C5, c])
A6: {Intersect[Line[C5, D5], c]}
B6 = Sort(A6, Sequence[abs(A6(k) - C5), k, 1, Length[A6]])
C6: B6(2)
D6 = Mirror(C6 + D5 - C5, Tangent[C6, c])
A7: {Intersect[Line[C6, D6], c]}
B7 = Sort(A7, Sequence[abs(A7(k) - C6), k, 1, Length[A7]])
C7: B7(2)
D7 = Mirror(C7 + D6 - C6, Tangent[C7, c])
A8: {Intersect[Line[C7, D7], c]}
B8 = Sort(A8, Sequence[abs(A8(k) - C7), k, 1, Length[A8]])
C8: B8(2)
D8 = Mirror(C8 + D7 - C7, Tangent[C8, c])
A9: {Intersect[Line[C8, D8], c]}
B9 = Sort(A9, Sequence[abs(A9(k) - C8), k, 1, Length[A9]])
C9: B9(2)
D9 = Mirror(C9 + D8 - C8, Tangent[C9, c])
A10: {Intersect[Line[C9, D9], c]}
B10 = Sort(A10, Sequence[abs(A10(k) - C9), k, 1, Length[A10]])
C10: B10(2)
D10 = Mirror(C10 + D9 - C9, Tangent[C10, c])
A11: {Intersect[Line[C10, D10], c]}
B11 = Sort(A11, Sequence[abs(A11(k) - C10), k, 1, Length[A11]])
C11: B11(2)
D11 = Mirror(C11 + D10 - C10, Tangent[C11, c])
A12: {Intersect[Line[C11, D11], c]}
B12 = Sort(A12, Sequence[abs(A12(k) - C11), k, 1, Length[A12]])
C12: B12(2)
D12 = Mirror(C12 + D11 - C11, Tangent[C12, c])
trayectoria = PolyLine(C1:C40)
f = Segment(P0, C1)
A13: {Intersect[Line[C12, D12], c]}
B13 = Sort(A13, Sequence[abs(A13(k) - C12), k, 1, Length[A13]])
C13: B13(2)
D13 = Mirror(C13 + D12 - C12, Tangent[C13, c])
A14: {Intersect[Line[C13, D13], c]}
B14 = Sort(A14, Sequence[abs(A14(k) - C13), k, 1, Length[A14]])
C14: B14(2)
D14 = Mirror(C14 + D13 - C13, Tangent[C14, c])
A15: {Intersect[Line[C14, D14], c]}
B15 = Sort(A15, Sequence[abs(A15(k) - C14), k, 1, Length[A15]])
C15: B15(2)
D15 = Mirror(C15 + D14 - C14, Tangent[C15, c])
A16: {Intersect[Line[C15, D15], c]}
B16 = Sort(A16, Sequence[abs(A16(k) - C15), k, 1, Length[A16]])
C16: B16(2)
D16 = Mirror(C16 + D15 - C15, Tangent[C16, c])
A17: {Intersect[Line[C16, D16], c]}
B17 = Sort(A17, Sequence[abs(A17(k) - C16), k, 1, Length[A17]])
C17: B17(2)
D17 = Mirror(C17 + D16 - C16, Tangent[C17, c])
A18: {Intersect[Line[C17, D17], c]}
B18 = Sort(A18, Sequence[abs(A18(k) - C17), k, 1, Length[A18]])
C18: B18(2)
D18 = Mirror(C18 + D17 - C17, Tangent[C18, c])
A19: {Intersect[Line[C18, D18], c]}
B19 = Sort(A19, Sequence[abs(A19(k) - C18), k, 1, Length[A19]])
C19: B19(2)
D19 = Mirror(C19 + D18 - C18, Tangent[C19, c])
A20: {Intersect[Line[C19, D19], c]}
B20 = Sort(A20, Sequence[abs(A20(k) - C19), k, 1, Length[A20]])
C20: B20(2)
D20 = Mirror(C20 + D19 - C19, Tangent[C20, c])
A21: {Intersect[Line[C20, D20], c]}
B21 = Sort(A21, Sequence[abs(A21(k) - C20), k, 1, Length[A21]])
C21: B21(2)
D21 = Mirror(C21 + D20 - C20, Tangent[C21, c])
A22: {Intersect[Line[C21, D21], c]}
B22 = Sort(A22, Sequence[abs(A22(k) - C21), k, 1, Length[A22]])
C22: B22(2)
D22 = Mirror(C22 + D21 - C21, Tangent[C22, c])
A23: {Intersect[Line[C22, D22], c]}
B23 = Sort(A23, Sequence[abs(A23(k) - C22), k, 1, Length[A23]])
C23: B23(2)
D23 = Mirror(C23 + D22 - C22, Tangent[C23, c])
A24: {Intersect[Line[C23, D23], c]}
B24 = Sort(A24, Sequence[abs(A24(k) - C23), k, 1, Length[A24]])
C24: B24(2)
D24 = Mirror(C24 + D23 - C23, Tangent[C24, c])
A25: {Intersect[Line[C24, D24], c]}
B25 = Sort(A25, Sequence[abs(A25(k) - C24), k, 1, Length[A25]])
C25: B25(2)
D25 = Mirror(C25 + D24 - C24, Tangent[C25, c])
A26: {Intersect[Line[C25, D25], c]}
B26 = Sort(A26, Sequence[abs(A26(k) - C25), k, 1, Length[A26]])
C26: B26(2)
D26 = Mirror(C26 + D25 - C25, Tangent[C26, c])
A27: {Intersect[Line[C26, D26], c]}
B27 = Sort(A27, Sequence[abs(A27(k) - C26), k, 1, Length[A27]])
C27: B27(2)
D27 = Mirror(C27 + D26 - C26, Tangent[C27, c])
A28: {Intersect[Line[C27, D27], c]}
B28 = Sort(A28, Sequence[abs(A28(k) - C27), k, 1, Length[A28]])
C28: B28(2)
D28 = Mirror(C28 + D27 - C27, Tangent[C28, c])
A29: {Intersect[Line[C28, D28], c]}
B29 = Sort(A29, Sequence[abs(A29(k) - C28), k, 1, Length[A29]])
C29: B29(2)
D29 = Mirror(C29 + D28 - C28, Tangent[C29, c])
A30: {Intersect[Line[C29, D29], c]}
B30 = Sort(A30, Sequence[abs(A30(k) - C29), k, 1, Length[A30]])
C30: B30(2)
D30 = Mirror(C30 + D29 - C29, Tangent[C30, c])
A31: {Intersect[Line[C30, D30], c]}
B31 = Sort(A31, Sequence[abs(A31(k) - C30), k, 1, Length[A31]])
C31: B31(2)
D31 = Mirror(C31 + D30 - C30, Tangent[C31, c])
A32: {Intersect[Line[C31, D31], c]}
B32 = Sort(A32, Sequence[abs(A32(k) - C31), k, 1, Length[A32]])
C32: B32(2)
D32 = Mirror(C32 + D31 - C31, Tangent[C32, c])
A33: {Intersect[Line[C32, D32], c]}
B33 = Sort(A33, Sequence[abs(A33(k) - C32), k, 1, Length[A33]])
C33: B33(2)
D33 = Mirror(C33 + D32 - C32, Tangent[C33, c])
A34: {Intersect[Line[C33, D33], c]}
B34 = Sort(A34, Sequence[abs(A34(k) - C33), k, 1, Length[A34]])
C34: B34(2)
D34 = Mirror(C34 + D33 - C33, Tangent[C34, c])
A35: {Intersect[Line[C34, D34], c]}
B35 = Sort(A35, Sequence[abs(A35(k) - C34), k, 1, Length[A35]])
C35: B35(2)
D35 = Mirror(C35 + D34 - C34, Tangent[C35, c])
A36: {Intersect[Line[C35, D35], c]}
B36 = Sort(A36, Sequence[abs(A36(k) - C35), k, 1, Length[A36]])
C36: B36(2)
D36 = Mirror(C36 + D35 - C35, Tangent[C36, c])
A37: {Intersect[Line[C36, D36], c]}
B37 = Sort(A37, Sequence[abs(A37(k) - C36), k, 1, Length[A37]])
C37: B37(2)
D37 = Mirror(C37 + D36 - C36, Tangent[C37, c])
A38: {Intersect[Line[C37, D37], c]}
B38 = Sort(A38, Sequence[abs(A38(k) - C37), k, 1, Length[A38]])
C38: B38(2)
D38 = Mirror(C38 + D37 - C37, Tangent[C38, c])
A39: {Intersect[Line[C38, D38], c]}
B39 = Sort(A39, Sequence[abs(A39(k) - C38), k, 1, Length[A39]])
C39: B39(2)
D39 = Mirror(C39 + D38 - C38, Tangent[C39, c])
A40: {Intersect[Line[C39, D39], c]}
B40 = Sort(A40, Sequence[abs(A40(k) - C39), k, 1, Length[A40]])
C40: B40(2)
D40 = Mirror(C40 + D39 - C39, Tangent[C40, c])