相关文章:
【一】gym环境安装以及安装遇到的错误解决
【二】gym初次入门一学就会-简明教程
【三】gym简单画图
【四】gym搭建自己的环境,全网最详细版本,3分钟你就学会了!
【五】gym搭建自己的环境____详细定义自己myenv.py文件
【六】gym搭建自己环境升级版设计,动态障碍------强化学习
【三】gym简单画图
代码语言:javascript复制 def __init__(self):
self.viewer = rendering.Viewer(600, 400) # 600x400 是画板的长和框
要注意在gym的画布中
- 向右为x轴正方向,向上为y轴正方向,左下角为坐标原点
- 默认颜色:黑色
- 默认坐标:原点(左下角)
- gym中的color属性:gym中的这个color,(x, y, z)中的每一位应该取0, 1之间的值
代码语言:javascript复制 def render(self, mode='human'):
'''
这里是绘制部分
'''
return self.viewer.render(return_rgb_array=mode == 'rgb_array')
demo_1:
- 首先,导入库文件(包括gym模块和gym中的渲染模块)
- 我们生成一个类,该类继承 gym.Env. 同时,可以添加元数据,改变渲染环境时的参数
- 我们在初始函数中定义一个 viewer ,即画板
- 继承 render函数
- 最后运行
import gym
from gym.envs.classic_control import rendering
class Test(gym.Env):
# 如果你不想改参数,下面可以不用写
metadata = {
'render.modes': ['human', 'rgb_array'],
'video.frames_per_second': 2
}
def __init__(self):
self.viewer = rendering.Viewer(600, 400) # 600x400 是画板的长和框
def render(self, mode='human', close=False):
# 下面就可以定义你要绘画的元素了
line1 = rendering.Line((100, 300), (500, 300))
line2 = rendering.Line((100, 200), (500, 200))
# 给元素添加颜色
line1.set_color(0, 0, 0)
line2.set_color(0, 0, 0)
# 把图形元素添加到画板中
self.viewer.add_geom(line1)
self.viewer.add_geom(line2)
return self.viewer.render(return_rgb_array=mode == 'rgb_array')
if __name__ == '__main__':
t = Test()
while True:
t.render()
结果:
demo_2:
代码语言:javascript复制再画个圆试试:【render函数替换一下就行】
def render(self, mode='human', close=False):
# 画一个直径为 30 的园
circle = rendering.make_circle(30)
self.viewer.add_geom(circle)
return self.viewer.render(return_rgb_array=mode == 'rgb_array')
得到了圆在左下角,原因是:默认情况下圆心在坐标原点
增加一个平移操作让圆显现:【圆心平移】
代码语言:javascript复制 def render(self, mode='human', close=False):
# 画一个直径为 30 的园
circle = rendering.make_circle(30)
# 添加一个平移操作
circle_transform = rendering.Transform(translation=(100, 200))
# 让圆添加平移这个属性
circle.add_attr(circle_transform)
self.viewer.add_geom(circle)
return self.viewer.render(return_rgb_array=mode == 'rgb_array')
demo_3:
代码语言:javascript复制画一个一个六边形
import gym
from gym.envs.classic_control import rendering
import numpy
import math
代码语言:javascript复制 def render(self, mode='human', close=False):
# 画一个直径为 30 的园
circle = rendering.make_polyline([(50, 200-50*math.sqrt(3)),
(100, 200), (200, 200),
(250, 200 - 50 * math.sqrt(3)),
(200, 200 - 100*math.sqrt(3)),
(100, 200 - 100*math.sqrt(3)),
(50, 200 - 50 * math.sqrt(3))])
# 添加一个平移操作
circle_transform = rendering.Transform(translation=(50, 100))
# 让圆添加平移这个属性
circle.add_attr(circle_transform)
self.viewer.add_geom(circle)
return self.viewer.render(return_rgb_array=mode == 'rgb_array')
扩充:
代码语言:javascript复制直线
# 方式一
# 定义一根线
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
代码语言:javascript复制画圆
# 方式一
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
代码语言:javascript复制 多边形
# 方式一
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
代码语言:javascript复制曲线
# 那么,也就可以用它来画曲线了
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
代码语言:javascript复制胶囊
# 胶囊形状
acapsule = rendering.make_capsule(10, 20) # 11
# length, width, 默认中心画在原点
acapsule.add_attr(rendering.Transform(translation=(70, 100)))
self.viewer.add_geom(acapsule)
代码语言:javascript复制 if __name__ == '__main__':
env = RenderTestEnv() # 声明一个变量的时候就调用了__init__()函数生成了画布
env.render() # 显示画面
time.sleep(10) # 持续3秒
env.close() # 清掉画布