#!/usr/bin/env python from math import * M_PI = pi true=1 false=0 from epix import * #################################################################### # Converted from tori.xp #################################################################### N1=24 # latitudes N2=48 # longitudes LIGHT=P(1,1,0.5) # location of light, for shading VIEWPT=P(6, 3, 4) r_0=0.95 # minor radius EPS=0.0025 # shrinkage du=2.0/N1 dv=2.0/N2 class mesh_quad: def __init__(self, f, u0, v0): self.pt1=f(u0+EPS,v0+EPS) self.pt2=f(u0+du-EPS,v0+EPS) self.pt3=f(u0+du-EPS,v0+dv-EPS) self.pt4=f(u0+EPS,v0+dv-EPS) center = 0.25*(self.pt1 + self.pt2 + self.pt3 + self.pt4) temp = camera.get_viewpt() self.distance = norm(center-temp) def how_far(self): return self.distance def draw(self): normal = (self.pt2 - self.pt1)*(self.pt4 - self.pt1) normal *= 1/norm(normal) dens = 0.75*(1-pow(normal|LIGHT, 2)/(LIGHT|LIGHT)) gray(dens) quad(self.pt1, self.pt2, self.pt3, self.pt4) def sgn(x): if x < 0: return -1 if x > 0: return 1 return 0 def by_distance(arg1, arg2): return sgn(arg2.how_far() - arg1.how_far()) def f1(u, v): return polar(2+r_0*Cos(M_PI*u), M_PI*v) + P(0,0,r_0*Sin(M_PI*u)) # torus def f2(u, v): return P(r_0*Sin(M_PI*u), 2+(2+r_0*Cos(M_PI*u))*Cos(M_PI*v), (2+r_0*Cos(M_PI*u))*Sin(M_PI*v)) bounding_box(P(-3,-3),P(3,3)) unitlength("1in") picture(4,4) begin() viewpoint(VIEWPT) camera.look_at(P(0,1,0)) camera.range(10) crop() fill() mesh = [] for i in range(N1): for j in range(N2): mesh.append(mesh_quad(f1, -1+du*i, -1+dv*j)) mesh.append(mesh_quad(f2, -1+du*i, -1+dv*j)) mesh.sort(by_distance) for M in mesh: M.draw() end()