feat(map-generator): base of map generator
This commit is contained in:
parent
e29d461319
commit
3cd25bb458
75
map-generator/index.py
Normal file
75
map-generator/index.py
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
import numpy as np
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
import scipy.interpolate as interpolate
|
||||||
|
import math
|
||||||
|
|
||||||
|
WIDTH = 900
|
||||||
|
HEIGHT = 450
|
||||||
|
RATIO = WIDTH / HEIGHT
|
||||||
|
|
||||||
|
MAX_ELEVATION = 100
|
||||||
|
|
||||||
|
def s(x):
|
||||||
|
# return x
|
||||||
|
return -2 * x**3 + 3 * x**2
|
||||||
|
|
||||||
|
WATER_LEVEL = 0
|
||||||
|
WATER_PROPORTION = 0.4
|
||||||
|
GROUND_PROPORTION = 1 - WATER_PROPORTION
|
||||||
|
|
||||||
|
# class Point(object):
|
||||||
|
# def __init__(self, x, y, z):
|
||||||
|
# self.x = x
|
||||||
|
# self.y = y
|
||||||
|
# self.z = z
|
||||||
|
|
||||||
|
# def is_ground(self):
|
||||||
|
# return self.z > WATER_LEVEL
|
||||||
|
|
||||||
|
# def is_water(self):
|
||||||
|
# return not(self.is_ground())
|
||||||
|
|
||||||
|
def is_ground(value):
|
||||||
|
return value > WATER_LEVEL
|
||||||
|
|
||||||
|
def max_recursion(fn, max_recursion=0):
|
||||||
|
def f(*args, recursion=0, **kwargs):
|
||||||
|
if recursion > max_recursion:
|
||||||
|
return
|
||||||
|
|
||||||
|
return fn(*args, **kwargs)
|
||||||
|
|
||||||
|
def continent_agent(ground, position, size):
|
||||||
|
if size <= 0: return
|
||||||
|
x, y = position
|
||||||
|
|
||||||
|
w, h = ground.shape
|
||||||
|
|
||||||
|
while True:
|
||||||
|
if size <= 0: break
|
||||||
|
|
||||||
|
dx = np.random.randint(2) or -1
|
||||||
|
dy = np.random.randint(2) or -1
|
||||||
|
|
||||||
|
x = max(min(x + dx, w - 1), 0)
|
||||||
|
y = max(min(y + dy, h - 1), 0)
|
||||||
|
|
||||||
|
if not is_ground(ground[x, y]):
|
||||||
|
size -= 1
|
||||||
|
ground[x, y] = 1
|
||||||
|
|
||||||
|
def generate_map(width, height, continents=4):
|
||||||
|
ground = np.zeros((width, height))
|
||||||
|
|
||||||
|
for continent in range(continents):
|
||||||
|
position = (np.random.randint(0, width), np.random.randint(0, height))
|
||||||
|
size = np.random.randint(width * height * GROUND_PROPORTION / continents)
|
||||||
|
print(size)
|
||||||
|
continent_agent(ground, position, size=size)
|
||||||
|
|
||||||
|
plt.imshow(ground.T, cmap='hot')
|
||||||
|
plt.show()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
generate_map(WIDTH, HEIGHT)
|
Loading…
Reference in New Issue
Block a user