【三】gym简单画图、快来上手入门吧,超级简单!

2022-12-01 16:50:51 浏览数 (1)

相关文章:

【一】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:

  1. 首先,导入库文件(包括gym模块和gym中的渲染模块)
  2. 我们生成一个类,该类继承 gym.Env. 同时,可以添加元数据,改变渲染环境时的参数
  3. 我们在初始函数中定义一个 viewer ,即画板
  4. 继承 render函数
  5. 最后运行
代码语言:javascript复制
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函数替换一下就行】

代码语言:javascript复制
     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()     # 清掉画布
 

0 人点赞