[Edu-sig] Draft math/CS stuff (satacad 6938)

Kirby Urner urnerk at qwest.net
Wed Sep 14 01:49:23 CEST 2005


I'd be happy if anyone wants to comment on and/or mess with the code below.
It's what I'm working on for my upcoming Saturday Academy class, which uses
a combination of Python and POV-Ray to teach geometry.
http://www.saturdayacademy.org/classes/ClassDetail.aspx?id=6938

Some of my background info is on file here (another list) i.e. I talk about
what's unfinished: 
http://mail.geneseo.edu/pipermail/math-thinking-l/2005-September/000840.html

plus I'm still looking at properties, and continuing some recent threads re
pedagogy here on our edu-sig list.

Also, math-think-l unindented/trashed the source, perhaps because I
submitted in rich text through gmail, whereas a plain text submission
might've gotten through unscathed (??).  

Kirby

=====

class Vector(object):

    color = 'Red'
    
    def __init__(self, xyz):
        self.xyz = xyz

    def write(self):
        basic = "cylinder <0,0,0>, <%s,%s,%s>, 0.1" % self.xyz
        return "%s %s" % (basic, "pigment { color %s }" % self.color)
    
    def __repr__(self):
        return "Vector <%s, %s, %s>" % self.xyz
            
    def __mul__(self, scalar):
        xyz = tuple([scalar * i for i in self.xyz])
        return Vector(xyz)

    def __add__(self, other):
        xyz = tuple([ i+j for i,j in zip(self.xyz, other.xyz)])
        return Vector(xyz)

    def _get_xyz(self):
        return '<%s, %s, %s>' % self.xyz

    def _get_length(self):
        return pow(sum([i**2 for i in xyz]), 0.5)
  
    coords = property(_get_xyz)

    length = property(_get_length)
    

class Edge(object):

    color = 'Red'

    def __init__(self, v0, v1):
        self.v0 = v0
        self.v1 = v1

    def __repr__(self):
        return "Edge %s, %s" % (self.v0.coords, self.v1.coords)

    def write(self):
        basic = "cylinder %s, %s, 0.1" % (self.v0.coords, self.v1.coords)
        return "%s %s" % (basic, "pigment { color %s }" % self.color)

    
class Polyhedron(object):

    color = 'Red'

    def __init__(self, vertsdict, faces):
        self.verts = vertsdict
        self.faces = faces
        self.edges = self._get_edges()

    def __repr__(self):
        return "Polyhedron: %s edges, %s faces" \
               % (len(self.edges), len(self.faces))

    def _get_edges(self):
        # stub procedure:  take a list of face-tuples and distill
        # all the unique edges, e.g. ((1,2,3)) => ((1,2),(2,3),(3,1))
        # e.g. icosahedron has 20 faces and 30 unique edges
        # ( = cubocta 24 + tetra's 6 edges to squares per jitterbug)
        pass
        
    def write(self):
        # stub procedure -- needs to be completed
        return 'write out edges'

    def __mul__(self, scalar):
        newvectors = {}
        for v in self.verts:
            newvectors[v] = self.verts[v] * scalar
        return Polyhedron(newvectors, self.faces)

class Header (object):

    # defaults
    bgcolor = "color Gray50"
    lightloc = "<300, 300, -1000>"
    lightcolor = "White"
    
    @staticmethod
    def write():
        return """
#include "colors.inc"

background { %(bgcolor)s }
light_source{ %(lightloc)s %(lightcolor)s }
""" % Header.__dict__


class Camera (object):

    # defaults
    look_at  = 0
    location = '<0, .1, -25>'
        
    @staticmethod
    def write():
        return """
camera {
  location %(location)s
  look_at %(look_at)s
  angle 30
}
""" % Camera.__dict__
    
def buildicosa():
    
    phi = (1 + pow(5,0.5))/2.0
    
    verts = {# 2*phi x 2 rectangle in XZ
              1:Vector((-phi,  0,  -1)),
              2:Vector((-phi,  0,   1)),
              3:Vector(( phi,  0,   1)),
              4:Vector(( phi,  0,  -1)),
             # 2*phi x 2 rectange in XY
              5:Vector(( -1,  phi,  0)),
              6:Vector((  1,  phi,  0)),
              7:Vector((  1, -phi,  0)),
              8:Vector(( -1, -phi,  0)),
             # 2*phi x 2 rectange in YZ
              9:Vector((  0,  1,  phi)),
             10:Vector((  0, -1,  phi)),
             11:Vector((  0, -1, -phi)),
             12:Vector((  0,  1, -phi))}
    
    faces = ((5,6,9),(5,6,2),(5,12,1),(5,6,1),(5,1,2),
             (11,1,12),(11,12,4),(11,1,8),(11,4,7),(11,7,8),
             (4,12,6),(4,6,3),(4,3,7),
             (3,9,6),(3,6,4),
             (10,7,8))  #unfinished
    return verts, faces

def main():
    icosa = Polyhedron(*buildicosa())
    f = file('icosa.pov','w')
    Camera.location = '<0, 2, -20>'
    print >> f, Header.write()
    print >> f, Camera.write()
    print >> f, icosa.write()
    f.close()

if __name__ == '__main__':
    main()
    




More information about the Edu-sig mailing list