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; }
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); }
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); } } }
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); }
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); } }