import bpy import time from math import radians from random import randint from mathutils import Vector, Euler # constants SPHERE_RADIUS = 0.7 NUM_VERTS = 116 MIN_DISTANCE = 0.19 # ttime in seconds beyond which iteration will be cancelled. MAX_TIME = 20 # consumable Verts = [] # get start time a_time = time.time() def make_vertgon(Verts, object_name): object_mesh = object_name + "_mesh" mesh = bpy.data.meshes.new(object_mesh) mesh.from_pydata(Verts, [], []) mesh.update() new_object = bpy.data.objects.new(object_name, mesh) new_object.data = mesh scene = bpy.context.scene scene.objects.link(new_object) return # populate the Verts list with verts randomly positioned around the radius while(len(Verts)<=NUM_VERTS): ax_x = radians(randint(0, 360)) ax_y = radians(randint(0, 360)) ax_z = radians(randint(0, 360)) myEul = Euler((ax_x, ax_y, ax_z), 'XYZ') outVec = Vector((SPHERE_RADIUS, 0.0, 0.0)) outVec.rotate(myEul) # get current time b_time = time.time() # check time difference between current and start. elapsed_time = abs(a_time - b_time) if elapsed_time > MAX_TIME: # breaking instead of running something that might be shy of infinite. break myToken = False for B in Verts: if (outVec-B).length < MIN_DISTANCE: myToken = True break if myToken == True: continue Verts.append(outVec) # draw verts randomly around the radius make_vertgon(Verts, "stix") ''' code notes: this approach makes it obvious that SPHERE_RADIUS, NUM_VERTS and MIN_DISTANCE will reach equilibrium if their ratio approaches the optimal spread that NUM_VERTS has on the surface of the sphere. The random nature of establishing vertex coordinates will often make it unlikely that any precise geometric distribution can be achieved. '''
