def gen_traffic_list(time_serial_num,traffic_num,traffic_data_mean_size): traffic_list = [0]*time_serial_num #生成时序包络 mu = int(random.uniform(0, time_serial_num)) sigma = random.uniform(1,6) #每一时序生成随机的业务数 i = 0 while (i<time_serial_num): tmp_time_serial = int(random.gauss(mu, sigma)) if tmp_time_serial < time_serial_num and tmp_time_serial >=0: traffic_list[tmp_time_serial] = traffic_list[tmp_time_serial]+1 i+=1 plotLine(range(0,len(traffic_list)),traffic_list) #每个业务生成随机的数据块 mu = traffic_data_mean_size sigma = traffic_data_mean_size*0.1 floor_data_size = mu - 3*sigma ceil_data_size = mu + 3*sigma traffic_entity_list=[[]]*time_serial_num for index,k in enumberate(traffic_list): i=0 while (i<k): data_size = int(random.gauss(mu, sigma)) if data_size>floor_data_size and data_size < ceil_data_size : traffic_entity_list[index] i=i+1 return traffic_entity_list
def jolt(inAtom,magnitude): """Moves all the atoms in inAtom by a Gaussian distribution with mean of 0 and StdDev of magnitude. A small magnitude is a small kick, a larger magnitude is a big kick.""" posList = inAtom.get_positions() for x in range(len(posList)): posList[x][0] = posList[x][0] + random.gauss(0,magnitude) posList[x][1] = posList[x][1] + random.gauss(0,magnitude) posList[x][2] = posList[x][2] + random.gauss(0,magnitude) inAtom.set_positions(posList) return inAtom
def ball_move(inAtom,atomIndex): """takes an atom defined by atomIndex inside of inAtom and moves it somewhere within the core of the atom randomly. Atoms will almost always end up inside the sphere which contains 85% of the atoms, centered at the center of mass.""" # we're going to be changing the position of atomIndex inside inAtom # we'll take atom of index atomIndex and throw it somewhere inside the core # make sure that you remove any crazy outliers before you do this # or else it'll just make a bunch more outliers, which is a poor idea try: #get all the distances from the center of mass inCOM = inAtom.get_center_of_mass() inDistances = distanceCenter(inAtom) #figure out the distance from the core to the 85th percentile #we'll consider "the core" to be the sphere which contains 85% of the atoms eightyFifthRadius = stats.scoreatpercentile(inDistances,85) #pick a new distance from center somewhere inside that 85th percentile limit randomNewRadius = random.gauss(eightyFifthRadius/2, eightyFifthRadius/3 ) xFromCenter = random.uniform(0,randomNewRadius) randomNewRadius = ((randomNewRadius**2) - (xFromCenter**2))**0.5 yFromCenter = random.uniform(0,randomNewRadius) zFromCenter = ((randomNewRadius**2) - (yFromCenter**2))**0.5 newXPosition = inCOM[0] + random.choice([-1,1])*xFromCenter newYPosition = inCOM[1] + random.choice([-1,1])*yFromCenter newZPosition = inCOM[2] + random.choice([-1,1])*zFromCenter positionArray = inAtom.get_positions() positionArray[atomIndex] = (newXPosition,newYPosition,newZPosition) inAtom.set_positions(positionArray) return inAtom except IndexError: print "The index of the atom you wanted to move is too high or too low." print "Please check your function call of ball_move(a,b)" print "-Jeff"
def shell_move(inAtom,atomIndex): # we're going to be changing the position of atomIndex inside inAtom # make sure that you remove any crazy outliers before you do this # or else it'll just make a bunch more outliers, which is a poor idea # make sure atomIndex comes from range(len(inAtom.get_positions())) so we don't get out of bounds try: inCOM = inAtom.get_center_of_mass() inDistances = distanceCenter(inAtom) ninetyNinthRadius = stats.scoreatpercentile(inDistances,99) ninetyFifthRadius = stats.scoreatpercentile(inDistances,95) outerFourRadius = ninetyNinthRadius - ninetyFifthRadius randomNewRadius = random.gauss( (ninetyNinthRadius+ninetyFifthRadius)/2 , (ninetyNinthRadius - ninetyFifthRadius)/2 ) xFromCenter = random.uniform(0,randomNewRadius) randomNewRadius = ((randomNewRadius**2) - (xFromCenter**2))**0.5 yFromCenter = random.uniform(0,randomNewRadius) zFromCenter = ((randomNewRadius**2) - (yFromCenter**2))**0.5 newXPosition = inCOM[0] + random.choice([-1,1])*xFromCenter newYPosition = inCOM[1] + random.choice([-1,1])*yFromCenter newZPosition = inCOM[2] + random.choice([-1,1])*zFromCenter positionArray = inAtom.get_positions() positionArray[atomIndex] = (newXPosition,newYPosition,newZPosition) inAtom.set_positions(positionArray) return inAtom except IndexError: print "The index of the atom you wanted to move is too high or too low." print "Please check your function call of shell_move(a,b)" print "-Jeff"
def skewedGauss(mu, sigma, bounds, upperSkewed=True): raw = gauss(mu, sigma) # Quicker to check an extra condition than do unnecessary math. . . . if raw < mu and not upperSkewed: out = ((mu - bounds[0]) / (3 * sigma)) * raw + ((mu * (bounds[0] - (mu - 3 * sigma))) / (3 * sigma)) elif raw > mu and upperSkewed: out = ((mu - bounds[1]) / (3 * -sigma)) * raw + ((mu * (bounds[1] - (mu + 3 * sigma))) / (3 * -sigma)) else: out = raw return out
def random_gaussian_cylinder(sd_radius,sd_height,convert=False): ''' Generates a gaussian random offset, a random radius from the z-axis and a random distance along the z-axis Can optionally convert from uniform values such that the half-probability distance for the uniform cylinder corresponds to the half-probability distance for the gaussian distribution ''' if convert == True: # A sort of conversion from radius and half-height to standard deviation sd_radius = sd_radius/2.388 sd_height = sd_height/2.388 r = random.gauss(0,sd_radius) theta = random.uniform(0,2*pi) z = random.gauss(0,sd_height) x = r * cos(theta) y = r * sin(theta) return [x,y,z]
def MakeRanData(): ten = [] thou = [] tenthou = [] hundredthou = [] mil = [] for i in range(0, 10): ten.append(random.gauss(100, 50)) for i in range(0, 1000): thou.append(random.gauss(100, 50)) for i in range(0, 10000): tenthou.append(random.gauss(100, 50)) for i in range(0, 100000): hundredthou.append(random.gauss(100, 50)) for i in range(0, 1000000): mil.append(random.gauss(100, 50)) return ten, thou, tenthou, hundredthou, mil
def debug(): f = 40 t = AnnoyIndex(f) # Length of item vector that will be indexed for i in xrange(1000): v = [random.gauss(0, 1) for z in xrange(f)] t.add_item(i, v) t.build(10) # 10 trees t.save('test.ann') # ... u = AnnoyIndex(f) u.load('test.ann') # super fast, will just mmap the file print(u.get_nns_by_item(0, 1000)) # will find the 1000 nearest neighbors
def sphere(origin, p0, p1, radius=100 * units.cm, eperstep=5000, step_size=1 * units.mm): ''' Generate artificial spherical shell patterns of depos. The origin, p0 and p1 are 3-arrays. ''' bb = list(zip(p0, p1)) pmid = 0.5 * (p0 + p1) npoints = int(0.3 * (radius / step_size)**2) #print(f'generating {npoints} points on sphere of radius {radius}mm') pts = list() for ipt in range(npoints): pt = numpy.array([uniform(a, b) for a, b in bb]) g3 = numpy.array([gauss(0, 1) for i in range(3)]) mag = math.sqrt(numpy.dot(g3, g3)) vdir = g3 / mag pts.append(origin + vdir * radius) zeros = numpy.zeros(npoints) charges = numpy.zeros(npoints) - eperstep points = numpy.vstack(pts) data = numpy.array(numpy.vstack([zeros, charges, points.T, zeros, zeros]).T, dtype="float32") info = numpy.array(numpy.vstack( [numpy.arange(0, npoints), zeros, zeros, zeros]).T, dtype="int32") # must send out in shape (npts, 7) and (npts, 4) assert (data.shape[1] == 7) assert (info.shape[1] == 4) assert (info[0][3] == 0) return dict(depo_data_0=data, depo_info_0=info)
def getRandomFactor(self): """return random factor with normal distribution""" if not TESTMODE: return gauss(self.mean, self.stdev) else: return self.mean
def generateObject(context, muX, sigmaX, scaleX, upperSkewX, muY, sigmaY, scaleY, upperSkewY, muZ, sigmaZ, scaleZ, upperSkewZ, base, shift, scaleDisplace, scale_fac): x = [] y = [] z = [] shape = randint(0, 11) # Cube # Use parameters to re-scale cube: # Reversed if/for nesting. Should be a little faster. if shape == 0: for j in range(8): if sigmaX == 0: x.append(scaleX[0] / 2) else: x.append(skewedGauss(muX, sigmaX, scaleX, upperSkewX) / 2) if sigmaY == 0: y.append(scaleY[0] / 2) else: y.append(skewedGauss(muY, sigmaY, scaleY, upperSkewY) / 2) if sigmaZ == 0: z.append(scaleZ[0] / 2) else: z.append(skewedGauss(muZ, sigmaZ, scaleZ, upperSkewZ) / 2) elif shape == 1: for j in range(8): if j in [0, 1, 3, 4]: if sigmaX == 0: x.append(scaleX[0] / 2) else: x.append(skewedGauss(muX, sigmaX, scaleX, upperSkewX) / 2) if sigmaY == 0: y.append(scaleY[0] / 2) else: y.append(skewedGauss(muY, sigmaY, scaleY, upperSkewY) / 2) if sigmaZ == 0: z.append(scaleZ[0] / 2) else: z.append(skewedGauss(muZ, sigmaZ, scaleZ, upperSkewZ) / 2) elif j in [2, 5]: if sigmaX == 0: x.append(0) else: x.append(skewedGauss(muX, sigmaX, scaleX, upperSkewX) / 4) if sigmaY == 0: y.append(scaleY[0] / 2) else: y.append(skewedGauss(muY, sigmaY, scaleY, upperSkewY) / 2) if sigmaZ == 0: z.append(scaleZ[0] / 2) else: z.append(skewedGauss(muZ, sigmaZ, scaleZ, upperSkewZ) / 2) elif j in [6, 7]: if sigmaX == 0: x.append(0) else: x.append(skewedGauss(0, sigmaX, scaleX, upperSkewX) / 4) if sigmaY == 0: y.append(0) else: y.append(skewedGauss(0, sigmaY, scaleY, upperSkewY) / 4) if sigmaZ == 0: z.append(scaleZ[0] / 2) else: z.append(skewedGauss(muZ, sigmaZ, scaleZ, upperSkewZ) / 2) elif shape == 2: for j in range(8): if j in [0, 2, 5, 7]: if sigmaX == 0: x.append(scaleX[0] / 4) else: x.append(skewedGauss(muX, sigmaX, scaleX, upperSkewX) / 4) if sigmaY == 0: y.append(0) else: y.append(skewedGauss(0, sigmaY, scaleY, upperSkewY) / 4) if sigmaZ == 0: z.append(scaleZ[0] / 2) else: z.append(skewedGauss(muZ, sigmaZ, scaleZ, upperSkewZ) / 4) elif j in [1, 3, 4, 6]: if sigmaX == 0: x.append(scaleX[0] / 2) else: x.append(skewedGauss(muX, sigmaX, scaleX, upperSkewX) / 2) if sigmaY == 0: y.append(scaleY[0] / 2) else: y.append(skewedGauss(muY, sigmaY, scaleY, upperSkewY) / 2) if sigmaZ == 0: z.append(scaleZ[0] / 2) else: z.append(skewedGauss(muZ, sigmaZ, scaleZ, upperSkewZ) / 2) elif shape == 3: for j in range(8): if j > 0: if sigmaX == 0: x.append(scaleX[0] / 2) else: x.append(skewedGauss(muX, sigmaX, scaleX, upperSkewX) / 2) if sigmaY == 0: y.append(scaleY[0] / 2) else: y.append(skewedGauss(muY, sigmaY, scaleY, upperSkewY) / 2) if sigmaZ == 0: z.append(scaleZ[0] / 2) else: z.append(skewedGauss(muZ, sigmaZ, scaleZ, upperSkewZ) / 2) else: if sigmaX == 0: x.append(0) else: x.append(skewedGauss(0, sigmaX, scaleX, upperSkewX) / 8) if sigmaY == 0: y.append(0) else: y.append(skewedGauss(0, sigmaY, scaleY, upperSkewY) / 8) if sigmaZ == 0: z.append(0) else: z.append(skewedGauss(0, sigmaZ, scaleZ, upperSkewZ) / 8) elif shape == 4: for j in range(10): if j in [0, 9]: if sigmaX == 0: x.append(0) else: x.append(skewedGauss(0, sigmaX, scaleX, upperSkewX) / 2) if sigmaY == 0: y.append(0) else: y.append(skewedGauss(0, sigmaY, scaleY, upperSkewY) / 2) if sigmaZ == 0: z.append(scaleZ[0] / 2) else: z.append(skewedGauss(muZ, sigmaZ, scaleZ, upperSkewZ) / 2) elif j in [1, 2, 3, 4]: if sigmaX == 0: x.append(scaleX[0] / 2) else: x.append(skewedGauss(muX, sigmaX, scaleX, upperSkewX) / 2) if sigmaY == 0: y.append(scaleY[0] / 2) else: y.append(skewedGauss(muY, sigmaY, scaleY, upperSkewY) / 2) if sigmaZ == 0: z.append(scaleZ[0] / 2) else: z.append(skewedGauss(muZ, sigmaZ, scaleZ, upperSkewZ) / 2) elif j in [5, 7]: if sigmaX == 0: x.append(0) else: x.append(skewedGauss(0, sigmaX, scaleX, upperSkewX) / 3) if sigmaY == 0: y.append(scaleY[0] / 3) else: y.append(skewedGauss(muY, sigmaY, scaleY, upperSkewY) / 3) if sigmaZ == 0: z.append(0) else: z.append(skewedGauss(0, sigmaZ, scaleZ, upperSkewZ) / 6) elif j in [6, 8]: if sigmaX == 0: x.append(scaleX[0] / 3) else: x.append(skewedGauss(muX, sigmaX, scaleX, upperSkewX) / 3) if sigmaY == 0: y.append(0) else: y.append(skewedGauss(0, sigmaY, scaleY, upperSkewY) / 3) if sigmaZ == 0: z.append(0) else: z.append(skewedGauss(0, sigmaZ, scaleZ, upperSkewZ) / 6) elif shape == 5: for j in range(10): if j == 0: if sigmaX == 0: x.append(0) else: x.append(skewedGauss(0, sigmaX, scaleX, upperSkewX) / 8) if sigmaY == 0: y.append(0) else: y.append(skewedGauss(0, sigmaY, scaleY, upperSkewY) / 8) if sigmaZ == 0: z.append(scaleZ[0] / 2) else: z.append(skewedGauss(muZ, sigmaZ, scaleZ, upperSkewZ) / 2) elif j in [1, 2]: if sigmaX == 0: x.append(scaleZ[0] * .125) else: x.append(skewedGauss(muX, sigmaX, scaleX, upperSkewX) * 0.125) if sigmaY == 0: y.append(scaleZ[0] * 0.2165) else: y.append(skewedGauss(muY, sigmaY, scaleY, upperSkewY) * 0.2165) if sigmaZ == 0: z.append(0) else: z.append(skewedGauss(0, sigmaZ, scaleZ, upperSkewZ) / 4) elif j == 3: if sigmaX == 0: x.append(scaleX[0] / 4) else: x.append(skewedGauss(muX, sigmaX, scaleX, upperSkewX) / 4) if sigmaY == 0: y.append(0) else: y.append(skewedGauss(0, sigmaY, scaleY, upperSkewY) / 4) if sigmaZ == 0: z.append(0) else: z.append(skewedGauss(0, sigmaZ, scaleZ, upperSkewZ) / 4) elif j in [4, 6]: if sigmaX == 0: x.append(scaleX[0] * 0.25) else: x.append(skewedGauss(muX, sigmaX, scaleX, upperSkewX) * 0.25) if sigmaY == 0: y.append(scaleY[0] * 0.433) else: y.append(skewedGauss(muY, sigmaY, scaleY, upperSkewY) * 0.433) if sigmaZ == 0: z.append(scaleZ[0] / 2) else: z.append(skewedGauss(muZ, sigmaZ, scaleZ, upperSkewZ) / 2) elif j == 5: if sigmaX == 0: x.append(scaleX[0] / 4) else: x.append(skewedGauss(muX, sigmaX, scaleX, upperSkewX) / 4) if sigmaY == 0: y.append(0) else: y.append(skewedGauss(0, sigmaY, scaleY, upperSkewY) / 2) if sigmaZ == 0: z.append(scaleZ[0] / 2) else: z.append(skewedGauss(muZ, sigmaZ, scaleZ, upperSkewZ) / 2) elif j in [7, 9]: if sigmaX == 0: x.append(scaleX[0] * 0.10825) else: x.append(skewedGauss(muX, sigmaX, scaleX, upperSkewX) * 0.10825) if sigmaY == 0: y.append(scaleY[0] * 0.2165) else: y.append(skewedGauss(muY, sigmaY, scaleY, upperSkewY) * 0.2165) if sigmaZ == 0: z.append(scaleZ[0] / 2) else: z.append(skewedGauss(muZ, sigmaZ, scaleZ, upperSkewZ) / 2) elif j == 8: if sigmaX == 0: x.append(scaleX[0] / 2) else: x.append(skewedGauss(muX, sigmaX, scaleX, upperSkewX) / 2) if sigmaY == 0: y.append(0) else: y.append(skewedGauss(0, sigmaY, scaleY, upperSkewY) / 4) if sigmaZ == 0: z.append(scaleZ[0] / 2) else: z.append(skewedGauss(muZ, sigmaZ, scaleZ, upperSkewZ) / 2) elif shape == 6: for j in range(7): if j > 0: if sigmaX == 0: x.append(scaleX[0] / 2) else: x.append(skewedGauss(muX, sigmaX, scaleX, upperSkewX) / 2) if sigmaY == 0: y.append(scaleY[0] / 2) else: y.append(skewedGauss(muY, sigmaY, scaleY, upperSkewY) / 2) if sigmaZ == 0: z.append(scaleZ[0] / 2) else: z.append(skewedGauss(muZ, sigmaZ, scaleZ, upperSkewZ) / 2) else: if sigmaX == 0: x.append(scaleX[0] / 2) else: x.append(skewedGauss(muX, sigmaX, scaleX, upperSkewX) / 2) if sigmaY == 0: y.append(0) else: y.append(skewedGauss(0, sigmaY, scaleY, upperSkewY) / 2) if sigmaZ == 0: z.append(scaleZ[0] / 2) else: z.append(skewedGauss(muZ, sigmaZ, scaleZ, upperSkewZ) / 2) elif shape == 7: for j in range(10): if j in [1, 3, 4, 5, 8, 9]: if sigmaX == 0: x.append(scaleX[0] / 2) else: x.append(skewedGauss(muX, sigmaX, scaleX, upperSkewX) / 2) if sigmaY == 0: y.append(scaleY[0] / 2) else: y.append(skewedGauss(muY, sigmaY, scaleY, upperSkewY) / 2) if sigmaZ == 0: z.append(scaleZ[0] / 2) else: z.append(skewedGauss(muZ, sigmaZ, scaleZ, upperSkewZ) / 2) else: if sigmaX == 0: x.append(scaleX[0] / 2) else: x.append(skewedGauss(muX, sigmaX, scaleX, upperSkewX) / 2) if sigmaY == 0: y.append(0) else: y.append(skewedGauss(0, sigmaY, scaleY, upperSkewY) / 2) if sigmaZ == 0: z.append(scaleZ[0] / 2) else: z.append(skewedGauss(muZ, sigmaZ, scaleZ, upperSkewZ) / 2) elif shape == 8: for j in range(7): if sigmaX == 0: x.append(scaleX[0] / 2) else: x.append(skewedGauss(muX, sigmaX, scaleX, upperSkewX) / 2) if sigmaY == 0: y.append(scaleY[0] / 2) else: y.append(skewedGauss(muY, sigmaY, scaleY, upperSkewY) / 2) if sigmaZ == 0: z.append(scaleZ[0] / 2) else: z.append(skewedGauss(muZ, sigmaZ, scaleZ, upperSkewZ) / 2) elif shape == 9: for j in range(8): if sigmaX == 0: x.append(scaleX[0] / 2) else: x.append(skewedGauss(muX, sigmaX, scaleX, upperSkewX) / 2) if sigmaY == 0: y.append(scaleY[0] / 2) else: y.append(skewedGauss(muY, sigmaY, scaleY, upperSkewY) / 2) if sigmaZ == 0: z.append(scaleZ[0] / 2) else: z.append(skewedGauss(muZ, sigmaZ, scaleZ, upperSkewZ) / 2) elif shape == 10: for j in range(7): if sigmaX == 0: x.append(scaleX[0] / 2) else: x.append(skewedGauss(muX, sigmaX, scaleX, upperSkewX) / 2) if sigmaY == 0: y.append(scaleY[0] / 2) else: y.append(skewedGauss(muY, sigmaY, scaleY, upperSkewY) / 2) if sigmaZ == 0: z.append(scaleZ[0] / 2) else: z.append(skewedGauss(muZ, sigmaZ, scaleZ, upperSkewZ) / 2) elif shape == 11: for j in range(7): if sigmaX == 0: x.append(scaleX[0] / 2) else: x.append(skewedGauss(muX, sigmaX, scaleX, upperSkewX) / 2) if sigmaY == 0: y.append(scaleY[0] / 2) else: y.append(skewedGauss(muY, sigmaY, scaleY, upperSkewY) / 2) if sigmaZ == 0: z.append(scaleZ[0] / 2) else: z.append(skewedGauss(muZ, sigmaZ, scaleZ, upperSkewZ) / 2) # This is for scaling the displacement textures. # Scale the vertices so that their average is equal to 1 * scale factor. if scaleDisplace: averageX = (sum(x) / len(x)) * scale_fac[0] for i in range(len(x)): x[i] /= averageX averageY = (sum(y) / len(y)) * scale_fac[1] for i in range(len(y)): y[i] /= averageY averageZ = (sum(z) / len(z)) * scale_fac[2] for i in range(len(z)): z[i] /= averageZ # Build vertex and face arrays: if shape == 1: verts = [(-x[0], -y[0], -z[0]), (x[1], -y[1], -z[1]), (x[2], -y[2], z[2]), (-x[3], y[3], -z[3]), (x[4], y[4], -z[4]), (x[5], y[5], z[5]), (x[6], y[6], z[6]), (x[7], y[7], -z[7])] faces = [[0, 1, 2], [0, 1, 7], [3, 0, 7], [3, 4, 7], [1, 4, 7], [3, 4, 5], [1, 2, 6], [1, 4, 6], [4, 5, 6], [0, 2, 6], [0, 3, 6], [3, 5, 6]] elif shape == 2: verts = [(-x[0], y[0], -z[0]), (x[1], -y[1], -z[1]), (x[2], y[2], -z[2]), (-x[3], y[3], -z[3]), (-x[4], -y[4], z[4]), (x[5], y[5], z[5]), (x[6], y[6], z[6]), (-x[7], y[7], z[7])] faces = [[0, 1, 2], [0, 2, 3], [0, 3, 7], [0, 7, 4], [1, 4, 5], [0, 1, 4], [5, 1, 2], [5, 2, 6], [3, 2, 6], [3, 6, 7], [5, 4, 7], [5, 6, 7]] elif shape == 3: verts = [(x[0], y[0], z[0]), (x[1], -y[1], -z[1]), (x[2], y[2], -z[2]), (-x[3], y[3], -z[3]), (x[4], -y[4], z[4]), (x[5], y[5], z[5]), (-x[6], y[6], z[6]), (-x[7], -y[7], z[7])] faces = [[0, 1, 2], [0, 2, 3], [0, 3, 6], [0, 6, 7], [0, 7, 4], [0, 4, 1], [5, 4, 1, 2], [5, 6, 3, 2], [5, 4, 7, 6]] elif shape == 4: verts = [(x[0], y[0], z[0]), (x[1], -y[1], -z[1]), (x[2], y[2], -z[2]), (-x[3], y[3], -z[3]), (-x[4], -y[4], -z[4]), (x[5], -y[5], -z[5]), (x[6], y[6], -z[6]), (x[7], y[7], -z[7]), (-x[8], y[8], -z[8]), (x[9], y[9], -z[9])] faces = [[0, 1, 6], [0, 6, 2], [0, 2, 7], [0, 7, 3], [0, 3, 8], [0, 8, 4], [0, 4, 5], [0, 5, 1], [1, 9, 2], [2, 9, 3], [3, 9, 4], [4, 9, 1], [1, 6, 2], [2, 7, 3], [3, 8, 4], [4, 5, 1]] elif shape == 5: verts = [(x[0], y[0], z[0]), (x[1], -y[1], z[1]), (x[2], y[2], z[2]), (-x[3], y[3], z[3]), (x[4], -y[4], -z[4]), (x[5], y[5], -z[5]), (x[6], y[6], -z[6]), (-x[7], y[7], -z[7]), (-x[8], y[8], -z[8]), (-x[9], -y[9], -z[9])] faces = [[0, 1, 2], [0, 2, 3], [0, 3, 1], [1, 4, 5], [1, 5, 2], [2, 5, 6], [2, 6, 7], [2, 7, 3], [3, 7, 8], [3, 8, 9], [3, 9, 1], [1, 9, 4], [4, 5, 9], [5, 6, 7], [7, 8, 9], [9, 5, 7]] elif shape == 6: verts = [(x[0], y[0], z[0]), (x[1], -y[1], -z[1]), (x[2], y[2], -z[2]), (-x[3], y[3], -z[3]), (-x[4], y[4], z[4]), (-x[5], -y[5], z[5]), (-x[6], -y[6], -z[6])] faces = [[0, 1, 2], [0, 2, 3, 4], [0, 1, 6, 5], [0, 4, 5], [1, 2, 3, 6], [3, 4, 5, 6]] elif shape == 7: verts = [(x[0], y[0], z[0]), (x[1], -y[1], -z[1]), (x[2], y[2], -z[2]), (x[3], y[3], -z[3]), (-x[4], y[4], -z[4]), (-x[5], y[5], z[5]), (-x[6], y[6], z[6]), (-x[7], y[7], -z[7]), (-x[8], -y[8], -z[8]), (-x[9], -y[9], z[9])] faces = [[0, 1, 2], [0, 2, 3], [0, 5, 6], [0, 6, 9], [0, 1, 8, 9], [0, 3, 4, 5], [1, 2, 7, 8], [2, 3, 4, 7], [4, 5, 6, 7], [6, 7, 8, 9]] elif shape == 8: verts = [(x[0], y[0], z[0]), (x[1], -y[1], -z[1]), (x[2], y[2], -z[2]), (-x[3], y[3], -z[3]), (-x[4], -y[4], -z[4]), (-x[5], -y[5], z[5]), (-x[6], y[6], z[6])] faces = [[0, 2, 1], [0, 1, 4], [0, 4, 5], [0, 5, 6], [0, 6, 3, 2], [2, 1, 4, 3], [3, 6, 5, 4]] elif shape == 9: verts = [(-x[0], -y[0], -z[0]), (-x[1], y[1], -z[1]), (-x[2], y[2], z[2]), (-x[3], -y[3], z[3]), (x[4], -y[4], -z[4]), (x[5], y[5], -z[5]), (x[6], y[6], z[6]), (x[7], -y[7], z[7])] faces = [[0, 1, 6, 2], [1, 5, 7, 6], [5, 4, 3, 7], [4, 0, 2, 3], [0, 1, 5, 4], [3, 2, 6, 7]] elif shape == 10: verts = [(-x[0], -y[0], -z[0]), (-x[1], y[1], -z[1]), (-x[2], y[2], z[2]), (x[3], -y[3], z[3]), (x[4], y[4], z[4]), (x[5], y[5], -z[5]), (x[6], -y[6], -z[6])] faces = [[0, 2, 3], [0, 3, 6], [0, 1, 5, 6], [2, 3, 4], [0, 1, 2], [1, 2, 4, 5], [3, 4, 5, 6]] elif shape == 11: verts = [(-x[0], -y[0], -z[0]), (-x[1], y[1], -z[1]), (-x[2], y[2], z[2]), (x[3], -y[3], z[3]), (x[4], y[4], z[4]), (x[5], y[5], -z[5]), (x[6], -y[6], -z[6])] faces = [[0, 2, 3], [0, 3, 6], [0, 1, 5, 6], [2, 3, 4], [5, 6, 3], [1, 5, 3, 4], [0, 1, 4, 2]] else: verts = [(-x[0], -y[0], -z[0]), (-x[1], y[1], -z[1]), (-x[2], -y[2], z[2]), (-x[3], y[3], z[3]), (x[4], -y[4], -z[4]), (x[5], y[5], -z[5]), (x[6], -y[6], z[6]), (x[7], y[7], z[7])] faces = [[0, 1, 3, 2], [0, 1, 5, 4], [0, 4, 6, 2], [7, 5, 4, 6], [7, 3, 2, 6], [7, 5, 1, 3]] # name = "Rock." + str(base + shift).zfill(3) name = "rock" # Make object: obj = createMeshObject(context, verts, [], faces, name) if scaleDisplace: # bpy.data.objects[name].scale = Vector((averageX, averageY, averageZ)) obj.scale = Vector((averageX, averageY, averageZ)) # For a slight speed bump / Readability: # mesh = bpy.data.meshes[name] mesh = obj.data # Apply creasing: if shape == 0: for i in range(12): # todo: "0.375 / 3"? WTF? That = 0.125. . . . # *** Completed 7/15/2011: Changed second one *** mesh.edges[i].crease = gauss(0.125, 0.125) elif shape == 1: for i in [0, 2]: mesh.edges[i].crease = gauss(0.5, 0.125) for i in [6, 9, 11, 12]: mesh.edges[i].crease = gauss(0.25, 0.05) for i in [5, 7, 15, 16]: mesh.edges[i].crease = gauss(0.125, 0.025) elif shape == 2: for i in range(18): mesh.edges[i].crease = gauss(0.125, 0.025) elif shape == 3: for i in [0, 1, 6, 10, 13]: mesh.edges[i].crease = gauss(0.25, 0.05) mesh.edges[8].crease = gauss(0.5, 0.125) elif shape == 4: for i in [5, 6, 7, 10, 14, 16, 19, 21]: mesh.edges[i].crease = gauss(0.5, 0.125) elif shape == 7: for i in range(18): if i in [0, 1, 2, 3, 6, 7, 8, 9, 13, 16]: mesh.edges[i].crease = gauss(0.5, 0.125) elif i in [11, 17]: mesh.edges[i].crease = gauss(0.25, 0.05) else: mesh.edges[i].crease = gauss(0.125, 0.025) elif shape == 8: for i in range(12): if i in [0, 3, 8, 9, 10]: mesh.edges[i].crease = gauss(0.5, 0.125) elif i == 11: mesh.edges[i].crease = gauss(0.25, 0.05) else: mesh.edges[i].crease = gauss(0.125, 0.025) elif shape == 9: for i in range(12): if i in [0, 3, 4, 11]: mesh.edges[i].crease = gauss(0.5, 0.125) else: mesh.edges[i].crease = gauss(0.25, 0.05) elif shape == 10: for i in range(12): if i in [0, 2, 3, 4, 8, 11]: mesh.edges[i].crease = gauss(0.5, 0.125) elif i in [1, 5, 7]: mesh.edges[i].crease = gauss(0.25, 0.05) else: mesh.edges[i].crease = gauss(0.125, 0.025) elif shape == 11: for i in range(11): if i in [1, 2, 3, 4, 8, 11]: mesh.edges[i].crease = gauss(0.25, 0.05) else: mesh.edges[i].crease = gauss(0.125, 0.025) return obj
def generateRocks(context, scaleX, skewX, scaleY, skewY, scaleZ, skewZ, scale_fac, detail, display_detail, deform, rough, smooth_fac, smooth_it, numOfRocks=1, userSeed=1.0, scaleDisplace=False, randomSeed=True): global LASTROCK sigmaX = 0 sigmaY = 0 sigmaZ = 0 upperSkewX = False upperSkewY = False upperSkewZ = False shift = 0 # vertexScaling = [] # Seed the random Gaussian value generator: if randomSeed: seed(int(time.time())) else: seed(userSeed) # These values need to be really small to look good. # So the user does not have to use such ridiculously small values: deform /= 10 rough /= 100 # Verify that the min really is the min: if scaleX[1] < scaleX[0]: scaleX[0], scaleX[1] = scaleX[1], scaleX[0] if scaleY[1] < scaleY[0]: scaleY[0], scaleY[1] = scaleY[1], scaleY[0] if scaleZ[1] < scaleZ[0]: scaleZ[0], scaleZ[1] = scaleZ[1], scaleZ[0] # todo: edit below to allow for skewing the distribution # *** todo completed 4/22/2011 *** # *** Code now generating "int not scriptable error" in Blender *** # # Calculate mu and sigma for a Gaussian distributed random number # generation: # If the lower and upper bounds are the same, skip the math. # # sigma is the standard deviation of the values. The 95% interval is three # standard deviations, which is what we want most generated values to fall # in. Since it might be skewed we are going to use half the difference # betwee the mean and the furthest bound and scale the other side down # post-number generation. if scaleX[0] != scaleX[1]: skewX = (skewX + 1) / 2 muX = scaleX[0] + ((scaleX[1] - scaleX[0]) * skewX) if skewX < 0.5: sigmaX = (scaleX[1] - muX) / 3 else: sigmaX = (muX - scaleX[0]) / 3 upperSkewX = True else: muX = scaleX[0] if scaleY[0] != scaleY[1]: skewY = (skewY + 1) / 2 muY = scaleY[0] + ((scaleY[1] - scaleY[0]) * skewY) if skewY < 0.5: sigmaY = (scaleY[1] - muY) / 3 else: sigmaY = (muY - scaleY[0]) / 3 upperSkewY = True else: muY = scaleY[0] if scaleZ[0] != scaleZ[1]: skewZ = (skewZ + 1) / 2 muZ = scaleZ[0] + ((scaleZ[1] - scaleZ[0]) * skewZ) if skewZ < 0.5: sigmaZ = (scaleZ[1] - muZ) / 3 else: sigmaZ = (muZ - scaleZ[0]) / 3 upperSkewZ = True else: muZ = scaleZ for i in range(numOfRocks): # todo: enable different random values for each (x,y,z) corrdinate for # each vertex. This will add additional randomness to the shape of the # generated rocks. # *** todo completed 4/19/2011 *** # *** Code is notably slower at high rock counts *** # name = generateObject(context, muX, sigmaX, scaleX, upperSkewX, muY, rock = generateObject( context, muX, sigmaX, scaleX, upperSkewX, muY, sigmaY, scaleY, upperSkewY, muZ, sigmaZ, scaleZ, upperSkewZ, i, LASTROCK, scaleDisplace, scale_fac) # rock = bpy.data.objects[name] # todo Map what the two new textures will be: # This is not working. It works on paper so . . . ??? # *** todo completed on 4/23/2011 *** # *** todo re-added as the first rock is getting # 'Texture.001' twice. *** # *** todo completed on 4/25/2011 *** # *** Script no longer needs to map new texture names 9/6/2011 *** # Create the four new textures: # todo Set displacement texture parameters: # *** todo completed on 5/31/2011 *** # Voronoi has been removed from being an option for the fine detail # texture. texTypes = ['CLOUDS', 'MUSGRAVE', 'DISTORTED_NOISE', 'STUCCI', 'VORONOI'] newTex = [] # The first texture is to give a more ranodm base shape appearance: newTex.append(bpy.data.textures.new( name='rock_displacement', type=texTypes[1])) randomizeTexture(newTex[0], 0) newTex.append(bpy.data.textures.new( name='rock_displacement', type=texTypes[4])) randomizeTexture(newTex[1], 0) if numpy: newTex.append(bpy.data.textures.new( name='rock_displacement', type=texTypes[int(round(weibull(1, 1)[0] / 2.125))])) randomizeTexture(newTex[2], 1) newTex.append(bpy.data.textures.new( name='rock_displacement', type=texTypes[int(round(weibull(1, 1)[0] / 2.125))])) randomizeTexture(newTex[3], 2) else: newTex.append(bpy.data.textures.new( name='rock_displacement', type=texTypes[int(round(weibull(1, 1) / 2.125))])) randomizeTexture(newTex[2], 1) newTex.append(bpy.data.textures.new( name='rock_displacement', type=texTypes[int(round(weibull(1, 1) / 2.125))])) randomizeTexture(newTex[3], 2) # Add modifiers: rock.modifiers.new(name="Subsurf", type='SUBSURF') rock.modifiers.new(name="Subsurf", type='SUBSURF') rock.modifiers.new(name="Displace", type='DISPLACE') rock.modifiers.new(name="Displace", type='DISPLACE') rock.modifiers.new(name="Displace", type='DISPLACE') rock.modifiers.new(name="Displace", type='DISPLACE') # If smoothing is enabled, allow a little randomness into the # smoothing factor. Then add the smoothing modifier. if smooth_fac > 0.0 and smooth_it > 0: rock.modifiers.new(name="Smooth", type='SMOOTH') rock.modifiers[6].factor = gauss(smooth_fac, (smooth_fac ** 0.5) / 12) rock.modifiers[6].iterations = smooth_it # Make a call to random to keep things consistant: else: gauss(0, 1) # Set subsurf modifier parameters: rock.modifiers[0].levels = display_detail rock.modifiers[0].render_levels = detail rock.modifiers[1].levels = display_detail rock.modifiers[1].render_levels = detail # todo Set displacement modifier parameters: # *** todo completed on 4/23/2011 *** # *** toned down the variance on 4/26/2011 *** # *** added third modifier on 4/28/2011 *** # *** texture access changed on 9/6/2011 *** rock.modifiers[2].texture = newTex[0] rock.modifiers[2].strength = gauss(deform / 100, (1 / 300) * deform) rock.modifiers[2].mid_level = 0 rock.modifiers[3].texture = newTex[1] rock.modifiers[3].strength = gauss(deform, (1 / 3) * deform) rock.modifiers[3].mid_level = 0 rock.modifiers[4].texture = newTex[2] rock.modifiers[4].strength = gauss(rough * 2, (1 / 3) * rough) rock.modifiers[5].texture = newTex[3] rock.modifiers[5].strength = gauss(rough, (1 / 3) * rough) # Set mesh to be smooth and fix the normals: utils.smooth(rock.data) # utils.smooth(bpy.data.meshes[name]) bpy.ops.object.editmode_toggle() bpy.ops.mesh.normals_make_consistent() bpy.ops.object.editmode_toggle() # Store the last value of i: shift = i # Add the shift to LASTROCK: LASTROCK += shift + 1 return
def lines(tracks, sets, p0, p1, time, eperstep, step_size, track_speed): ''' Generate sets of tracks. Tracks are uniform in direction and location within box defined by point p0 and p1. Time may be a scalar number, or an array of length 1 or two. If a pair, it defines range for a uniform distribution. Else, it gives a single time for all depos. Each line is made of individual points separated by step_size. eperstep gives number of electrons (postive number) per point. The track_speed determines point separation in time. ''' bb = list(zip(p0, p1)) pmid = 0.5 * (p0 + p1) print(f"depo time: {time}") collect = dict() for iset in range(sets): last_id = 0 datas = list() infos = list() tinfos = numpy.zeros(tracks, dtype=track_info_types) for itrack in range(tracks): pt = numpy.array([uniform(a, b) for a, b in bb]) g3 = numpy.array([gauss(0, 1) for i in range(3)]) mag = math.sqrt(numpy.dot(g3, g3)) vdir = g3 / mag t0 = (p0 - pt) / vdir # may have zeros t1 = (p1 - pt) / vdir # may have zeros a0 = numpy.argmin(numpy.abs(t0)) a1 = numpy.argmin(numpy.abs(t1)) # points on either side bb walls pmin = pt + t0[a0] * vdir pmax = pt + t1[a1] * vdir dp = pmax - pmin pdist = math.sqrt(numpy.dot(dp, dp)) nsteps = int(round(pdist / step_size)) pts = numpy.linspace(pmin, pmax, nsteps + 1, endpoint=True) if isinstance(time, int) or isinstance(time, float): time0 = time elif len(time) == 1: time0 = time[0] else: time0 = uniform(time[0], time[1]) timef = time0 + nsteps * step_size / track_speed times = numpy.linspace(time0, timef, nsteps + 1, endpoint=True) dt = timef - time0 #print(f'nsteps:{nsteps}, pdist:{pdist/units.mm:.1f} mm, dt={dt/units.ns:.1f} ns, {eperstep}') tinfos["pmin"][itrack] = pmin tinfos["pmax"][itrack] = pmax tinfos["tmin"][itrack] = time0 tinfos["tmax"][itrack] = timef tinfos["step"][itrack] = step_size tinfos["eper"][itrack] = eperstep # in terms of charge, negative is expected charges = numpy.zeros(nsteps + 1) + -eperstep zeros = numpy.zeros(nsteps + 1) data = numpy.vstack([times, charges, pts.T, zeros, zeros]) ids = numpy.arange(last_id, last_id + nsteps + 1) last_id = ids[-1] info = numpy.vstack([ids, zeros, zeros, zeros]) datas.append(data) infos.append(info) datas = numpy.vstack([d.T for d in datas]) infos = numpy.vstack([i.T for i in infos]) # datas is now as (n,7) timeorder = numpy.argsort(datas[:, 0]) datas = datas[timeorder] infos = infos[timeorder] collect[f'depo_data_{iset}'] = numpy.array(datas, dtype='float32') collect[f'depo_info_{iset}'] = numpy.array(infos, dtype='int32') collect[f'track_info_{iset}'] = tinfos return collect
import numpy as np import numpy.random as Ran # five senses and mind, total 6 random num generators Ran.seed(20000611) a = Ran.randint(0, 1000) print(a) b = Ran.gauss(0, 1) print(b) c = [1, 2, 3]
import sys import numpy as np from numpy.random import multivariate_normal as gauss # Dump to PDF import matplotlib matplotlib.use('PDF') import pylab as pl # Get K-Means from sklearn.cluster import MiniBatchKMeans, KMeans from sklearn.metrics.pairwise import euclidean_distances if __name__ == "__main__": # Make two random clusters clst1 = np.array([gauss([2,2],[[.5,0],[0,.5]]) for i in range(100)]) clst2 = np.array([gauss([-2,-2],[[.5,0],[0,.5]]) for i in range(100)]) n_clusters = 2 # Merge them together and shuffle data = np.vstack([clst1,clst2]) np.random.shuffle(data) # Use MiniBatch KMeans to Extract mbk = MiniBatchKMeans(init='k-means++', n_clusters=n_clusters, batch_size=45, n_init=10, max_no_improvement=10, verbose=0) mbk.fit(data) # Plot results
def __generate_distortion(self, cloudCenterCoordinates,sigmaSqrt): distortedCenter = [] for i in range(len(cloudCenterCoordinates)): distortedCenter.append(cloudCenterCoordinates[i]+ random.gauss(0, sigmaSqrt)) return distortedCenter
def randomizeTexture(texture, level=1): ''' Set the values for a texture from parameters. param: texture - bpy.data.texture to modify. level - designated tweaked settings to use -> Below 10 is a displacment texture -> Between 10 and 20 is a base material texture ''' noises = ['BLENDER_ORIGINAL', 'ORIGINAL_PERLIN', 'IMPROVED_PERLIN', 'VORONOI_F1', 'VORONOI_F2', 'VORONOI_F3', 'VORONOI_F4', 'VORONOI_F2_F1', 'VORONOI_CRACKLE'] if texture.type == 'CLOUDS': if randint(0, 1) == 0: texture.noise_type = 'SOFT_NOISE' else: texture.noise_type = 'HARD_NOISE' if level != 11: tempInt = randint(0, 6) else: tempInt = randint(0, 8) texture.noise_basis = noises[tempInt] texture.noise_depth = 8 if level == 0: texture.noise_scale = gauss(0.625, 1 / 24) elif level == 2: texture.noise_scale = 0.15 elif level == 11: texture.noise_scale = gauss(0.5, 1 / 24) if texture.noise_basis in ['BLENDER_ORIGINAL', 'ORIGINAL_PERLIN', 'IMPROVED_PERLIN', 'VORONOI_F1']: texture.intensity = gauss(1, 1 / 6) texture.contrast = gauss(4, 1 / 3) elif texture.noise_basis in ['VORONOI_F2', 'VORONOI_F3', 'VORONOI_F4']: texture.intensity = gauss(0.25, 1 / 12) texture.contrast = gauss(2, 1 / 6) elif texture.noise_basis == 'VORONOI_F2_F1': texture.intensity = gauss(0.5, 1 / 6) texture.contrast = gauss(2, 1 / 6) elif texture.noise_basis == 'VORONOI_CRACKLE': texture.intensity = gauss(0.5, 1 / 6) texture.contrast = gauss(2, 1 / 6) elif texture.type == 'MUSGRAVE': # musgraveType = ['MULTIFRACTAL', 'RIDGED_MULTIFRACTAL', # 'HYBRID_MULTIFRACTAL', 'FBM', 'HETERO_TERRAIN'] texture.musgrave_type = 'MULTIFRACTAL' texture.dimension_max = abs(gauss(0, 0.6)) + 0.2 texture.lacunarity = beta(3, 8) * 8.2 + 1.8 if level == 0: texture.noise_scale = gauss(0.625, 1 / 24) texture.noise_intensity = 0.2 texture.octaves = 1.0 elif level == 2: texture.intensity = gauss(1, 1 / 6) texture.contrast = 0.2 texture.noise_scale = 0.15 texture.octaves = 8.0 elif level == 10: texture.intensity = gauss(0.25, 1 / 12) texture.contrast = gauss(1.5, 1 / 6) texture.noise_scale = 0.5 texture.octaves = 8.0 elif level == 12: texture.octaves = uniform(1, 3) elif level > 12: texture.octaves = uniform(2, 8) else: texture.intensity = gauss(1, 1 / 6) texture.contrast = 0.2 texture.octaves = 8.0 elif texture.type == 'DISTORTED_NOISE': tempInt = randint(0, 8) texture.noise_distortion = noises[tempInt] tempInt = randint(0, 8) texture.noise_basis = noises[tempInt] texture.distortion = skewedGauss(2.0, 2.6666, (0.0, 10.0), False) if level == 0: texture.noise_scale = gauss(0.625, 1 / 24) elif level == 2: texture.noise_scale = 0.15 elif level >= 12: texture.noise_scale = gauss(0.2, 1 / 48) elif texture.type == 'STUCCI': stucciTypes = ['PLASTIC', 'WALL_IN', 'WALL_OUT'] if randint(0, 1) == 0: texture.noise_type = 'SOFT_NOISE' else: texture.noise_type = 'HARD_NOISE' tempInt = randint(0, 2) texture.stucci_type = stucciTypes[tempInt] if level == 0: tempInt = randint(0, 6) texture.noise_basis = noises[tempInt] texture.noise_scale = gauss(0.625, 1 / 24) elif level == 2: tempInt = randint(0, 6) texture.noise_basis = noises[tempInt] texture.noise_scale = 0.15 elif level >= 12: tempInt = randint(0, 6) texture.noise_basis = noises[tempInt] texture.noise_scale = gauss(0.2, 1 / 30) else: tempInt = randint(0, 6) texture.noise_basis = noises[tempInt] elif texture.type == 'VORONOI': metrics = ['DISTANCE', 'DISTANCE_SQUARED', 'MANHATTAN', 'CHEBYCHEV', 'MINKOVSKY_HALF', 'MINKOVSKY_FOUR', 'MINKOVSKY'] # Settings for first dispalcement level: if level == 0: tempInt = randint(0, 1) texture.distance_metric = metrics[tempInt] texture.noise_scale = gauss(0.625, 1 / 24) texture.contrast = 0.5 texture.intensity = 0.7 elif level == 2: texture.noise_scale = 0.15 tempInt = randint(0, 6) texture.distance_metric = metrics[tempInt] elif level >= 12: tempInt = randint(0, 1) texture.distance_metric = metrics[tempInt] texture.noise_scale = gauss(0.125, 1 / 48) texture.contrast = 0.5 texture.intensity = 0.7 else: tempInt = randint(0, 6) texture.distance_metric = metrics[tempInt] return
# plt.show() save('GRAVEL_descent.png') np.random.seed(0) #GRAVEL scatter plot #GRAVEL plot fig, ax = set_fig(aspect=True) fig.set_size_inches([10, 5]) ax.plot([6, 0], [0, 3], linestyle='--', color='black', label='measured reaction rates') apx, apy = [], [] spread = [1, 1] for point in range(100): apx.append(gauss(true_spec[0], spread[0])) apy.append(gauss(true_spec[1], spread[1])) ax.scatter(*true_spec, marker='+', label='true spectrum', zorder=100) ax.scatter(apx, apy, marker='x', label="a priori's", zorder=101) plot_n_stdev(1, x_intercept, y_intercept, ax, linestyle='-', color='C3') # ax.scatter(*apriori, label=r'GRAVEL solution when we set $\frac{\chi^2}{DoF}$=1') ax.scatter( *final, label=r'GRAVEL solution when we set $\frac{\chi^2}{DoF}\rightarrow 0$' ) ax.set_title('Initial distribution of a priori') ax.legend() # plt.show() save('GRAVEL_initial.png') fig, ax = set_fig(aspect=True)
def generateInterannualVariability(self): """Generates interannual variabilities in advance for all years of period.""" return { y: gauss(0, self.interannual_variability_std) for y in self.years }
def generateSnowUncertanty(self): """Generates snow uncertainty for all years of period.""" return {d: gauss(0, self.snow_uncertainty_std) for d in self.years}
def generateDustUncertanty(self): """Generates dust uncertainty for all years of period.""" return {d: gauss(0, self.dust_uncertainty_std) for d in self.years}
def NewGenerate(self, lista, creation_method): ret = [] if creation_method['name'] == "uniform": for i in range(len(lista)): ret.append(self.Boundaries[i][0] + (self.Boundaries[i][1] - self.Boundaries[i][0]) * random.random()) elif creation_method['name'] == "logarithmic": for i in range(len(lista)): if self.Boundaries[i][0] < 0: minimo = -5 massimo = math.log(self.Boundaries[i][1]) res = math.exp(minimo + (massimo - minimo) * random.random()) if random.random() > .5: res *= -1 ret.append(res) else: minimo = math.log(self.Boundaries[i][0]) massimo = math.log(self.Boundaries[i][1]) ret.append( math.exp(minimo + (massimo - minimo) * random.random())) elif creation_method['name'] == "normal": for i in range(len(lista)): while (True): if self.Boundaries[i][1] == self.Boundaries[i][0]: ret.append(self.Boundaries[i][1]) break cand_position = random.gauss( (self.Boundaries[i][1] + self.Boundaries[i][0]) / 2, creation_method['sigma']) if (cand_position >= self.Boundaries[i][0] and cand_position <= self.Boundaries[i][1]): ret.append(cand_position) break elif creation_method['name'] == "lognormal": for i in range(len(lista)): minord = math.log(self.Boundaries[i][0]) maxord = math.log(self.Boundaries[i][1]) media = (maxord + minord) / 2. while (True): if self.Boundaries[i][1] == self.Boundaries[i][0]: ret.append(self.Boundaries[i][1]) break v = lognormal(media, creation_method['sigma']) if v >= self.Boundaries[i][0] and v <= self.Boundaries[i][ 1]: break ret.append(v) else: print("Unknown particles initialization mode") exit(20) return ret
def random_feature(feature_stats): proposed = random.gauss(feature_stats['MEAN'], feature_stats['STD']) return proposed
def randomizeTexture(texture, level=1): ''' Set the values for a texture from parameters. param: texture - bpy.data.texture to modify. level - designated tweaked settings to use -> Below 10 is a displacement texture -> Between 10 and 20 is a base material texture ''' noises = [ 'BLENDER_ORIGINAL', 'ORIGINAL_PERLIN', 'IMPROVED_PERLIN', 'VORONOI_F1', 'VORONOI_F2', 'VORONOI_F3', 'VORONOI_F4', 'VORONOI_F2_F1', 'VORONOI_CRACKLE' ] if texture.type == 'CLOUDS': if randint(0, 1) == 0: texture.noise_type = 'SOFT_NOISE' else: texture.noise_type = 'HARD_NOISE' if level != 11: tempInt = randint(0, 6) else: tempInt = randint(0, 8) texture.noise_basis = noises[tempInt] texture.noise_depth = 8 if level == 0: texture.noise_scale = gauss(0.625, 1 / 24) elif level == 2: texture.noise_scale = 0.15 elif level == 11: texture.noise_scale = gauss(0.5, 1 / 24) if texture.noise_basis in [ 'BLENDER_ORIGINAL', 'ORIGINAL_PERLIN', 'IMPROVED_PERLIN', 'VORONOI_F1' ]: texture.intensity = gauss(1, 1 / 6) texture.contrast = gauss(4, 1 / 3) elif texture.noise_basis in [ 'VORONOI_F2', 'VORONOI_F3', 'VORONOI_F4' ]: texture.intensity = gauss(0.25, 1 / 12) texture.contrast = gauss(2, 1 / 6) elif texture.noise_basis == 'VORONOI_F2_F1': texture.intensity = gauss(0.5, 1 / 6) texture.contrast = gauss(2, 1 / 6) elif texture.noise_basis == 'VORONOI_CRACKLE': texture.intensity = gauss(0.5, 1 / 6) texture.contrast = gauss(2, 1 / 6) elif texture.type == 'MUSGRAVE': # musgraveType = ['MULTIFRACTAL', 'RIDGED_MULTIFRACTAL', # 'HYBRID_MULTIFRACTAL', 'FBM', 'HETERO_TERRAIN'] texture.musgrave_type = 'MULTIFRACTAL' texture.dimension_max = abs(gauss(0, 0.6)) + 0.2 texture.lacunarity = beta(3, 8) * 8.2 + 1.8 if level == 0: texture.noise_scale = gauss(0.625, 1 / 24) texture.noise_intensity = 0.2 texture.octaves = 1.0 elif level == 2: texture.intensity = gauss(1, 1 / 6) texture.contrast = 0.2 texture.noise_scale = 0.15 texture.octaves = 8.0 elif level == 10: texture.intensity = gauss(0.25, 1 / 12) texture.contrast = gauss(1.5, 1 / 6) texture.noise_scale = 0.5 texture.octaves = 8.0 elif level == 12: texture.octaves = uniform(1, 3) elif level > 12: texture.octaves = uniform(2, 8) else: texture.intensity = gauss(1, 1 / 6) texture.contrast = 0.2 texture.octaves = 8.0 elif texture.type == 'DISTORTED_NOISE': tempInt = randint(0, 8) texture.noise_distortion = noises[tempInt] tempInt = randint(0, 8) texture.noise_basis = noises[tempInt] texture.distortion = skewedGauss(2.0, 2.6666, (0.0, 10.0), False) if level == 0: texture.noise_scale = gauss(0.625, 1 / 24) elif level == 2: texture.noise_scale = 0.15 elif level >= 12: texture.noise_scale = gauss(0.2, 1 / 48) elif texture.type == 'STUCCI': stucciTypes = ['PLASTIC', 'WALL_IN', 'WALL_OUT'] if randint(0, 1) == 0: texture.noise_type = 'SOFT_NOISE' else: texture.noise_type = 'HARD_NOISE' tempInt = randint(0, 2) texture.stucci_type = stucciTypes[tempInt] if level == 0: tempInt = randint(0, 6) texture.noise_basis = noises[tempInt] texture.noise_scale = gauss(0.625, 1 / 24) elif level == 2: tempInt = randint(0, 6) texture.noise_basis = noises[tempInt] texture.noise_scale = 0.15 elif level >= 12: tempInt = randint(0, 6) texture.noise_basis = noises[tempInt] texture.noise_scale = gauss(0.2, 1 / 30) else: tempInt = randint(0, 6) texture.noise_basis = noises[tempInt] elif texture.type == 'VORONOI': metrics = [ 'DISTANCE', 'DISTANCE_SQUARED', 'MANHATTAN', 'CHEBYCHEV', 'MINKOVSKY_HALF', 'MINKOVSKY_FOUR', 'MINKOVSKY' ] # Settings for first dispalcement level: if level == 0: tempInt = randint(0, 1) texture.distance_metric = metrics[tempInt] texture.noise_scale = gauss(0.625, 1 / 24) texture.contrast = 0.5 texture.intensity = 0.7 elif level == 2: texture.noise_scale = 0.15 tempInt = randint(0, 6) texture.distance_metric = metrics[tempInt] elif level >= 12: tempInt = randint(0, 1) texture.distance_metric = metrics[tempInt] texture.noise_scale = gauss(0.125, 1 / 48) texture.contrast = 0.5 texture.intensity = 0.7 else: tempInt = randint(0, 6) texture.distance_metric = metrics[tempInt] return
def generateRocks(context, scaleX, skewX, scaleY, skewY, scaleZ, skewZ, scale_fac, detail, display_detail, deform, rough, smooth_fac, smooth_it, numOfRocks=1, userSeed=1.0, scaleDisplace=False, randomSeed=True, use_enter_edit_mode=False): global LASTROCK sigmaX = 0 sigmaY = 0 sigmaZ = 0 upperSkewX = False upperSkewY = False upperSkewZ = False shift = 0 # vertexScaling = [] # Seed the random Gaussian value generator: if randomSeed: seed(int(time.time())) else: seed(userSeed) # These values need to be really small to look good. # So the user does not have to use such ridiculously small values: deform /= 10 rough /= 100 # Verify that the min really is the min: if scaleX[1] < scaleX[0]: scaleX[0], scaleX[1] = scaleX[1], scaleX[0] if scaleY[1] < scaleY[0]: scaleY[0], scaleY[1] = scaleY[1], scaleY[0] if scaleZ[1] < scaleZ[0]: scaleZ[0], scaleZ[1] = scaleZ[1], scaleZ[0] # todo: edit below to allow for skewing the distribution # *** todo completed 4/22/2011 *** # *** Code now generating "int not scriptable error" in Blender *** # # Calculate mu and sigma for a Gaussian distributed random number # generation: # If the lower and upper bounds are the same, skip the math. # # sigma is the standard deviation of the values. The 95% interval is three # standard deviations, which is what we want most generated values to fall # in. Since it might be skewed we are going to use half the difference # between the mean and the furthest bound and scale the other side down # post-number generation. if scaleX[0] != scaleX[1]: skewX = (skewX + 1) / 2 muX = scaleX[0] + ((scaleX[1] - scaleX[0]) * skewX) if skewX < 0.5: sigmaX = (scaleX[1] - muX) / 3 else: sigmaX = (muX - scaleX[0]) / 3 upperSkewX = True else: muX = scaleX[0] if scaleY[0] != scaleY[1]: skewY = (skewY + 1) / 2 muY = scaleY[0] + ((scaleY[1] - scaleY[0]) * skewY) if skewY < 0.5: sigmaY = (scaleY[1] - muY) / 3 else: sigmaY = (muY - scaleY[0]) / 3 upperSkewY = True else: muY = scaleY[0] if scaleZ[0] != scaleZ[1]: skewZ = (skewZ + 1) / 2 muZ = scaleZ[0] + ((scaleZ[1] - scaleZ[0]) * skewZ) if skewZ < 0.5: sigmaZ = (scaleZ[1] - muZ) / 3 else: sigmaZ = (muZ - scaleZ[0]) / 3 upperSkewZ = True else: muZ = scaleZ rocks = [] for i in range(numOfRocks): # todo: enable different random values for each (x,y,z) corrdinate for # each vertex. This will add additional randomness to the shape of the # generated rocks. # *** todo completed 4/19/2011 *** # *** Code is notably slower at high rock counts *** # name = generateObject(context, muX, sigmaX, scaleX, upperSkewX, muY, rock = generateObject( context, muX, sigmaX, scaleX, upperSkewX, muY, sigmaY, scaleY, upperSkewY, muZ, sigmaZ, scaleZ, upperSkewZ, i, LASTROCK, scaleDisplace, scale_fac) # rock = bpy.data.objects[name] # todo Map what the two new textures will be: # This is not working. It works on paper so . . . ??? # *** todo completed on 4/23/2011 *** # *** todo re-added as the first rock is getting # 'Texture.001' twice. *** # *** todo completed on 4/25/2011 *** # *** Script no longer needs to map new texture names 9/6/2011 *** # Create the four new textures: # todo Set displacement texture parameters: # *** todo completed on 5/31/2011 *** # Voronoi has been removed from being an option for the fine detail # texture. texTypes = ['CLOUDS', 'MUSGRAVE', 'DISTORTED_NOISE', 'STUCCI', 'VORONOI'] newTex = [] # The first texture is to give a more ranodm base shape appearance: newTex.append(bpy.data.textures.new( name='rock_displacement', type=texTypes[1])) randomizeTexture(newTex[0], 0) newTex.append(bpy.data.textures.new( name='rock_displacement', type=texTypes[4])) randomizeTexture(newTex[1], 0) if numpy: newTex.append(bpy.data.textures.new( name='rock_displacement', type=texTypes[int(round(weibull(1, 1)[0] / 2.125))])) randomizeTexture(newTex[2], 1) newTex.append(bpy.data.textures.new( name='rock_displacement', type=texTypes[int(round(weibull(1, 1)[0] / 2.125))])) randomizeTexture(newTex[3], 2) else: newTex.append(bpy.data.textures.new( name='rock_displacement', type=texTypes[int(round(weibull(1, 1) / 2.125))])) randomizeTexture(newTex[2], 1) newTex.append(bpy.data.textures.new( name='rock_displacement', type=texTypes[int(round(weibull(1, 1) / 2.125))])) randomizeTexture(newTex[3], 2) # Add modifiers: rock.modifiers.new(name="Subsurf", type='SUBSURF') rock.modifiers.new(name="Subsurf", type='SUBSURF') rock.modifiers.new(name="Displace", type='DISPLACE') rock.modifiers.new(name="Displace", type='DISPLACE') rock.modifiers.new(name="Displace", type='DISPLACE') rock.modifiers.new(name="Displace", type='DISPLACE') # If smoothing is enabled, allow a little randomness into the # smoothing factor. Then add the smoothing modifier. if smooth_fac > 0.0 and smooth_it > 0: rock.modifiers.new(name="Smooth", type='SMOOTH') rock.modifiers[6].factor = gauss(smooth_fac, (smooth_fac ** 0.5) / 12) rock.modifiers[6].iterations = smooth_it # Make a call to random to keep things consistent: else: gauss(0, 1) # Set subsurf modifier parameters: rock.modifiers[0].levels = display_detail rock.modifiers[0].render_levels = detail rock.modifiers[1].levels = display_detail rock.modifiers[1].render_levels = detail # todo Set displacement modifier parameters: # *** todo completed on 4/23/2011 *** # *** toned down the variance on 4/26/2011 *** # *** added third modifier on 4/28/2011 *** # *** texture access changed on 9/6/2011 *** rock.modifiers[2].texture = newTex[0] rock.modifiers[2].strength = gauss(deform / 100, (1 / 300) * deform) rock.modifiers[2].mid_level = 0 rock.modifiers[3].texture = newTex[1] rock.modifiers[3].strength = gauss(deform, (1 / 3) * deform) rock.modifiers[3].mid_level = 0 rock.modifiers[4].texture = newTex[2] rock.modifiers[4].strength = gauss(rough * 2, (1 / 3) * rough) rock.modifiers[5].texture = newTex[3] rock.modifiers[5].strength = gauss(rough, (1 / 3) * rough) # Set mesh to be smooth and fix the normals: utils.smooth(rock.data) # utils.smooth(bpy.data.meshes[name]) bpy.ops.object.editmode_toggle() bpy.ops.mesh.normals_make_consistent() bpy.ops.object.editmode_toggle() if use_enter_edit_mode: for m in rock.modifiers: m.show_in_editmode = True m.show_on_cage = True # Store the last value of i: shift = i rocks.append(rock) # Add the shift to LASTROCK: LASTROCK += shift + 1 return rocks
def random_feature(feature_stats) : proposed = random.gauss(feature_stats['MEAN'], feature_stats['STD']) return proposed