import bpy
m = bpy.data.meshes.new('hemisphereMesh')
o = bpy.data.objects.new('hemisphere', m)
bpy.context.scene.objects.link(o)
n = 30
def vert():
yield (0.0, 0.0, 1.0)
for k in range(1, n+1):
theta = float(k)*math.pi/2.0/float(n)
phiDelta = 2.0*math.pi/6.0/float(k)
z = math.cos(theta)
r = math.sin(theta)
for lm in range(6*k):
phi = phiDelta*float(lm)
x = r*math.cos(phi)
y = r*math.sin(phi)
yield(x,y,z)
def edge():
for p in range(n):
if p == 0:
u0 = 0
else:
u0 = 1+3*p*(p-1)
l0 = 1+3*p*(p+1)
for q in range(6):
u = u0+p*q
l = l0+(p+1)*q
yield(u,l)
yield(l,u)
for r in range(p):
uu = u+r
ll = l+r
yield(uu,ll+1)
if r==p-1 and q==5:
yield(ll+1, u0)
else:
yield(ll+1,uu+1)
yield(u,l)
def face():
for q in range(1,6):
yield(q,0,q+1)
yield(6,0,1)
for p in range(1,n):
u0 = 1+3*p*(p-1)
l0 = 1+3*p*(p+1)
for q in range(6):
u = u0+p*q
l = l0+(p+1)*q
yield(u,l)
yield(l,u)
uu = u0
ll = l0
for r in range(p):
uu = u+r
ll = l+r
if r==p-1 and q==5:
uuu = u0
lll = l0
else:
uuu = uu+1
lll =ll+2
yield(ll,uu,ll+1)
yield(uu,ll+1,uuu)
if q<5:
yield(ll+1,uu+1,ll+2)
pass
else:
yield(ll+1,u0,l0)
pass
m.from_pydata(list(vert()), [], list(face()))
m.update()