[Edu-sig] Radical Math: debugging help?

kirby urner kirby.urner at gmail.com
Tue Apr 13 06:16:22 CEST 2010


On Sat, Apr 10, 2010 at 4:41 PM, kirby urner <kirby.urner at gmail.com> wrote:
> Below is current source for ch.py, a module for exploring volume
> relationships starting with a "ground state" (a default) known as the
> concentric hierarchy of polyhedra.

OK, a couple replies to this one:

(a) I found the bug:  I'd neglected to subclass 'object' as my root object,
so was not getting new-style classes, just classic classes -- we still
have that distinction in 2.6.

(b) I made numerous enhancements for this new improved deluxe
edition, appended herewith:

"""
Radical Math, Portland, Oregon (April, 2010)

A reading and Python module (GPL, 4Dsolutions.net)
"""

from math import sqrt as radical

phi = (1 + radical(5))/2

class Poly( object):

    def __init__(self,  edge = 1, edge_name = "edge",
                 volume = 1, greekname = "Tetrahedron",
                 platonic = True, dual = "Tetrahedron"):
        self.edge = edge
        self.edge_name = edge_name
        self.volume = volume
        self.greekname = greekname
        self.platonic = platonic
        self.dual = dual

    def scale(self, scalefactor):
        edge = self.edge * scalefactor  # edge unbound to self
        volume = self.volume * pow(scalefactor, 3)  # likewise volume
        # print("DEBUG:  a star is born: a new %s" % self.__class__.__name__)
        return self.__class__(edge = edge, edge_name = self.edge_name,
                              volume = volume, greekname = self.greekname)

    __mul__ = __rmul__ = scale # e.g. tetra = tetra * 3

    def __repr__(self):
        return "Polyhedron of type %s (vol: %s)" % (self.greekname, self.volume)

class Tetra( Poly ):
    pass

class Cube( Poly ):
    def __init__(self, edge = 1, edge_name = "any face diagonal",
                 volume = 3, greekname = "Cube",
                 platonic=True, dual="Octahedron"):
        super(Cube, self).__init__(*(edge, edge_name, volume,
greekname, platonic, dual))

class Octa( Poly ):
    def __init__(self, edge = 1, edge_name = "any edge",
                 volume = 4, greekname = "Octahedron",
                 platonic=True, dual="Cube"):
        super(Octa, self).__init__(*(edge, edge_name, volume,
greekname, platonic, dual))

class R_Dodeca( Poly ):
    def __init__(self, edge = 1, edge_name = "any long face diagonal",
                 volume = 6, greekname = "Rhombic Dodecahedron",
                 platonic=False, dual="Cuboctahedron"):
        super(R_Dodeca, self).__init__(*(edge, edge_name, volume,
greekname, platonic, dual))

class R_Triac( Poly ):
    def __init__(self, edge = radical(2)/2, edge_name = "any long face
diagonal",
                 volume = 7.5, greekname = "Rhombic Triacontahedron",
                 platonic=False, dual="Icosidodecahedron"):
        super(R_Triac, self).__init__(*(edge, edge_name, volume,
greekname, platonic, dual))

class Icosa ( Poly ):
    def __init__(self, edge = 1.0, edge_name = "any edge",
                 volume = 5 * phi**2 * radical(2), greekname = "Icosahedron",
                 platonic=True, dual="Pentagonal Dodecahedron"):
        super(Icosa, self).__init__(*(edge, edge_name, volume,
greekname, platonic, dual))

class P_Dodeca ( Poly ):
    def __init__(self, edge = 1/phi, edge_name = "any edge",
                 volume = (phi**2 + 1) * 3 * radical(2), greekname =
"Pentagonal Dodecahedron",
                 platonic=True, dual="Icosahedron"):
        super(P_Dodeca, self).__init__(*(edge, edge_name, volume,
greekname, platonic, dual))

class Cubocta ( Poly ):
    def __init__(self, edge = 1, edge_name = "any edge",
                 volume = 20, greekname = "Cuboctahedron",
                 platonic=False, dual = "Rhombic Dodecahedron"):
        super(Cubocta, self).__init__(*(edge, edge_name, volume,
greekname, platonic, dual))

def test1():
    c = Cube()
    print "First shape: %s" % c
    print "Dual: %s  Platonic: %s" % (c.dual, c.platonic)

    d = P_Dodeca()
    print "Second shape: %s" % d
    print "Dual: %s  Platonic: %s" % (d.dual, d.platonic)

def test2():
    print "\n\nVolumes Table\n============="
    for shape in (Tetra(), Cube(), Octa(), R_Triac()*pow(2./3,1./3),
                  R_Dodeca(), R_Triac(), P_Dodeca(), Icosa(), Cubocta()):
        poly = "{0} ({1} = {2:.4g})".format(shape.greekname,
shape.edge_name, shape.edge)
        print "{0:<60}{1:>8.4g}".format(poly, shape.volume)

def test3():
    print "\n\nDuals Table\n=========="
    for shape in (Tetra(), Cube(), Octa(), R_Dodeca(), R_Triac(),
P_Dodeca(), Icosa(), Cubocta()):
        print "{0:<30}{1}".format(shape.greekname+"
*"[int(shape.platonic)], shape.dual)
    print "\n * = Platonic"

if __name__ == "__main__":

    print """
    <plot tone="whimsical / buckaneer" type="non-fiction">

    Silicon Foresters, aided by committed allies
    from the USA and elsewhere, battled the
    tyranny of an over-specialized majority
    unwilling to share important heritage.

    Our hero, Medal of Freedom winner and
    premier architect of his age, had contributed
    some valuable pedagogical and andragogical
    assets, yet these were sequestered as
    Verboten Math by some conspiracy of
    know-it-alls, rumoredly with a HQS near
    Princeton (the better to work with ETS
    perhaps).  1879 Hall fought back brilliantly,
    bringing Wittgenstein (LW) to bear etc.

    Note: D. Coxeter aka "King of IS" was a
    student of LW's @ Cambridge, and later worked
    with our hero on various geometric discoveries.
    Dr. Arthur Loeb, a true Renaissance man,
    was a bridge to M.C. Escher.

    Legend:
    ETS = Educational Testing Service
    IS = 'Infinite Space' (from a recent title)
    1879 Hall = served Princeton U's philo & religion
    depts in 1970s, has since been enlarged.

    </plot>

    """

    # test1()
    test2()
    test3()


More information about the Edu-sig mailing list