public override byte[] Render(bool toRgbArray = false) { if (Viewer == null) { Viewer = new Rendering.Viewer(500, 500); Viewer.SetBounds(-2.2f, 2.2f, -2.2f, 2.2f); var rod = Rendering.MakeCapsule(1, .2f); rod.SetColor(.8f, .3f, .3f); pole_transform = new Rendering.Transform(); rod.AddAttr(pole_transform); Viewer.AddGeom(rod); var axle = Rendering.MakeCircle(.05f); axle.SetColor(0, 0, 0); Viewer.AddGeom(axle); //img = new Rendering.Image("assets/clockwise.png", 1.0, 1.0); //imgtrans = new Rendering.Transform(); //img.AddAttr(imgtrans); } pole_transform.SetRotation(State[0] + (float)Math.PI / 2); //Viewer.AddOneTime(img); //if (!float.IsNaN(last_u)) // imgtrans.SetScale(-last_u / 2, Math.Abs(last_u) / 2 ); Viewer.Render(); return(null); }
public override byte[] Render(bool toRgbArray = false) { if (Viewer == null) { Viewer = new Rendering.Viewer(ObservationSpace.Shape.Width, ObservationSpace.Shape.Height); } var img = new Rendering.Image(GetScreenPixelData(), ObservationSpace.Shape.Width, ObservationSpace.Shape.Height); Viewer.AddOneTime(img); Viewer.Render(); return(null); }
public override byte[] Render(bool toRgbArray = false) { var s = State; if (Viewer == null) { Viewer = new Rendering.Viewer(500, 500); var bound = LINK_LENGTH_1 + LINK_LENGTH_2 + 0.2f; // 2.2 for default Viewer.SetBounds(-bound, bound, -bound, bound); } if (s == null) { return(null); } var p1 = new [] { LINK_LENGTH_1 *(float)Math.Sin(s[0]), -LINK_LENGTH_1 * (float)Math.Cos(s[0]) }; //var p2 = new [] { p1[0] - LINK_LENGTH_2 * Math.Cos(s[0] + s[1]), p1[1] + LINK_LENGTH_2 * Math.Sin(s[0] + s[1]) }; var xys = new List <float[]> { new float[] { 0, 0 }, p1 }; var thetas = new [] { s[0] - (float)Math.PI / 2, s[0] + s[1] - (float)Math.PI / 2 }; var linkLengths = new[] { LINK_LENGTH_1, LINK_LENGTH_2 }; Viewer.DrawLine(new [] { -2.2f, 1 }, new [] { 2.2f, 1 }); for (int i = 0; i < linkLengths.Length; ++i) { float x = xys[i][0], y = xys[i][1], th = thetas[i], llen = linkLengths[i]; float l = 0, r = llen, t = .1f, b = -.1f; var jTransform = new Rendering.Transform(new [] { x, y }, th); var link = Viewer.DrawPolygon(new List <float[]> { new[] { l, b }, new[] { l, t }, new[] { r, t }, new[] { r, b } }); link.AddAttr(jTransform); link.SetColor(0, .8f, .8f); var circ = Viewer.DrawCircle(.1f); circ.SetColor(.8f, .8f, 0); circ.AddAttr(jTransform); } Viewer.Render(); return(null); }
public override byte[] Render(bool toRgbArray = false) { const int SCREEN_WIDTH = 600; const int SCREEN_HEIGHT = 400; float worldWidth = X_THRESHOLD * 2; float scale = SCREEN_WIDTH / worldWidth; float cartY = 100; // TOP OF CART float poleWidth = 10.0f; float poleLen = scale * (2 * LENGTH); float cartWidth = 50.0f; float cartHeight = 30.0f; if (Viewer == null) { Viewer = new Rendering.Viewer(SCREEN_WIDTH, SCREEN_HEIGHT); float l = -cartWidth / 2; float r = cartWidth / 2; float t = cartHeight / 2; float b = -cartHeight / 2; float axleOffset = cartHeight / 4.0f; var cart = new Rendering.FilledPolygon(new List <float[]> { new[] { l, b }, new[] { l, t }, new[] { r, t }, new[] { r, b } }); CartTrans = new Rendering.Transform(); cart.AddAttr(CartTrans); Viewer.AddGeom(cart); l = -poleWidth / 2; r = poleWidth / 2; t = poleLen - poleWidth / 2; b = -poleWidth / 2; Pole = new Rendering.FilledPolygon(new List <float[]> { new[] { l, b }, new[] { l, t }, new[] { r, t }, new[] { r, b } }); Pole.SetColor(.8f, .6f, .4f); PoleTrans = new Rendering.Transform(new[] { 0, axleOffset }); Pole.AddAttr(PoleTrans); Pole.AddAttr(CartTrans); Viewer.AddGeom(Pole); Axle = Rendering.MakeCircle(poleWidth / 2); Axle.AddAttr(PoleTrans); Axle.AddAttr(CartTrans); Axle.SetColor(.5f, .5f, .8f); Viewer.AddGeom(Axle); Track = new Rendering.Line(new [] { 0, cartY }, new [] { SCREEN_WIDTH, cartY }); Track.SetColor(0, 0, 0); Viewer.AddGeom(Track); } if (State == null) { return(null); } { // Edit the pole polygon vertex float l = -poleWidth / 2, r = poleWidth / 2, t = poleLen - poleWidth / 2, b = poleWidth / 2; Pole.Vertices = new List <float[]> { new[] { l, b }, new[] { l, t }, new[] { r, t }, new[] { r, b } }; } var cartX = State[0] * scale + SCREEN_WIDTH / 2.0f; // MIDDLE OF CART CartTrans.SetTranslation(cartX, cartY); PoleTrans.SetRotation(-State[2]); byte[] rgbArray = toRgbArray ? new byte[SCREEN_WIDTH * SCREEN_HEIGHT * 3] : null; Viewer.Render(rgbArray); return(rgbArray); }
public override byte[] Render(bool toRgbArray = false) { const int SCREEN_WIDTH = 600; const int SCREEN_HEIGHT = 400; float world_width = max_position - min_position; float scale = SCREEN_WIDTH / world_width; const int carwidth = 40; const int carheight = 20; if (Viewer == null) { Viewer = new Rendering.Viewer(SCREEN_WIDTH, SCREEN_HEIGHT); var xs = Neuro.Tools.LinSpace(min_position, max_position, 100); var ys = xs.Select(x => Height(x)).ToList(); var xys = xs.Zip(ys, (x, y) => new[] { (x - min_position) * scale, y * scale }).ToList(); Rendering.Polyline track = Rendering.MakePolyLine(xys) as Rendering.Polyline; track.SetLineWidth(4); Viewer.AddGeom(track); float clearance = 10; float l = -carwidth / 2, r = carwidth / 2, t = carheight, b = 0; var car = new Rendering.FilledPolygon(new List <float[]> { new[] { l, b }, new[] { l, t }, new[] { r, t }, new[] { r, b } }); car.AddAttr(new Rendering.Transform(new[] { 0, clearance })); CarTrans = new Rendering.Transform(); car.AddAttr(CarTrans); Viewer.AddGeom(car); var frontwheel = Rendering.MakeCircle(carheight / 2.5f); frontwheel.SetColor(.5f, .5f, .5f); frontwheel.AddAttr(new Rendering.Transform(new[] { carwidth / 4, clearance })); frontwheel.AddAttr(CarTrans); Viewer.AddGeom(frontwheel); var backwheel = Rendering.MakeCircle(carheight / 2.5f); backwheel.AddAttr(new Rendering.Transform(new[] { -carwidth / 4, clearance })); backwheel.AddAttr(CarTrans); backwheel.SetColor(.5f, .5f, .5f); Viewer.AddGeom(backwheel); float flagx = (goal_position - min_position) * scale; float flagy1 = Height(goal_position) * scale; float flagy2 = flagy1 + 50; var flagpole = new Rendering.Line(new[] { flagx, flagy1 }, new[] { flagx, flagy2 }); Viewer.AddGeom(flagpole); var flag = new Rendering.FilledPolygon(new List <float[]>() { new[] { flagx, flagy2 }, new[] { flagx, flagy2 - 10 }, new[] { flagx + 25, flagy2 - 5 } }); flag.SetColor(.8f, .8f, 0); Viewer.AddGeom(flag); } float pos = State[0]; CarTrans.SetTranslation((pos - min_position) * scale, Height(pos) * scale); CarTrans.SetRotation((float)Math.Cos(3 * pos)); Viewer.Render(); return(null); }
public override byte[] Render(bool toRgbArray = false) { if (Viewer == null) { Viewer = new Rendering.Viewer(VIEWPORT_W, VIEWPORT_H); } Viewer.SetBounds(scroll, VIEWPORT_W / SCALE + scroll, 0, VIEWPORT_H / SCALE); Viewer.DrawPolygon(new List <float[]> { new float[] { scroll, 0 }, new float[] { scroll + VIEWPORT_W / SCALE, 0 }, new float[] { scroll + VIEWPORT_W / SCALE, VIEWPORT_H / SCALE }, new float[] { scroll, VIEWPORT_H / SCALE } }).SetColor(0.9f, 0.9f, 1.0f); foreach (var cloud_data in cloud_poly) { var poly = cloud_data.Item1; var pos_data = cloud_data.Item2; if (pos_data.y < scroll / 2) { continue; } if (pos_data.x > scroll / 2 + VIEWPORT_W / SCALE) { continue; } Viewer.DrawPolygon(poly.Select(p => new[] { p[0] + scroll / 2, p[1] }).ToList()).SetColor(1, 1, 1); } foreach (var terrain_data in terrain_poly) { var poly = terrain_data.Item1; var color = terrain_data.Item2; if (poly[1][0] < scroll) { continue; } if (poly[0][0] > scroll + VIEWPORT_W / SCALE) { continue; } Viewer.DrawPolygon(poly).SetColor(color.x, color.y, color.z); } lidar_render = (lidar_render + 1) % 100; int i = lidar_render; if (i < 2 * lidar.Length) { var l = i < lidar.Length ? lidar[i] : lidar[2 * lidar.Length - i - 1]; Viewer.DrawPolyline(new List <float[]> { new float[] { l.P1.x, l.P1.y }, new float[] { l.P2.x, l.P2.y } }).SetColor(1, 0, 0).SetLineWidth(1); } foreach (var obj in drawlist) { for (b2Fixture f = obj.GetFixtureList(); f != null; f = f.GetNext()) { var xform = f.GetBody().GetTransform(); if (f.GetShape() is b2CircleShape) { var shape = (f.GetShape() as b2CircleShape); var customData = (obj.GetUserData() as CustomBodyData); var trans = Utils.b2Mul(xform, shape.m_p); var t = new Rendering.Transform(new float[] { trans[0], trans[1] }); Viewer.DrawCircle(shape.m_radius, 30).SetColor(customData.Color1.x, customData.Color1.y, customData.Color1.z).AddAttr(t); Viewer.DrawCircle(shape.m_radius, 30, false).SetColor(customData.Color2.x, customData.Color2.y, customData.Color2.z).SetLineWidth(2).AddAttr(t); } else { var shape = f.GetShape(); var customData = (obj.GetUserData() as CustomBodyData); var path = shape.GetVertices().Select(v => { var trans = Utils.b2Mul(xform, v); return(new float[] { trans[0], trans[1] }); }).ToList(); Viewer.DrawPolygon(path).SetColor(customData.Color1.x, customData.Color1.y, customData.Color1.z); path.Add(path[0]); Viewer.DrawPolyline(path).SetColor(customData.Color2.x, customData.Color2.y, customData.Color2.z).SetLineWidth(2); } } } var flagy1 = TERRAIN_HEIGHT; var flagy2 = flagy1 + 50 / SCALE; var x = TERRAIN_STEP * 3; Viewer.DrawPolyline(new List <float[]> { new float[] { x, flagy1 }, new float[] { x, flagy2 } }).SetColor(0, 0, 0).SetLineWidth(2); var flagVert = new List <float[]> { new float[] { x, flagy2 }, new float[] { x, flagy2 - 10 / SCALE }, new float[] { x + 25 / SCALE, flagy2 - 5 / SCALE } }; Viewer.DrawPolygon(flagVert).SetColor(0.9f, 0.2f, 0); flagVert.Add(flagVert[0]); Viewer.DrawPolyline(flagVert).SetColor(0, 0, 0).SetLineWidth(2); Viewer.Render(); return(null); }
public override byte[] Render(bool toRgbArray = false) { if (Viewer == null) { Viewer = new Rendering.Viewer(VIEWPORT_W, VIEWPORT_H); Viewer.SetBounds(0, VIEWPORT_W / SCALE, 0, VIEWPORT_H / SCALE); } foreach (var obj in particles) { var data = obj.GetUserData() as CustomBodyData; data.TimeToLive -= 0.15f; data.Color1 = new b2Vec3((float)Math.Max(0.2, 0.2 + data.TimeToLive), (float)Math.Max(0.2, 0.5 * data.TimeToLive), (float)Math.Max(0.2, 0.5 * data.TimeToLive)); data.Color2 = new b2Vec3((float)Math.Max(0.2, 0.2 + data.TimeToLive), (float)Math.Max(0.2, 0.5 * data.TimeToLive), (float)Math.Max(0.2, 0.5 * data.TimeToLive)); } CleanParticles(false); foreach (var p in sky_polys) { Viewer.DrawPolygon(p).SetColor(0, 0, 0); } foreach (var obj in particles.Concat(drawlist)) { for (b2Fixture f = obj.GetFixtureList(); f != null; f = f.GetNext()) { var xform = f.GetBody().GetTransform(); if (f.GetShape() is b2CircleShape) { var shape = (f.GetShape() as b2CircleShape); var customData = (obj.GetUserData() as CustomBodyData); var trans = Utils.b2Mul(xform, shape.m_p); var t = new Rendering.Transform(new float[] { trans[0], trans[1] }); Viewer.DrawCircle(shape.m_radius, 20).SetColor(customData.Color1.x, customData.Color1.y, customData.Color1.z).AddAttr(t); Viewer.DrawCircle(shape.m_radius, 20, false).SetColor(customData.Color2.x, customData.Color2.y, customData.Color2.z).SetLineWidth(2).AddAttr(t); } else { var shape = f.GetShape(); var customData = (obj.GetUserData() as CustomBodyData); var path = shape.GetVertices().Select(v => { var trans = Utils.b2Mul(xform, v); return(new float[] { trans[0], trans[1] }); }).ToList(); Viewer.DrawPolygon(path).SetColor(customData.Color1.x, customData.Color1.y, customData.Color1.z); path.Add(path[0]); Viewer.DrawPolyline(path).SetColor(customData.Color2.x, customData.Color2.y, customData.Color2.z).SetLineWidth(2); } } } foreach (var x in new[] { helipad_x1, helipad_x2 }) { var flagy1 = helipad_y; var flagy2 = flagy1 + 50 / SCALE; Viewer.DrawPolyline(new List <float[]> { new float[] { x, flagy1 }, new float[] { x, flagy2 } }).SetColor(1, 1, 1); Viewer.DrawPolygon(new List <float[]> { new float[] { x, flagy2 }, new float[] { x, flagy2 - 10 / SCALE }, new float[] { x + 25 / SCALE, flagy2 - 5 / SCALE } }).SetColor(0.8f, 0.8f, 0); } Viewer.Render(); return(null); }