#---------------------------------------------------------------------- # Introduction to Orthographic 3D Projections # # Copyright (C) April 7, 2017 -- Dr. William T. Verts #---------------------------------------------------------------------- Origin2D = [0,0] # Location of [0,0,0] on canvas Scale2D = 1.0 # Pixels per 3D Unit Cosine30 = cos(math.radians(30.0)) # Projection Angle Sine30 = sin(math.radians(30.0)) # Projection Angle def SetOrigin2D (P2D): # Location on the canvas of the [0,0,0] point global Origin2D Origin2D = P2D return def SetScale2D (N): # Scale (size) multiplier global Scale2D Scale2D = N return def Project3D (P3D): # P3D is [X,Y,Z] in space, function returns [X,Y] on the canvas global Scale2D,Origin2D X = Origin2D[0] + (P3D[0] + P3D[2] * Cosine30) * Scale2D Y = Origin2D[1] - (P3D[1] + P3D[2] * Sine30) * Scale2D return [X,Y] #---------------------------------------------------------------------- # Higher level 3D geometric functions #---------------------------------------------------------------------- def INT(N): return int(round(N)) def addLine2D (Canvas, P1, P2, NewColor=black): # P1 and P2 are both [X,Y] lists addLine(Canvas, INT(P1[0]), INT(P1[1]), INT(P2[0]), INT(P2[1]), NewColor) return def addLine3D (Canvas, P1, P2, NewColor=black): # P1 and P2 are both [X,Y,Z] lists addLine2D (Canvas, Project3D(P1), Project3D(P2), NewColor) return def addCube (Canvas, N): addLine3D(Canvas, [0,0,0], [N,0,0]) addLine3D(Canvas, [0,N,0], [N,N,0]) addLine3D(Canvas, [0,0,0], [0,N,0]) addLine3D(Canvas, [N,0,0], [N,N,0]) addLine3D(Canvas, [0,0,N], [N,0,N]) addLine3D(Canvas, [0,N,N], [N,N,N]) addLine3D(Canvas, [0,0,N], [0,N,N]) addLine3D(Canvas, [N,0,N], [N,N,N]) addLine3D(Canvas, [0,0,0], [0,0,N]) addLine3D(Canvas, [N,0,0], [N,0,N]) addLine3D(Canvas, [0,N,0], [0,N,N]) addLine3D(Canvas, [N,N,0], [N,N,N]) return #---------------------------------------------------------------------- # Simple test program #---------------------------------------------------------------------- def Main(): Canvas = makeEmptyPicture(800,600) SetOrigin2D ([100,500]) SetScale2D (4) show(Canvas) addLine3D(Canvas, [0,0,0], [100,0,0], red) addLine3D(Canvas, [0,0,0], [0,100,0], green) addLine3D(Canvas, [0,0,0], [0,0,100], blue) addCube(Canvas, 30) repaint(Canvas) return