Book XII · Proposition 12

XII.12

Similar cones and cylinders are to one another in the triplicate ratio of the diameters in their bases.Heath, 1908

Every step, checked

What it needs, and what needs it

Needs: X.1 XII.11

Rests on: VI.Def.1, XI.Def.24

Depth: 3 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("XII.12", THEOREM, sample=samples3.cone_figure)
def prop_XII_12(o: Point3, a: Point3, d: Point3) -> Out:
    """Similar cones and cylinders are to one another in the triplicate ratio of
    the diameters of their bases."""
    hypothesis("the axis stands at right angles to the base",
               dot3(vector_between(o, a), vector_between(o, d)) == 0)
    hypothesis("the base has a positive radius and the height is not nothing",
               o != a and o != d)
    radius, axis = _cone_figure(o, a, d)
    ratio = Fraction(3, 2)
    centre = posit3(Point3(o.x + 9 * (a.x - o.x), o.y + 9 * (a.y - o.y),
                           o.z + 9 * (a.z - o.z)), "P")
    # Similar: the height is enlarged in the same ratio as the base, which is
    # what XI Def. 24 asks of two cones cut from similar triangles.
    taller = tuple(ratio * component for component in axis)
    apex = posit3(Point3(centre.x + taller[0], centre.y + taller[1],
                         centre.z + taller[2]), "Q")
    line3(o, d, "the first axis")
    line3(centre, apex, "the second axis")
    for stage in STAGES:
        _ring(regular_polygon(o, radius, axis, stage))
        _ring(regular_polygon(centre, ratio * radius, axis, stage))

    found = squeeze(lambda stage: (cone_bounds(o, radius, d, stage)
                                   / cone_bounds(centre, ratio * radius, apex, stage)),
                    1 / (ratio * ratio * ratio), STAGES)
    cylinders = squeeze(lambda stage: (cylinder_bounds(o, radius, axis, stage)
                                       / cylinder_bounds(centre, ratio * radius,
                                                         taller, stage)),
                        1 / (ratio * ratio * ratio), STAGES)
    claim("the cones are similar, base and height enlarged in one ratio",
          "XI.Def.24",
          length3(centre, apex) == ratio * length3(o, d))
    claim("the enclosure of each ratio holds the triplicate ratio of the "
          "diameters", "XII.11", found.held and cylinders.held)
    claim("and what is left over falls short of half itself at each stage",
          "X.1", found.narrowing and cylinders.narrowing)
    claim("therefore similar cones and cylinders are in the triplicate ratio of "
          "the diameters of their bases", "XII.12",
          found.held and cylinders.held)
    return Out(cones=found.enclosures, cylinders=cylinders.enclosures)