前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【三】gym简单画图、快来上手入门吧,超级简单!

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

作者头像
汀丶人工智能
发布2022-12-01 16:50:51
4840
发布2022-12-01 16:50:51
举报
文章被收录于专栏:NLP/KG

相关文章:

【一】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()     # 清掉画布
 

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-04-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 【三】gym简单画图
    • demo_1:
      • demo_2:
        • demo_3:
          • 扩充:
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档