示例#1
0
        public Evaluator3(WorldAccessor worldAccessor, TrainingRoom room, BotTrackingStorage log, ExperimentInitArgs_Activation activation, HyperNEAT_Args hyperneatArgs = null, double maxEvalTime = 15, double?initialRandomVelocity = null)
        {
            _worldAccessor         = worldAccessor;
            _room                  = room;
            _log                   = log;
            _activation            = activation;
            _hyperneatArgs         = hyperneatArgs;
            _maxEvalTime           = maxEvalTime;
            _initialRandomVelocity = initialRandomVelocity;

            // Set distances based on room size (or take as params?, or just a percent param?)
            double roomWidth = Math1D.Min
                               (
                room.AABB.Item2.X - room.AABB.Item1.X,
                room.AABB.Item2.Y - room.AABB.Item1.Y,
                room.AABB.Item2.Z - room.AABB.Item1.Z
                               );

            // Want radius, not diameter
            _roomRadius = roomWidth / 2;

            _maxDistance2 = _roomRadius * MULT_MAXDIST2;
            _maxDistance  = _roomRadius * MULT_MAXDIST;
            _minDistance  = _roomRadius * MULT_MINDIST;
        }
示例#2
0
        public Evaluator_WeaponSpin(WorldAccessor worldAccessor, TrainingRoom room, BotTrackingStorage log, ExperimentInitArgs_Activation activation, double weaponSpeed_Min, double weaponSpeed_Max, HyperNEAT_Args hyperneatArgs = null, double maxEvalTime = 15)
        {
            _worldAccessor = worldAccessor;
            _room          = room;
            _log           = log;
            _activation    = activation;
            _hyperneatArgs = hyperneatArgs;
            _maxEvalTime   = maxEvalTime;

            // Set distances based on room size (or take as params?, or just a percent param?)
            double roomWidth = Math1D.Min
                               (
                room.AABB.Item2.X - room.AABB.Item1.X,
                room.AABB.Item2.Y - room.AABB.Item1.Y,
                room.AABB.Item2.Z - room.AABB.Item1.Z
                               );

            // Want radius, not diameter
            _roomRadius = roomWidth / 2;

            _maxDistance2 = _roomRadius * MULT_MAXDIST2;
            _maxDistance  = _roomRadius * MULT_MAXDIST;

            // Weapon Speed
            _weaponSpeed_Min  = weaponSpeed_Min;
            _weaponSpeed_Max  = weaponSpeed_Max;
            _weaponSpeed_Max2 = _weaponSpeed_Max + ((_weaponSpeed_Max - _weaponSpeed_Min) / 2);
        }
示例#3
0
        private void UpdateTiles()
        {
            const double MINSIZE = 20;

            double width  = _canvas.ActualWidth;
            double height = _canvas.ActualHeight;
            Point  center = new Point(width / 2d, height / 2d);

            double size = 100;

            //TODO: Need an extra term for the speed of zoom
            //double size = _tileSize * (_atCameraZoom / Math.Abs(_camera.Position.Z));
            //double size = _tileSize * (_atCameraZoom / Math.Pow(Math.Abs(_camera.Position.Z), _zoomPow));
            size = Math.Max(size, MINSIZE);

            size = Math1D.Min(size, width, height);     // when they zoom way in, the size grows enormous


            // params:
            // MaxSize
            // MinSize
            // MinSize at zoom --- this will be used to calculate k and b


            const double MIN = 20;
            const double MAX = 300;
            double       K   = .1;
            double       B   = 5.8;

            double zoom = Math.Abs(_camera.Position.Z);

            zoom  = (K * zoom) - B;
            size  = (MAX - MIN) / (1 + Math.Exp(zoom));
            size += MIN;



            int right = ((width - (center.X + _initialOffset.X)) / size).ToInt_Ceiling();
            int down  = ((height - (center.Y + _initialOffset.Y)) / size).ToInt_Ceiling();

            int left = -((center.X + _initialOffset.X) / size).ToInt_Ceiling();
            int up   = -((center.Y + _initialOffset.Y) / size).ToInt_Ceiling();

            //left = Math.Min(-1, left);      // when it gets really zoomed in, the up and left disappear
            //up = Math.Min(-1, up);

            UpdateTiles_Quadrant(new AxisFor(Axis.X, left, right), new AxisFor(Axis.Y, up, down), center, size);

            foreach (VectorInt existing in _rectangles.Keys.ToArray())
            {
                if (existing.X < left || existing.X > right || existing.Y < up || existing.Y > down)
                {
                    Rectangle removeRect = _rectangles[existing];
                    _canvas.Children.Remove(removeRect);
                    _rectangles.Remove(existing);
                }
            }
        }
