【三】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 mathdef 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简单画图、快来上手入门吧,超级简单!的更多相关文章
- smarty半小时快速上手入门教程
http://www.jb51.net/article/56754.htm http://www.yiibai.com/smarty/smarty_functions.html http://www. ...
- 【第三篇】ASP.NET MVC快速入门之安全策略(MVC5+EF6)
目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...
- 华大单片机开发板HC32L13X上手入门
HC32L136开发板(如下图所示)分为板载调试模块(左半部分)和MCU开发电路(右半部分).二者中间通过邮票孔相连,如果将板子从中间掰开,板载调试模块就可以当一个CMSIS-DAP的仿真器来使用.此 ...
- 华大单片机开发板HC32F030上手入门
HC32F030开发板(如下图所示)分为板载调试模块(左半部分)和MCU开发电路(右半部分).二者中间通过邮票孔相连,如果将板子从中间掰开,板载调试模块就可以当一个CMSIS-DAP的仿真器来使用.此 ...
- 我的第一个activiti实例 (代码方式) ctiviti入门列子一个简单的activiti请假流程
转: (activiti入门列子一个简单的activiti请假流程) 我的第一个activiti实例 2017年05月31日 14:29:45 chf_mixueer 阅读数:1223 整个项目的 ...
- Struts1入门实例(简单登录)
Struts1入门实例(简单登录) 现在开始加入公司的核心项目,但由于项目开发比较早,所以使用的技术不是很新潮,前台用的还是struts1. 虽然不是什么新技术,但仍可以从中学到好多东西的.花了一个晚 ...
- 让Netty入门变得简单
让Netty入门变得简单 https://mp.weixin.qq.com/s/MBnbLmCmFJo0QK9WNwXrXQ 如果先启动nettyClient就不会有nettyServer输出了: p ...
- Unity3D入门其实很简单
在上次发布拙作后,有不少童鞋询问本人如何学习Unity3D.本人自知作为一名刚入门的菜鸟,实在没有资格谈论这么高大上的话题,生怕误导了各位.不过思来想去,决定还是写一些自己的经验,如果能给想要入门U3 ...
- jmGraph:一个基于html5的简单画图组件
jmGraph:一个基于html5的简单画图组件 特性: 代码书写简单易理解 面向对象的代码结构 对图形控件化 样式抽离 模块化:入seajs实现模块化开发 兼容性:暂只推荐支持html5的浏览器:i ...
- 【Netty整理01-快速入门】Netty简单使用Demo(已验证)
多处摘抄或手打,为了十积分厚着脸皮标为原创,惭愧惭愧~本篇文章用于快速入门搭建一个简单的netty 应用,如想稍微深入系统的了解,请参照本人下一篇博客,链接: 参考地址: 官方文档:http://ne ...
随机推荐
- Hugging News #0918: Hub 加入分类整理功能、科普文本生成中的流式传输
每一周,我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新,包括我们的产品和平台更新.社区活动.学习资源和内容更新.开源库和模型更新等,我们将其称之为「Hugging Ne ...
- 收到一封CTO来信,邀约面试机器学习工程师
大家好,我是北海 很少登陆 Gmail,前天收验证码登了一下,发现居然收到一封某初创公司CTO的来信. 我在Github上看到了您的资料觉得很有意思,请问您是否考虑我们公司的全职工作机会呢?可供考虑的 ...
- Android 编译线程爆了, gradle 内存 OOM 解决之路
本文首发我的微信公众号徐公,收录于 Github·AndroidGuide,这里有 Android 进阶成长知识体系, 希望我们能够一起学习进步,关注公众号徐公,5 年中大厂程序员,一起建立核心竞争力 ...
- Educational Codeforces Round 82 (Rated for Div. 2) A. Erasing Zeroes(超简单的写法)
题意: 统计间隔在1中0的个数 思路: 超简单写法,直接利用string的find.rfind函数即可 #include<bits/stdc++.h> using namespace st ...
- Codeforces Round #697 (Div. 3) A - G个人题解记录
Codeforces Round #697 (Div. 3) 1475A. Odd Divisor 问一个数是否有奇除数. 对 2 不断除,如果最后 n == 1即不可能存在,否在存在. int ma ...
- 一、linux单机版mongo安装(带密码验证)
系列导航 一.linux单机版mongo安装(带密码验证) 二.mongo集群搭建 三.java连接mongo数据库 四.java对mongo数据库增删改查操作 五.mongo备份篇 mongoexp ...
- docker 原理之 user namespace(下)
1. user namespace user namespace 主要隔离了安全相关的标识符和属性,包括用户 ID,用户组 ID,key 和 capabilities 等.同样一个用户 id 在不同 ...
- Socket 如何处理粘包
Socket 如何处理粘包 什么是粘包什么是半包? 粘包: 比如发送了AA BB 两条消息,但是另一方接收到的消息却是AAB,像这种一次性读取了俩条数据的情况就是粘包 半包: 比如发送的消息是ABC时 ...
- 如何开发一套苹果cms前端模板
本文运用了苹果cms官网的模板开发教程,开发了一套苹果cms的前端模板,感兴趣的同学可以去github下载使用. 什么是模板 模板是网站的主题外观,也被称为主题或皮肤.通过使用不同的模板,网站的前台可 ...
- 【MCU】单片机如何检测市电通断?(应用甚广~)
[来源]https://mp.weixin.qq.com/s/TQKtEbxS8WSo3D1MecdMIw



