private void moveSelectedCellLeft() { var myCell = _simulation.Selected; if (myCell == null) { return; } var dropCell = new Cell() { Mass = myCell.Mass * .01, Velocity = new Vector2D(5, 0) }; dropCell.GenerateRadiusFromMass(); if (dropCell.Radius < 1 || myCell.Radius < 1) { return; } dropCell.Position = new Coordinate2D { X = myCell.Position.X + myCell.Radius + 1, Y = myCell.Center.Y }; myCell.DropObject(dropCell); _simulation.AddCell(dropCell); }
public virtual void MakeDecision(RealtimeSimulation simulation) { var others = simulation.Cells.Where(x => x != this); var otherSmarts = others.OfType <SmartCell>(); var otherDummys = others.Except(otherSmarts); var isAnyBiggerThanMe = others.Count(x => x.Mass > Mass) > 0; var otherBiggest = others.OrderByDescending(x => x.Mass).FirstOrDefault(); var otherSmallest = others.OrderBy(x => x.Mass).FirstOrDefault();; var otherSmalls = others.Where(x => x.Mass <Mass && x.Mass> Mass / minMassDivisor).OrderByDescending(x => x.Mass); var biggestOfOtherSmalls = otherSmalls.FirstOrDefault(); var otherBigs = others.Where(x => x.Mass > Mass).OrderByDescending(x => x.Mass); var nearestBig = others.Where(x => x.Mass > Mass).OrderBy(x => Center.Subtract(x.Center).Length).FirstOrDefault(); var nearestSmall = others.Where(x => x.Mass <Mass && x.Mass> Mass / minMassDivisor) .OrderBy(x => Center.Subtract(x.Center).Length) .ThenByDescending(x => x.Mass).FirstOrDefault(); var slowestOfOtherSmalls = otherSmalls.OrderBy(x => x.Velocity.Length).FirstOrDefault(); var fastestOfOtherSmalls = otherSmalls.OrderByDescending(x => x.Velocity.Length).FirstOrDefault(); var biggestMomentum = otherSmalls.OrderByDescending(x => x.Momentum.Length).FirstOrDefault(); switch (Character) { case CharacterType.CatchSmall: { if (!isAnyBiggerThanMe) { return; } if (biggestOfOtherSmalls == null) { return; } var vector = biggestOfOtherSmalls.Center - this.Center; var uVector1 = vector * -1; var uVector2 = biggestOfOtherSmalls.Velocity * -1; var uVector = (uVector1 + uVector2).UnitVector; if (uVector.Length == 0) { return; } var dropCell = new Cell() { Mass = this.Mass * massDivisor, Velocity = uVector * velocityMultiplier }; dropCell.GenerateRadiusFromMass(); if (dropCell.Radius < 1 || Radius < 1) { return; } caculateDropCellPosition(dropCell); DropObject(dropCell); simulation.AddCell(dropCell); } break; case CharacterType.EvadeBig: { if (!isAnyBiggerThanMe) { return; } if (nearestBig == null) { return; } var vector = nearestBig.Position - this.Position; var uVector1 = vector * 1; var uVector2 = nearestBig.Velocity * 1; var uVector = (uVector1 + uVector2).UnitVector; if (uVector.Length == 0) { return; } var dropCell = new Cell() { Mass = this.Mass * massDivisor, Velocity = uVector * velocityMultiplier }; dropCell.GenerateRadiusFromMass(); if (dropCell.Radius < 1 || Radius < 1) { return; } caculateDropCellPosition(dropCell); DropObject(dropCell); simulation.AddCell(dropCell); } break; case CharacterType.CatchNearest: { if (nearestSmall == null) { return; } if (!isAnyBiggerThanMe) { return; } var vector = nearestSmall.Position - this.Position; var uVector1 = vector * -1; var uVector2 = nearestSmall.Velocity * -1; var uVector = (uVector1 + uVector2).UnitVector; if (uVector.Length == 0) { return; } var dropCell = new Cell() { Mass = this.Mass * massDivisor, Velocity = uVector * velocityMultiplier }; dropCell.GenerateRadiusFromMass(); if (dropCell.Radius < 1 || Radius < 1) { return; } caculateDropCellPosition(dropCell); DropObject(dropCell); simulation.AddCell(dropCell); } break; case CharacterType.NoSpeed: { if (!isAnyBiggerThanMe) { return; } if (Velocity.Length < minVelocityThresold) { return; } var noSpeedMassDivider = 1 / massDivisor; var v1 = this.Velocity; var v2 = v1 * noSpeedMassDivider; var m2 = Mass / noSpeedMassDivider; var dropCell = new Cell() { Mass = m2, Velocity = v2 }; dropCell.GenerateRadiusFromMass(); if (dropCell.Radius < 1 || Radius < 1) { return; } caculateDropCellPosition(dropCell); DropObject(dropCell); simulation.AddCell(dropCell); } break; case CharacterType.CatchSmallAndEvadeBig: { if (subCharacter == CharacterType.CatchSmall) { subCharacter = CharacterType.EvadeBig; if (!isAnyBiggerThanMe) { return; } if (biggestOfOtherSmalls == null) { return; } var vector = biggestOfOtherSmalls.Center - this.Center; var uVector1 = vector * -1; var uVector2 = biggestOfOtherSmalls.Velocity * -1; var uVector = (uVector1 + uVector2).UnitVector; if (uVector.Length == 0) { return; } var dropCell = new Cell() { Mass = this.Mass * massDivisor, Velocity = uVector * velocityMultiplier }; dropCell.GenerateRadiusFromMass(); if (dropCell.Radius < 1 || Radius < 1) { return; } caculateDropCellPosition(dropCell); DropObject(dropCell); simulation.AddCell(dropCell); } else { subCharacter = CharacterType.CatchSmall; if (!isAnyBiggerThanMe) { return; } if (nearestBig == null) { return; } var vector = nearestBig.Position - this.Position; var uVector1 = vector * 1; var uVector2 = nearestBig.Velocity * 1; var uVector = (uVector1 + uVector2).UnitVector; if (uVector.Length == 0) { return; } var dropCell = new Cell() { Mass = this.Mass * massDivisor, Velocity = uVector * velocityMultiplier }; dropCell.GenerateRadiusFromMass(); if (dropCell.Radius < 1 || Radius < 1) { return; } caculateDropCellPosition(dropCell); DropObject(dropCell); simulation.AddCell(dropCell); } } break; case CharacterType.CatchNearestAndEvadeBig: { if (subCharacter == CharacterType.CatchNearest) { subCharacter = CharacterType.EvadeBig; if (nearestSmall == null) { return; } if (!isAnyBiggerThanMe) { return; } var vector = nearestSmall.Position - this.Position; var uVector1 = vector * -1; var uVector2 = nearestSmall.Velocity * -1; var uVector = (uVector1 + uVector2).UnitVector; if (uVector.Length == 0) { return; } var dropCell = new Cell() { Mass = this.Mass * massDivisor, Velocity = uVector * velocityMultiplier }; dropCell.GenerateRadiusFromMass(); if (dropCell.Radius < 1 || Radius < 1) { return; } caculateDropCellPosition(dropCell); DropObject(dropCell); simulation.AddCell(dropCell); } else { subCharacter = CharacterType.CatchNearest; if (!isAnyBiggerThanMe) { return; } if (nearestBig == null) { return; } var vector = nearestBig.Position - this.Position; var uVector1 = vector * 1; var uVector2 = nearestBig.Velocity * 1; var uVector = (uVector1 + uVector2).UnitVector; if (uVector.Length == 0) { return; } var dropCell = new Cell() { Mass = this.Mass * massDivisor, Velocity = uVector * velocityMultiplier }; dropCell.GenerateRadiusFromMass(); if (dropCell.Radius < 1 || Radius < 1) { return; } caculateDropCellPosition(dropCell); DropObject(dropCell); simulation.AddCell(dropCell); } } break; case CharacterType.CatchSlow: { if (!isAnyBiggerThanMe) { return; } if (slowestOfOtherSmalls == null) { return; } var vector = slowestOfOtherSmalls.Position - this.Position; var uVector1 = vector * -1; var uVector2 = slowestOfOtherSmalls.Velocity * -1; var uVector = (uVector1 + uVector2).UnitVector; if (uVector.Length == 0) { return; } var dropCell = new Cell() { Mass = this.Mass * massDivisor, Velocity = uVector * velocityMultiplier }; dropCell.GenerateRadiusFromMass(); if (dropCell.Radius < 1 || Radius < 1) { return; } caculateDropCellPosition(dropCell); DropObject(dropCell); simulation.AddCell(dropCell); } break; case CharacterType.CatchFast: { if (!isAnyBiggerThanMe) { return; } if (fastestOfOtherSmalls == null) { return; } var vector = fastestOfOtherSmalls.Position - this.Position; var uVector1 = vector * -1; var uVector2 = fastestOfOtherSmalls.Velocity * -1; var uVector = (uVector1 + uVector2).UnitVector; if (uVector.Length == 0) { return; } var dropCell = new Cell() { Mass = this.Mass * massDivisor, Velocity = uVector * velocityMultiplier }; dropCell.GenerateRadiusFromMass(); if (dropCell.Radius < 1 || Radius < 1) { return; } caculateDropCellPosition(dropCell); DropObject(dropCell); simulation.AddCell(dropCell); } break; case CharacterType.FollowBig: { if (!isAnyBiggerThanMe) { return; } if (otherBiggest != null) { var vector = otherBiggest.Position - this.Position; var uVector = vector.UnitVector * ((vector.Length > otherBiggest.Radius * 2) ? -1 : 1); var dropCell = new Cell() { Mass = this.Mass * massDivisor, Velocity = uVector * velocityMultiplier }; dropCell.GenerateRadiusFromMass(); if (dropCell.Radius < 1 || Radius < 1) { return; } caculateDropCellPosition(dropCell); DropObject(dropCell); simulation.AddCell(dropCell); } } break; case CharacterType.Matador: { if (!isAnyBiggerThanMe) { return; } if (nearestBig != null) { Point?ip1 = null; if (nearestBig.Velocity.Length > 0) { ip1 = Geometry.IntersectionPoint(nearestBig.Center.Point, Diagonale, nearestBig.Velocity.X, nearestBig.Velocity.Y); if (ip1 == null) { ip1 = Geometry.IntersectionPoint(nearestBig.Center.Point, InverseDiagonale, nearestBig.Velocity.X, nearestBig.Velocity.Y); } } Point?ip2 = null; if (Velocity.Length > 0) { ip2 = Geometry.IntersectionPoint(Center.Point, nearestBig.Diagonale, Velocity.X, Velocity.Y); if (ip2 == null) { ip2 = Geometry.IntersectionPoint(Center.Point, nearestBig.InverseDiagonale, Velocity.X, Velocity.Y); } } if (ip2 == null && ip1 == null) { return; } var uVector = new Vector2D(nearestBig.Velocity.Y, nearestBig.Velocity.X).UnitVector; if (ip1 == null) { uVector = new Vector2D(Velocity.Y, Velocity.X).UnitVector; } var dropCell = new Cell() { Mass = this.Mass * massDivisor, Velocity = uVector * velocityMultiplier }; dropCell.GenerateRadiusFromMass(); if (dropCell.Radius < 1 || Radius < 1) { return; } caculateDropCellPosition(dropCell); DropObject(dropCell); simulation.AddCell(dropCell); } } break; case CharacterType.CatchMomentum: { if (!isAnyBiggerThanMe) { return; } if (biggestMomentum == null) { return; } var vector = biggestMomentum.Position - this.Position; var uVector1 = vector * -1; var uVector2 = biggestMomentum.Velocity * -1; var uVector = (uVector1 + uVector2).UnitVector; if (uVector.Length == 0) { return; } var dropCell = new Cell() { Mass = this.Mass * massDivisor, Velocity = uVector * velocityMultiplier }; dropCell.GenerateRadiusFromMass(); if (dropCell.Radius < 1 || Radius < 1) { return; } caculateDropCellPosition(dropCell); DropObject(dropCell); simulation.AddCell(dropCell); } break; default: break; } }