示例#4
0
        private void ShowCircles()
        {
            _circleVisuals = null;
            grdCircles.Children.Clear();

            if (_triangles == null)
            {
                return;
            }

            _circleVisuals = new Ellipse[_triangles.Length];

            for (int cntr = 0; cntr < _circleVisuals.Length; cntr++)
            {
                _circleVisuals[cntr] = new Ellipse();

                Point3D center = _triangles[cntr].Triangle.GetCenterPoint();
                double  radius = Math1D.Min(
                    Math3D.GetClosestDistance_Line_Point(_triangles[cntr].Triangle.Point0, _triangles[cntr].Triangle.Point1 - _triangles[cntr].Triangle.Point0, center),
                    Math3D.GetClosestDistance_Line_Point(_triangles[cntr].Triangle.Point1, _triangles[cntr].Triangle.Point2 - _triangles[cntr].Triangle.Point1, center),
                    Math3D.GetClosestDistance_Line_Point(_triangles[cntr].Triangle.Point2, _triangles[cntr].Triangle.Point0 - _triangles[cntr].Triangle.Point2, center));

                //  Min is too small, but avg has overlap.  Getting an inscribed circle would be the right way, but this is just a quick tester
                //double radius = new double[] {
                //    Math3D.GetClosestDistanceBetweenPointAndLine(_triangles[cntr].Triangle.Point0, _triangles[cntr].Triangle.Point1 - _triangles[cntr].Triangle.Point0, center),
                //    Math3D.GetClosestDistanceBetweenPointAndLine(_triangles[cntr].Triangle.Point1, _triangles[cntr].Triangle.Point2 - _triangles[cntr].Triangle.Point1, center),
                //    Math3D.GetClosestDistanceBetweenPointAndLine(_triangles[cntr].Triangle.Point2, _triangles[cntr].Triangle.Point0 - _triangles[cntr].Triangle.Point2, center) }.Average();

                _circleVisuals[cntr].HorizontalAlignment = HorizontalAlignment.Left;
                _circleVisuals[cntr].VerticalAlignment   = VerticalAlignment.Top;
                _circleVisuals[cntr].Width  = radius * 2d;
                _circleVisuals[cntr].Height = radius * 2d;
                _circleVisuals[cntr].Margin = new Thickness(center.X - radius, center.Y - radius, 0, 0);

                _circleVisuals[cntr].Fill = Brushes.Transparent;

                grdCircles.Children.Add(_circleVisuals[cntr]);
            }

            grdTriangles_SizeChanged(this, null);
        }
示例#5
0
        private void ShowNearbyPreviews(Dot[] nearby, Dot dot, RayHitTestParameters cameraRay, Point center2D)
        {
            #region previews, sizes

            int dotMinSize = Math.Min(dot.PreviewSize.X, dot.PreviewSize.Y);
            int minSize    = dotMinSize;

            foreach (Dot nearDot in nearby)
            {
                EnsurePreviewGenerated(nearDot, _getPreview);

                minSize = Math1D.Min(minSize, nearDot.PreviewSize.X, nearDot.PreviewSize.Y);
            }

            double halfMin  = minSize / 2d;
            double stepDist = halfMin * .05;

            #endregion

            #region project plane

            // Get a plane that is perpendicular to the look ray
            ITriangle plane = Math3D.GetPlane(dot.Position, cameraRay.Direction);

            // Project the points onto that plane
            var nearbyOnPlane = nearby.
                                Select(o => new { Dot = o, PlanePoint = Math3D.GetClosestPoint_Plane_Point(plane, o.Position) }).
                                ToArray();

            RotateTransform3D rotate = new RotateTransform3D(new QuaternionRotation3D(Math3D.GetRotation(new DoubleVector(cameraRay.Direction, _camera.UpDirection), new DoubleVector(new Vector3D(0, 0, -1), new Vector3D(0, 1, 0)))));

            #endregion

            // Lay these previews down along the directions of the projected points
            // nearby is sorted by distance from the center image

            // Don't start counter at a distance of zero, that's just wasted steps.  Figure out what cntr to use that is the distance of the two images touching
            int startIncrement = Convert.ToInt32(Math.Floor(((dotMinSize / 2d) + halfMin) / stepDist));

            // Remember the locations of each image rect
            List <Rect> existing = new List <Rect>();
            existing.Add(new Rect(center2D.X - (dot.PreviewSize.X / 2d), center2D.Y - (dot.PreviewSize.Y / 2d), dot.PreviewSize.X, dot.PreviewSize.Y));

            foreach (var nextDot in nearbyOnPlane)
            {
                #region project dot plane

                // Get the 2D direction this sketch is from the main
                Vector direction = rotate.Transform(nextDot.PlanePoint - dot.Position).ToVector2D();

                Vector dirUnit = direction.ToUnit(true);
                if (Math2D.IsInvalid(dirUnit))
                {
                    dirUnit = Math3D.GetRandomVector_Circular_Shell(1).ToVector2D();        // sitting on top of each other, just push it in a random direction
                }
                dirUnit = new Vector(dirUnit.X, -dirUnit.Y);

                #endregion

                #region find clear space

                Point  point = new Point();
                Rect   rect  = new Rect();
                double halfX = nextDot.Dot.PreviewSize.X / 2d;
                double halfY = nextDot.Dot.PreviewSize.Y / 2d;

                // Keep walking along that direction until the rectangle doesn't intersect any existing sketches
                for (int cntr = startIncrement; cntr < 1000; cntr++)
                {
                    point = center2D + (dirUnit * (stepDist * cntr));
                    rect  = new Rect(point.X - halfX, point.Y - halfY, nextDot.Dot.PreviewSize.X, nextDot.Dot.PreviewSize.Y);

                    if (!existing.Any(o => o.IntersectsWith(rect)))
                    {
                        break;
                    }
                }

                existing.Add(rect);

                #endregion

                ShowPreview(nextDot.Dot, point);
            }
        }