75 lines
2.6 KiB
Python
75 lines
2.6 KiB
Python
|
#!/usr/bin/env python3
|
||
|
|
||
|
import math
|
||
|
import cv2 as cv
|
||
|
import pyskyline
|
||
|
import numpy as np
|
||
|
import argparse
|
||
|
import matplotlib.pyplot as plt
|
||
|
from matplotlib.widgets import Slider
|
||
|
|
||
|
def show_result(terrain, skyline, coord, scoremap):
|
||
|
fig = plt.figure()
|
||
|
gs = fig.add_gridspec(2,3)
|
||
|
fig.suptitle("Mosse correlation", fontsize=16)
|
||
|
ax1 = fig.add_subplot(gs[0, 0])
|
||
|
ax2 = fig.add_subplot(gs[0, 1])
|
||
|
ax3 = fig.add_subplot(gs[0, 2])
|
||
|
ax4 = fig.add_subplot(gs[1, :])
|
||
|
|
||
|
im1 = ax1.imshow(scoremap, cmap='hot', interpolation='nearest')
|
||
|
ax1.set_title('Correlation map')
|
||
|
cbar1 = ax1.figure.colorbar(im1)
|
||
|
cbar1.ax.set_ylabel("Correlation score", rotation=-90, va="bottom")
|
||
|
|
||
|
rgb = cv.cvtColor(terrain.rgb(), cv.COLOR_BGR2RGB)
|
||
|
rgb = cv.circle(rgb, coord, 2, (255,0,0), -1)
|
||
|
ax2.imshow(rgb)
|
||
|
ax2.set_title('Colored terrain')
|
||
|
|
||
|
im2 = ax3.imshow((terrain.grayscale().astype(float) - 135) * (40.0/120.0))
|
||
|
ax3.set_title('DEM')
|
||
|
cbar = ax1.figure.colorbar(im2)
|
||
|
cbar.ax.set_ylabel("Altitude", rotation=-90, va="bottom")
|
||
|
|
||
|
x = np.linspace(-180,180,skyline.shape[0])
|
||
|
ax4.plot(x,skyline,label="Agent vision")
|
||
|
ax4.plot(x,terrain.get_skyline(coord[0], coord[1]), label="DEM data")
|
||
|
ax4.legend()
|
||
|
|
||
|
plt.show()
|
||
|
|
||
|
def eval_score(correlation_map, coord, scale, alpha=10):
|
||
|
alpha = alpha / scale
|
||
|
score = 0
|
||
|
h,w = correlation_map.shape
|
||
|
x,y = coord
|
||
|
for j in range(h):
|
||
|
for i in range(w):
|
||
|
dist = math.sqrt((x-i)**2+(y-j)**2)
|
||
|
score += correlation_map[j,i] * 1 #(math.pow(0.5,math.pow(dist/alpha,2)-1)-1)
|
||
|
return score
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
parser = argparse.ArgumentParser()
|
||
|
|
||
|
parser.add_argument("--size", help="Terrain size (default=128)", type=int, default=128)
|
||
|
parser.add_argument("--seed", help="Terrain seed (If not set seed is random)", type=int)
|
||
|
|
||
|
args = parser.parse_args()
|
||
|
|
||
|
seed = np.random.randint(0,1024) if args.seed is None else args.seed
|
||
|
terrain = pyskyline.Terrain.generate(size=args.size,seed=seed,scale=8.0,max_altitude=40.0)
|
||
|
|
||
|
terrain.precompute_all_skylines()
|
||
|
|
||
|
x, y = terrain.get_random_water_coordinate()
|
||
|
skyline = terrain.get_skyline(x, y)
|
||
|
angle = np.random.randint(1,40)
|
||
|
skyline = np.roll(skyline, angle)
|
||
|
correlation_map = pyskyline.MosseCorrelation.process(terrain, skyline)
|
||
|
score = eval_score(correlation_map,(x,y), terrain._scale,100)
|
||
|
score = score / (2 * terrain.water_tile_count()) + 0.5
|
||
|
print(f"{score:0.2f} with angle of {angle}")
|
||
|
show_result(terrain, skyline, (x,y), correlation_map)
|