Advertisement
Guest User

IcoSphereCreator.py

a guest
Oct 25th, 2015
441
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.63 KB | None | 0 0
  1. #!/usr/bin/python3
  2. import math
  3.  
  4. class IcoSphereCreator:
  5.     class MeshGeometry3D:
  6.         positions = []
  7.         TriangleIndices = []
  8.  
  9.     class TriangleIndices:
  10.         def __init__(self, v1, v2, v3):
  11.             self.v1 = v1
  12.             self.v2 = v2
  13.             self.v3 = v3
  14.            
  15.     class Point3D:
  16.         def __init__(self, X, Y, Z):
  17.             self.X = X
  18.             self.Y = Y
  19.             self.Z = Z
  20.            
  21.     geometry = MeshGeometry3D()
  22.     index = -1
  23.     middlePointIndexCache = {}
  24.  
  25.     def addVertex(self, p):
  26.             length = math.sqrt(p.X * p.X + p.Y * p.Y + p.Z * p.Z)
  27.             self.geometry.positions.append(self.Point3D(p.X/length, p.Y/length, p.Z/length))
  28.             self.index += 1
  29.             return self.index
  30.            
  31.     def getMiddlePoint(self, p1, p2):
  32.         firstIsSmaller = p1 < p2
  33.         smallerIndex = p1 if firstIsSmaller else p2
  34.         greaterIndex = p2 if firstIsSmaller else p1
  35.         key = (smallerIndex << 32) + greaterIndex;
  36.        
  37.         if key in self.middlePointIndexCache:
  38.             return self.middlePointIndexCache[key]
  39.            
  40.         point1 = self.geometry.positions[p1]
  41.         point2 = self.geometry.positions[p2]
  42.         middle = self.Point3D(
  43.             (point1.X + point2.X) / 2.0,
  44.             (point1.Y + point2.Y) / 2.0,
  45.             (point1.Z + point2.Z) / 2.0
  46.             )
  47.                    
  48.         i = self.addVertex(middle)
  49.         self.middlePointIndexCache[key] = i
  50.         return i
  51.        
  52.     def create(self, recursionLevel):
  53.         # create 12 vertices of a icosahedron
  54.         t = (1.0 + math.sqrt(5.0)) / 2.0
  55.        
  56.         self.addVertex(self.Point3D(-1,  t,  0))
  57.         self.addVertex(self.Point3D( 1,  t,  0))
  58.         self.addVertex(self.Point3D(-1, -t,  0))
  59.         self.addVertex(self.Point3D( 1, -t,  0))
  60.        
  61.         self.addVertex(self.Point3D( 0, -1,  t))
  62.         self.addVertex(self.Point3D( 0,  1,  t))
  63.         self.addVertex(self.Point3D( 0, -1, -t))
  64.         self.addVertex(self.Point3D( 0,  1, -t))
  65.        
  66.         self.addVertex(self.Point3D( t,  0, -1))
  67.         self.addVertex(self.Point3D( t,  0,  1))
  68.         self.addVertex(self.Point3D(-t,  0, -1))
  69.         self.addVertex(self.Point3D(-t,  0,  1))
  70.        
  71.         # create 20 triangles of the icosahedron
  72.         faces = []
  73.        
  74.         # 5 faces around point 0
  75.         faces.append(self.TriangleIndices(0, 11, 5))
  76.         faces.append(self.TriangleIndices(0, 5, 1))
  77.         faces.append(self.TriangleIndices(0, 1, 7))
  78.         faces.append(self.TriangleIndices(0, 7, 10))
  79.         faces.append(self.TriangleIndices(0, 10, 11))
  80.  
  81.         # 5 adjacent faces
  82.         faces.append(self.TriangleIndices(1, 5, 9))
  83.         faces.append(self.TriangleIndices(5, 11, 4))
  84.         faces.append(self.TriangleIndices(11, 10, 2))
  85.         faces.append(self.TriangleIndices(10, 7, 6))
  86.         faces.append(self.TriangleIndices(7, 1, 8))
  87.  
  88.         # 5 faces around point 3
  89.         faces.append(self.TriangleIndices(3, 9, 4))
  90.         faces.append(self.TriangleIndices(3, 4, 2))
  91.         faces.append(self.TriangleIndices(3, 2, 6))
  92.         faces.append(self.TriangleIndices(3, 6, 8))
  93.         faces.append(self.TriangleIndices(3, 8, 9))
  94.  
  95.         # 5 adjacent faces
  96.         faces.append(self.TriangleIndices(4, 9, 5))
  97.         faces.append(self.TriangleIndices(2, 4, 11))
  98.         faces.append(self.TriangleIndices(6, 2, 10))
  99.         faces.append(self.TriangleIndices(8, 6, 7))
  100.         faces.append(self.TriangleIndices(9, 8, 1))
  101.        
  102.         for i in range(0, recursionLevel):
  103.             faces2 = []
  104.             for tri in faces:
  105.                  # replace triangle by 4 triangles
  106.                  a = self.getMiddlePoint(tri.v1, tri.v2)
  107.                  b = self.getMiddlePoint(tri.v2, tri.v3)
  108.                  c = self.getMiddlePoint(tri.v3, tri.v1)
  109.                  
  110.                  faces2.append(self.TriangleIndices(tri.v1, a, c))
  111.                  faces2.append(self.TriangleIndices(tri.v2, b, a))
  112.                  faces2.append(self.TriangleIndices(tri.v3, c, b))
  113.                  faces2.append(self.TriangleIndices(a, b, c))
  114.  
  115.             faces = faces2
  116.            
  117.         for tri in faces:
  118.             self.geometry.TriangleIndices.append(tri.v1)
  119.             self.geometry.TriangleIndices.append(tri.v2)
  120.             self.geometry.TriangleIndices.append(tri.v3)
  121.  
  122.         return self.geometry
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement