Book XI · Proposition 27

XI.27

On a given straight line to describe a parallelepipedal solid similar and similarly situated to a given parallelepipedal solid.Heath, 1908

Every step, checked

What it needs, and what needs it

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.

What it takes on trust

Nothing. It draws no intersections and reads nothing off the picture.

The proposition as code

@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)