赞
踩
Gym环境的主要架构
查看gym.Env类的主要结构如下
其中主要会用到的是metadata、step()、reset()、render()、close()
render()
先看一下render能画出什么东西
注:其中的数字是截图时标注的
下面看一下这些图形是如何画出来的
首先,需要声明一块画布
这个感觉放在环境类的_init_()函数中比较好,算是初始化的工作
def __init__(self):
self.viewer = rendering.Viewer(600, 400) # 600x400 是画板的长和框
当然,该语句也可以追加在render()函数中
要注意在gym的画布中
render()的主题框架
def render(self, mode='human'):
'''
这里是绘制部分
'''
return self.viewer.render(return_rgb_array=mode == 'rgb_array')
画直线
# 方式一
# 定义一根线
aline = rendering.Line((100, 30), (500, 30)) # 1
# 把图形元素添加到画板中
self.viewer.add_geom(aline)
# 方式二
transform0 = rendering.Transform(translation=(50, 100)) # 相对偏移
self.viewer.draw_line((0, 0), (0, 300), color=(0, 0, 1)).add_attr(transform0) # 2
效果分别如图中的1、2所示
画圆
# 方式一
acircle = rendering.make_circle(50, 10, filled=False) # 3 *注意下面还做了平移操作
# radius=10 半径
# res=30 说是画圆,其实是画正多边形,res指定多边形的边数
# filled=True 是否填充
acircle.set_color(0, 1, 0)
acircle.set_linewidth(5) # 设置线宽
# 添加一个平移操作
transform1 = rendering.Transform(translation=(100, 200)) # 相对偏移
# 让圆添加平移这个属性
acircle.add_attr(transform1)
self.viewer.add_geom(acircle)
# 方式二
transform2 = rendering.Transform(translation=(200, 200)) # 相对偏移
self.viewer.draw_circle(20, 30, False).add_attr(transform2) # 4
注意其中的平移(Transform)操作
效果分别如图3、4所示
画多边形
# 方式一
apolygon = rendering.make_polygon([(30, 30), (50, 30), (50, 80), (30, 80)], filled=True) # 5 *注意下面做了偏移
# 依次传入各个顶点
apolygon.set_color(0, 0, 0)
transform3 = rendering.Transform(translation=(50, 200)) # 相对偏移
apolygon.add_attr(transform3)
self.viewer.add_geom(apolygon)
# 方式二
transform4 = rendering.Transform(translation=(50, 50)) # 相对偏移
self.viewer.draw_polygon([(60, 30), (80, 30), (80, 80), (60, 80)], False).add_attr(transform4) # 6
效果分别如图中的5、6所示
画非方形的时候,可以借助三角函数找坐标
# 画非方形的时候,可以借助三角函数找坐标
transform4 = rendering.Transform(translation=(250, 300)) # 相对偏移,即设定中心
# 这里打算就像上面画圆似的,找一个中心,根据半径圆心角依次获得各个点的坐标
radius = 100
res = 5 # 5边形
points = [(np.cos(2 * np.pi * i / res) * radius, np.sin(2 * np.pi * i / res) * radius) for i in range(res)]
self.viewer.draw_polygon(points, False).add_attr(transform4) # 7 *注意偏移
# 改变一下顶点的顺序
transform5 = rendering.Transform(translation=(450, 300)) # 相对偏移,即设定中心
new_points = [points[0], points[2], points[4], points[1], points[3]]
self.viewer.draw_polygon(new_points, False).add_attr(transform5) # 8
效果如图中的7、8所示
画空多边形
# 方式一
apolyline1 = rendering.make_polygon([(60, 30), (80, 30), (80, 80), (60, 80)], False)
'''后续省略,没有在图中出现'''
# 方式二
apolyline2 = rendering.make_polyline([(60, 30), (80, 30), (80, 80), (60, 80)])
# 其内部实现方式就是方式一
'''后续省略,没有在图中出现'''
# 方式三
transform6 = rendering.Transform(translation=(300, 50)) # 相对偏移
self.viewer.draw_polyline([(60, 30), (80, 30),
(80, 80), (60, 80), (60, 30)]).add_attr(transform6) # 9
# 在我这里这种方式下需要最后传入起始点,也就是四边形要传入5个点
画曲线
注意到上面的方式三,该方式是需要对多边形自行封口的(即最后一个坐标回到起点),那么如果不指定到起点,这就是一条折线,如果将点取的比较秘籍,这就是一条曲线,当然,这也是在其他画图方式中的做法。
# 那么,也就可以用它来画曲线了
transform7 = rendering.Transform(translation=(0, 200)) # 相对偏移
points2 = [(x, 100 * np.sin(0.02 * x)) for x in np.linspace(1, 600, 600)]
self.viewer.draw_polyline(points2, color=(0, 0, 255), linewidth=5).add_attr(transform7) # 10
效果如图中10所示
胶囊(capsule)形状
# 胶囊形状
acapsule = rendering.make_capsule(10, 20) # 11
# length, width, 默认中心画在原点
acapsule.add_attr(rendering.Transform(translation=(70, 100)))
self.viewer.add_geom(acapsule)
效果如图中11所示
测试
if __name__ == '__main__':
env = RenderTestEnv() # 声明一个变量的时候就调用了__init__()函数生成了画布
env.render() # 显示画面
time.sleep(3) # 持续3秒
env.close() # 清掉画布
效果如文首图所示
相关文献
什么是gym
gym自定义可视化环境绘制
gym自定义可视化环境实例
强化学习调用gym环境实例
从Q_Learning看强化学习
一个Q_Learning强化学习自定义gym环境可视化实例
tkinter制作强化学习环境
Pytorch实现DQN
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。