Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }
Example #4
0
        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);
        }
Example #5
0
        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);
        }
Example #6
0
        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);
        }
Example #7
0
        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);
        }