Book XI · Proposition 27
On a given straight line to describe a parallelepipedal solid similar and similarly situated to a given parallelepipedal solid.Heath, 1908
Needs: XI.26
Used by: XI.33
Rests on: VI.Def.1, XI.Def.11, XI.Def.9
Depth: 2 steps of argument above the first principles. Parallel postulate: not needed.
Nothing. It draws no intersections and reads nothing off the picture.
@proposition("XI.27", CONSTRUCTION, sample=samples3.two_corners)
def prop_XI_27(o: Point3, a: Point3, b: Point3, c: Point3,
d: Point3, e: Point3, f: Point3, g: Point3) -> Out:
"""On a given straight line describe a parallelepiped similar and similarly
situated to a given one."""
hypothesis("the three arms are not in one plane", not coplanar(o, a, b, c))
hypothesis("the given straight line has two distinct ends", d != e)
given = _built(parallelepiped(o, a, b, c, "the given solid"))
reach = len2(o, a)
# Similar means the edges in one ratio, so the scale is fixed by the given
# line against the edge it answers to. Both are squared, and the quotient of
# two squares is the square of the quotient, so one root gives the ratio.
scale = sqrt(len2(d, e) / reach)
corner = posit3(d, "")
arms = []
for point, name in ((a, "P"), (b, "Q"), (c, "R")):
step = vector_between(o, point)
arms.append(posit3(Point3(d.x + scale * step[0], d.y + scale * step[1],
d.z + scale * step[2]), name))
described = _built(parallelepiped(d, *arms, "the solid described"))
claim("the solid is described on the given straight line", "XI.26",
len2(d, arms[0]) == len2(d, e))
claim("its edges are to the edges of the given solid in one ratio", "VI.Def.1",
all(side == scale * scale * given_side for side, given_side in
zip(edge_lengths(described), edge_lengths(given))))
claim("and the solid angles at the answering corners are equal, so it is "
"similarly situated", "XI.Def.9",
_solid_angle_of(d, tuple(arms)) == _solid_angle_of(o, (a, b, c)))
return Out(described=described, given=given, scale=scale)