【三】gym简单画图、快来上手入门吧,超级简单!
相关文章:
【四】gym搭建自己的环境,全网最详细版本,3分钟你就学会了!
【五】gym搭建自己的环境____详细定义自己myenv.py文件
【六】gym搭建自己环境升级版设计,动态障碍------强化学习
【三】gym简单画图
def __init__(self): self.viewer = rendering.Viewer(600, 400) # 600x400 是画板的长和框
要注意在gym的画布中
- 向右为x轴正方向,向上为y轴正方向,左下角为坐标原点
- 默认颜色:黑色
- 默认坐标:原点(左下角)
- gym中的color属性:gym中的这个color,(x, y, z)中的每一位应该取[0, 1]之间的值
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:
再画个圆试试:【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')
得到了圆在左下角,原因是:默认情况下圆心在坐标原点
增加一个平移操作让圆显现:【圆心平移】
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:
画一个一个六边形
import gym from gym.envs.classic_control import rendering import numpy import math
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')
扩充:
直线
# 方式一 # 定义一根线 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
画圆
# 方式一 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
多边形
# 方式一 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
曲线
# 那么,也就可以用它来画曲线了 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
胶囊
# 胶囊形状 acapsule = rendering.make_capsule(10, 20) # 11 # length, width, 默认中心画在原点 acapsule.add_attr(rendering.Transform(translation=(70, 100))) self.viewer.add_geom(acapsule)
if __name__ == '__main__': env = RenderTestEnv() # 声明一个变量的时候就调用了__init__()函数生成了画布 env.render() # 显示画面 time.sleep(10) # 持续3秒 env.close() # 清掉画布