You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

88 lines
3.7 KiB

#!/usr/bin/python3
import visvis as vv
import numpy as np
import time
def translateArrayToVV(array):
scaling = (float(array[0][1]) - float(array[0][0]), float(array[2][1]) - float(array[2][0]), float(array[4][1]) - float(array[4][0]))
translation = (float(array[0][0]) + scaling[0] * 0.5, float(array[2][0]) + scaling[0] * 0.5, float(array[4][0]) + scaling[0] * 0.5)
return translation, scaling
class VisVisPlotter():
def __init__(self, stateValuations, goalStates, deadlockStates, stepwise):
self.app = vv.use()
self.fig = vv.clf()
self.ax = vv.cla()
self.stateColor = (0,0,0.75,0.4)
self.failColor = (0.8,0.8,0.8,1.0) # (1,0,0,0.8)
self.goalColor = (0,1,0,1.0)
self.stateScaling = (2,2,2) #(.5,.5,.5)
self.plotedStates = set()
self.plotedMeshes = set()
self.stepwise = stepwise
auxStates = [0,1,2,25518]
self.goals = set([(stateValuation.x, stateValuation.y, stateValuation.z) for stateId, stateValuation in stateValuations.items() if stateId in goalStates and not stateId in auxStates])
self.fails = set([(stateValuation.x, stateValuation.y, stateValuation.z) for stateId, stateValuation in stateValuations.items() if stateId in deadlockStates and not stateId in auxStates])
def plotScenario(self, saveScreenshot=True):
for goal in self.goals:
state = vv.solidBox(goal, scaling=self.stateScaling)
state.faceColor = self.goalColor
for fail in self.fails:
state = vv.solidBox(fail, scaling=self.stateScaling)
state.faceColor = self.failColor
self.ax.SetLimits((-16,16),(-10,10),(-7,7))
self.ax.SetView({'zoom':0.025, 'elevation':20, 'azimuth':30})
if saveScreenshot: vv.screenshot("000.png", sf=3, bg='w', ob=vv.gcf())
def run(self):
self.ax.SetLimits((-16,16),(-10,10),(-7,7))
self.app.Run()
def clear(self):
axes = vv.gca()
axes.Clear()
def plotStates(self, states, coloring="", removeMeshes=False):
if self.stepwise and removeMeshes:
self.clear()
self.plotScenario(saveScreenshot=False)
if not coloring:
coloring = self.stateColor
plotedRegions = set()
for state in states:
if state in self.plotedStates: continue # what are the implications of this?
coordinates = (state.x, state.y, state.z)
print(f"plotting {state} at {coordinates}")
if coordinates in plotedRegions: continue
state = vv.solidBox(coordinates, scaling=(1,1,1))#(0.5,0.5,0.5))
state.faceColor = coloring
plotedRegions.add(coordinates)
if self.stepwise:
self.plotedMeshes.add(state)
self.plotedStates.update(states)
def takeScreenshot(self, iteration, prefix=""):
self.ax.SetLimits((-16,16),(-10,10),(-7,7))
#config = [(90, 00), (45, 00), (0, 00), (-45, 00), (-90, 00)]
config = [(45, -150), (45, -100), (45, -60), (45, 60), (45, 120)]
for elevation, azimuth in config:
filename = f"{prefix}{'_' if prefix else ''}{iteration:03}_{elevation}_{azimuth}.png"
print(f"Saving Screenshot to {filename}")
self.ax.SetView({'zoom':0.025, 'elevation':elevation, 'azimuth':azimuth})
vv.screenshot(filename, sf=3, bg='w', ob=vv.gcf())
def turnCamera(self):
config = [(45, -150), (45, -100), (45, -60), (45, 60), (45, 120)]
self.ax.SetLimits((-16,16),(-10,10),(-7,7))
for elevation, azimuth in config:
self.ax.SetView({'zoom':0.025, 'elevation':elevation, 'azimuth':azimuth})
if __name__ == '__main__':
main()