public static Point2D GetNewPosition(Point2D oldPosition, GameAngle angle, float speed) { var rad = angle.RadianValue; var result = oldPosition + new Vector2D(speed * rad.Cos(), speed * rad.Sin()); return(result); }
public static MoveDirection GetBestMoveDirection(Point2D position, GameAngle beakAngle, Point2D targetPoint) { if (position.GetDistanceSquared(targetPoint).IsZero()) { return(MoveDirection.None); } //// TODO [vmcl] Use computed MoveDirection instead of one of predefined ones var resultProxy = Tuple.Create(MoveDirection.None, float.MaxValue); foreach (var item in BasicMoveDirectionsField) { var potentialMovePoint = GetNewPosition( position, beakAngle, item, GameConstants.ChickenUnit.DefaultRectilinearSpeed); var distanceSquared = targetPoint.GetDistanceSquared(potentialMovePoint); if (distanceSquared < resultProxy.Item2) { resultProxy = Tuple.Create(item, distanceSquared); } } return(resultProxy.Item1); }
public static BeakTurn GetBestBeakTurnNormalized(Point2D position, GameAngle beakAngle, Point2D targetPoint) { var absoluteBeakTurn = GetBestBeakTurn(position, beakAngle, targetPoint); var result = NormalizeBeakTurn(absoluteBeakTurn); return(result); }
/// <summary> /// Initializes a new instance of the <see cref="ChickenElement"/> class. /// </summary> internal ChickenElement(Point2D position, GameAngle beakAngle) : base(position) { this.BeakAngle = beakAngle; _roughPrimitives = new List <ICollidablePrimitive>(1) { new CirclePrimitive(position, GameConstants.ChickenUnit.BeakOffset) } .AsReadOnly(); var defaultBeakPolygonPoints = new[] { new Point2D(position.X, position.Y - GameConstants.ChickenUnit.BeakRayOffset), new Point2D(position.X + GameConstants.ChickenUnit.BeakOffset, position.Y), new Point2D(position.X, position.Y + GameConstants.ChickenUnit.BeakRayOffset) }; var beakPolygonPoints = defaultBeakPolygonPoints.Rotate(Position, beakAngle); _primitives = new List <ICollidablePrimitive>(2) { new CirclePrimitive(position, GameConstants.ChickenUnit.BodyCircleRadius), new ConvexPolygonPrimitive(beakPolygonPoints) } .AsReadOnly(); }
public static float GetBestBeakTurn(Point2D position, GameAngle beakAngle, Point2D targetPoint) { var targetOffset = targetPoint - position; var targetAngle = GameAngle.FromRadians((float)Math.Atan2(targetOffset.Y, targetOffset.X)); var result = GetBeakTurn(beakAngle, targetAngle); return(result); }
public static GameAngle GetNewBeakAngle(GameAngle oldBeakAngle, BeakTurn beakTurn) { var beakMovement = GetBeakMovement(beakTurn); var result = oldBeakAngle + beakMovement; return(result); }
public static Vector2D GetMovement(GameAngle angle, float speed) { var rad = angle.RadianValue; var result = new Vector2D(speed * rad.Cos(), speed * rad.Sin()); return(result); }
public static AngleMovementAndPosition GetBeakMovementAndNewAngle( GameAngle oldBeakAngle, BeakTurn beakTurn) { var beakMovement = GetBeakMovement(beakTurn); var newAngle = oldBeakAngle + beakMovement; return(new AngleMovementAndPosition(beakMovement, newAngle)); }
internal void SetMovement(Vector2D movement, GameAngle beakMovement) { this.Movement = movement; this.NextPosition = this.Position + this.Movement; this.BeakMovement = beakMovement; this.NextBeakAngle = this.BeakAngle + this.BeakMovement; ResetCachedElement(); }
public static GameAngle GetBeakMovement(BeakTurn beakTurn) { if (beakTurn.Value.IsZero()) { return(GameAngle.Zero); } var degreeAngle = GameConstants.ChickenUnit.DefaultAngularSpeed * beakTurn.Value; return(GameAngle.FromDegrees(degreeAngle)); }
public static MovementAndPosition GetMovementAndNewPosition( Point2D oldPosition, GameAngle currentAngle, MoveDirection direction, float speed) { var movement = GetMovement(currentAngle, direction, speed); var newPosition = GetNewPositionInternal(oldPosition, movement); return(new MovementAndPosition(movement, newPosition)); }
internal void ResetPosition(Point2D position, GameAngle beakAngle) { this.Position = position; this.Movement = Vector2D.Zero; this.NextPosition = this.Position; this.BeakAngle = beakAngle; this.BeakMovement = GameAngle.Zero; this.NextBeakAngle = this.BeakAngle; ResetCachedElement(); }
public static Point2D GetNewPosition( Point2D oldPosition, GameAngle currentAngle, MoveDirection direction, float speed) { var movement = GetMovement(currentAngle, direction, speed); var result = GetNewPositionInternal(oldPosition, movement); return(result); }
public static Vector2D GetMovement( GameAngle currentAngle, MoveDirection direction, float speed) { if (direction.IsNone) { return(Vector2D.Zero); } var relativeAngle = Vector2D.UnitY.GetAngle(direction.NormalizedDirection); var actualAngle = currentAngle + relativeAngle; var actualSpeed = Math.Min(direction.NormalizedDirection.GetLength(), 1f) * speed; var result = GetMovement(actualAngle, actualSpeed); return(result); }
public static void PositionRandomly( [NotNull] GamePositionEventArgs eventArgs, [CanBeNull] Random randomGenerator) { #region Argument Check if (eventArgs == null) { throw new ArgumentNullException("eventArgs"); } #endregion var actualRandomGenerator = randomGenerator ?? DefaultRandomGenerator; for (var index = 0; index < eventArgs.UnitStates.Count; index++) { var unitState = eventArgs.UnitStates[index]; Point2D position; do { var nominalPosition = new Point( actualRandomGenerator.Next(eventArgs.Data.NominalSize.Width), actualRandomGenerator.Next(eventArgs.Data.NominalSize.Height)); position = GameHelper.NominalToReal(nominalPosition); }while (eventArgs.UnitStates.Take(index).Any( item => eventArgs.GetPosition(item).Position.GetDistance(position) < GameConstants.NominalCellSize)); var plainAngle = (float)Math.Floor( MathHelper.HalfRevolutionDegrees - actualRandomGenerator.NextDouble() * MathHelper.RevolutionDegrees); var angle = GameAngle.FromDegrees(plainAngle); eventArgs.SetPosition(unitState, new DirectionalPosition(position, angle)); } }
public static BeakTurn GetBeakTurnNormalized(GameAngle currentAngle, GameAngle targetAngle) { var absoluteBeakTurn = GetBeakTurn(currentAngle, targetAngle); return(NormalizeBeakTurn(absoluteBeakTurn)); }
/// <summary> /// Initializes a new instance of the <see cref="AngleMovementAndPosition"/> class. /// </summary> internal AngleMovementAndPosition(GameAngle movement, GameAngle position) : this() { this.Movement = movement; this.Position = position; }
public static Point2D GetBeakTipPosition(Point2D position, GameAngle beakAngle) { return(position .OffsetX(GameConstants.ChickenUnit.BeakOffset) .Rotate(position, beakAngle)); }
public static Vector2D GetChickenViewDirection(Point2D position, GameAngle beakAngle) { var beakTipPosition = GetBeakTipPosition(position, beakAngle); return(beakTipPosition - position); }
public static float GetBeakTurn(GameAngle currentAngle, GameAngle targetAngle) { var difference = (targetAngle - currentAngle).DegreeValue; return(difference / GameConstants.ChickenUnit.DefaultAngularSpeed); }
public static float GetDistanceToLine(Point2D point, Point2D linePoint, GameAngle lineAngle) { return(GetDistanceToLineInternal(lineAngle.ToUnitVector(), point - linePoint)); }
public static Point2D[] Rotate(this IEnumerable <Point2D> values, Point2D center, GameAngle angle) { return(Point2D.Rotate(values, center, angle)); }