Volný středový/rovnoběžný průmět bodu

Rovnoběžné promítání (jakožto afinní zobrazení) je určeno obrazy 4 bodů  v obecné poloze: O', X', Y', Z'.
Středové promítání (jakožto projektivní zobrazení) je určeno obrazy 4 bodů v obecné poloze a úběžníky odpovídajícíh přímek: O', X', U'_x, Y', U'_y, Z', U'_z.

Přepínač a rozlišuje mezi rovnoběžným, resp. středovým promítáním. 
Přepínač d zobrazuje konstrukci přenášení dělicího poměru, resp. dvojpoměru bodů na ose x.
Přepínač p zobrazuje několik pomocných přímek.
Přepínač u zobrazuje uběžnici roviny OXY a průměty dvou dalších rovnoběžek.

Volné objekty jsou vyznačeny zeleně a modře.

dim = 3 (slider from 1 to 3, step 1)
a = 0 (slider from 0 to 1, step 1)
U'_x = (-89.7462820144063, 32.2062844957614)
E_1 = (10.068498503173462, -7.49130928927423)
a_3 = OrthogonalLine(E_1, xAxis)
O' = (3.518548298913829, -23.951578591805507)
x' = Line(O', U'_x)
X' = Point(Line[O', U'_x])
O = Intersect(xAxis, yAxis)
x_E = Point(xAxis)
X = Point(xAxis)
l_3 = Circle(O', Distance[O, X])
X_0 = Point(l_3)
k0 = AffineRatio(x_E, X, O)
U'_y = (83.24955050818421, 32.47677720791721)
q_1 = OrthogonalLine(E_1, yAxis)
y_E: (0, y(E_1))
Y = Point(yAxis)
y' = Line(O', U'_y)
Y' = Point(Line[O', U'_y])
U'_z = (7.208371182879299, -167.9826081943648)
z' = Line(O', U'_z)
Z' = Point(Line[O', U'_z])
Z = Point(yAxis)
d = 0 (slider from 0 to 1, step 1)
r = OrthogonalLine(E_1, xAxis)
a_2 = Line(O', X_0)
b_2 = Line(X_0, X')
e_2 = Line(U'_x, a_2)
S = Intersect(e_2, b_2)
s_2 = Circle(O', Distance[O, y_E])
ky = If(a ≟ 1, AffineRatio[y_E, Y, O], (AffineRatio[y_E, Y, O] * AffineRatio[U'_y, Y', O']))
y'_E = Point(O', Vector[(ky / (ky - 1) * Vector[O', Y'])])
l = If(a ≟ 1, Line[y'_E, x'], Line[y'_E, U'_x])
E_2 = (10.068498503173462, 14.546917426251406)
z_E: (0, y(E_2))
m_2 = If(a ≟ 1, Line[y'_E, z'], Line[U'_z, y'_E])
b_3 = OrthogonalLine(z_E, a_3)
kx = If(a ≟ 1, AffineRatio[x_E, X, O], (AffineRatio[x_E, X, O] * AffineRatio[U'_x, X', O']))
kz = If(a ≟ 1, AffineRatio[z_E, Z, O], (AffineRatio[z_E, Z, O] * AffineRatio[U'_z, Z', O']))
x'_E = Point(O', Vector[(kx / (kx - 1) * Vector[O', X'])])
u = 0 (slider from 0 to 1, step 1)
z'_E = Point(O', Vector[(kz / (kz - 1) * Vector[O', Z'])])
x_{E_0} = Point(O', Vector[(k0 / (k0 - 1) * Vector[O', X_0])])
c = If(a ≟ 1, Line[x_{E_0}, b_2], Line[S, x_{E_0}])
e = If(a ≟ 1, Line[x'_E, y'], Line[x'_E, U'_y])
E'_1 = Intersect(e, l)
g = If(a ≟ 1, Line[x'_E, z'], Line[U'_z, x'_E])
h = If(a ≟ 1, Line[z'_E, x'], Line[z'_E, U'_x])
i = If(a ≟ 1, Line[z'_E, y'], Line[z'_E, U'_y])
E'_2 = Intersect(h, g)
E'_3 = Intersect(i, m_2)
j = If(a ≟ 1, Line[E'_3, x'], Line[E'_3, U'_x])
m = If(a ≟ 1, Line[E'_2, y'], Line[E'_2, U'_y])
E' = Intersect(m, j)
p = 1 (slider from 0 to 1, step 1)
n = Segment(y'_E, E'_1)
q = Segment(E'_1, x'_E)
s = Segment(E', E'_1)
t = Segment(z_E, E_2)
a_1 = Segment(E_2, x_E)
b_1 = Segment(x_E, E_1)
c_1 = Segment(E_1, y_E)
d_1 = Segment(z'_E, E'_2)
e_1 = Segment(E'_2, E')
f_1 = Segment(E', E'_3)
g_1 = Segment(E'_3, z'_E)
h_1 = Segment(E'_2, x'_E)
i_1 = Segment(E'_3, y'_E)
u' = Line(U'_y, U'_x)
k_1 = Line(O', E'_1)
l_1 = Line(z'_E, E')
V' = Intersect(k_1, l_1)
m_1 = Line(z_E, E_2)
n_1 = Line(O, E_1)
p_1 = Segment(z_E, O)
r_1 = Segment(O, x_E)
s_1 = Segment(O, y_E)
t_1 = Segment(x'_E, O')
c_2 = Segment(O', y'_E)
d_2 = Segment(O', z'_E)
f = If(a ≟ 1, Line[E'_1, z'], Line[U'_z, E'_1])
b = Ray(O, (0, -1))
j_1 = Ray(O, (0, 1))
j_2 = Line(O, (1, 0))
v = 1