相关文章:

【一】gym环境安装以及安装遇到的错误解决

【二】gym初次入门一学就会-简明教程

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

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

【三】gym简单画图、快来上手入门吧,超级简单!的更多相关文章

  1. smarty半小时快速上手入门教程

    http://www.jb51.net/article/56754.htm http://www.yiibai.com/smarty/smarty_functions.html http://www. ...

  2. 【第三篇】ASP.NET MVC快速入门之安全策略(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  3. 华大单片机开发板HC32L13X上手入门

    HC32L136开发板(如下图所示)分为板载调试模块(左半部分)和MCU开发电路(右半部分).二者中间通过邮票孔相连,如果将板子从中间掰开,板载调试模块就可以当一个CMSIS-DAP的仿真器来使用.此 ...

  4. 华大单片机开发板HC32F030上手入门

    HC32F030开发板(如下图所示)分为板载调试模块(左半部分)和MCU开发电路(右半部分).二者中间通过邮票孔相连,如果将板子从中间掰开,板载调试模块就可以当一个CMSIS-DAP的仿真器来使用.此 ...

  5. 我的第一个activiti实例 (代码方式) ctiviti入门列子一个简单的activiti请假流程

    转: (activiti入门列子一个简单的activiti请假流程) 我的第一个activiti实例 2017年05月31日 14:29:45 chf_mixueer 阅读数:1223   整个项目的 ...

  6. Struts1入门实例(简单登录)

    Struts1入门实例(简单登录) 现在开始加入公司的核心项目,但由于项目开发比较早,所以使用的技术不是很新潮,前台用的还是struts1. 虽然不是什么新技术,但仍可以从中学到好多东西的.花了一个晚 ...

  7. 让Netty入门变得简单

    让Netty入门变得简单 https://mp.weixin.qq.com/s/MBnbLmCmFJo0QK9WNwXrXQ 如果先启动nettyClient就不会有nettyServer输出了: p ...

  8. Unity3D入门其实很简单

    在上次发布拙作后,有不少童鞋询问本人如何学习Unity3D.本人自知作为一名刚入门的菜鸟,实在没有资格谈论这么高大上的话题,生怕误导了各位.不过思来想去,决定还是写一些自己的经验,如果能给想要入门U3 ...

  9. jmGraph:一个基于html5的简单画图组件

    jmGraph:一个基于html5的简单画图组件 特性: 代码书写简单易理解 面向对象的代码结构 对图形控件化 样式抽离 模块化:入seajs实现模块化开发 兼容性:暂只推荐支持html5的浏览器:i ...

  10. 【Netty整理01-快速入门】Netty简单使用Demo(已验证)

    多处摘抄或手打,为了十积分厚着脸皮标为原创,惭愧惭愧~本篇文章用于快速入门搭建一个简单的netty 应用,如想稍微深入系统的了解,请参照本人下一篇博客,链接: 参考地址: 官方文档:http://ne ...

随机推荐

  1. Hugging News #0918: Hub 加入分类整理功能、科普文本生成中的流式传输

    每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...

  2. 收到一封CTO来信,邀约面试机器学习工程师

    大家好,我是北海 很少登陆 Gmail,前天收验证码登了一下,发现居然收到一封某初创公司CTO的来信. 我在Github上看到了您的资料觉得很有意思,请问您是否考虑我们公司的全职工作机会呢?可供考虑的 ...

  3. Android 编译线程爆了, gradle 内存 OOM 解决之路

    本文首发我的微信公众号徐公,收录于 Github·AndroidGuide,这里有 Android 进阶成长知识体系, 希望我们能够一起学习进步,关注公众号徐公,5 年中大厂程序员,一起建立核心竞争力 ...

  4. Educational Codeforces Round 82 (Rated for Div. 2) A. Erasing Zeroes(超简单的写法)

    题意: 统计间隔在1中0的个数 思路: 超简单写法,直接利用string的find.rfind函数即可 #include<bits/stdc++.h> using namespace st ...

  5. Codeforces Round #697 (Div. 3) A - G个人题解记录

    Codeforces Round #697 (Div. 3) 1475A. Odd Divisor 问一个数是否有奇除数. 对 2 不断除,如果最后 n == 1即不可能存在,否在存在. int ma ...

  6. 一、linux单机版mongo安装(带密码验证)

    系列导航 一.linux单机版mongo安装(带密码验证) 二.mongo集群搭建 三.java连接mongo数据库 四.java对mongo数据库增删改查操作 五.mongo备份篇 mongoexp ...

  7. docker 原理之 user namespace(下)

    1. user namespace user namespace 主要隔离了安全相关的标识符和属性,包括用户 ID,用户组 ID,key 和 capabilities 等.同样一个用户 id 在不同 ...

  8. Socket 如何处理粘包

    Socket 如何处理粘包 什么是粘包什么是半包? 粘包: 比如发送了AA BB 两条消息,但是另一方接收到的消息却是AAB,像这种一次性读取了俩条数据的情况就是粘包 半包: 比如发送的消息是ABC时 ...

  9. 如何开发一套苹果cms前端模板

    本文运用了苹果cms官网的模板开发教程,开发了一套苹果cms的前端模板,感兴趣的同学可以去github下载使用. 什么是模板 模板是网站的主题外观,也被称为主题或皮肤.通过使用不同的模板,网站的前台可 ...

  10. 【MCU】单片机如何检测市电通断?(应用甚广~)

    [来源]https://mp.weixin.qq.com/s/TQKtEbxS8WSo3D1MecdMIw