// Updates the robot table in GUI with new data public void updateRobotTable() { foreach (Robot robot in Program.robotList) { AForge.DoublePoint position = robot.getPosition(); int[] motorSignal = robot.getMotorSignals(); this.robotTable.Rows[robot.getID()].Cells[0].Value = robot.getID(); this.robotTable.Rows[robot.getID()].Cells[1].Value = robot.getDetected(); this.robotTable.Rows[robot.getID()].Cells[2].Value = robot.isBlocked(); this.robotTable.Rows[robot.getID()].Cells[3].Value = "(" + position.X + ", " + position.Y + ")"; this.robotTable.Rows[robot.getID()].Cells[4].Value = robot.getHeading(); this.robotTable.Rows[robot.getID()].Cells[5].Value = robot.getSpeed(); this.robotTable.Rows[robot.getID()].Cells[6].Value = String.Join(", ", motorSignal); List <Robot> neighbors = robot.getNeighbors(); string neighborsTemp = "None"; if (neighbors.Count != 0) { neighborsTemp = ""; foreach (Robot neighbor in neighbors) { neighborsTemp += neighbor.getID().ToString() + ", "; } } this.robotTable.Rows[robot.getID()].Cells[7].Value = neighborsTemp; } }
public override void calculateNextMove(AForge.DoublePoint robotPosition, double speed, AForge.DoublePoint heading, List <Robot> neighbors, out double referenceSpeed, out AForge.DoublePoint referenceHeading) { if (collisionArea != null) { calculateNextMove(collisionArea, robotPosition, speed, heading, neighbors, out referenceSpeed, out referenceHeading); } else { throw new Exception("CollisionArea is null"); } }
public override void paintStrategy(Graphics g, AForge.DoublePoint scaling) { if (collisionArea != null) { Rectangle paintRectangle = new Rectangle((int)(scaling.X * collisionArea.getX()), (int)(scaling.Y * collisionArea.getY()), (int)(scaling.X * collisionArea.getWidth()), (int)(scaling.Y * collisionArea.getHeight())); g.FillRectangle(new SolidBrush(Color.FromArgb(50, 255, 0, 0)), paintRectangle); } if (robotPosition != null && corner1 != null && corner2 != null) { g.DrawLine(new Pen(new SolidBrush(Color.Black), 2), new Point((int)(scaling.X * robotPosition.X), (int)(scaling.Y * robotPosition.Y)), new Point((int)(scaling.X * corner1.X), (int)(scaling.Y * corner1.Y))); g.DrawLine(new Pen(new SolidBrush(Color.Black), 2), new Point((int)(scaling.X * robotPosition.X), (int)(scaling.Y * robotPosition.Y)), new Point((int)(scaling.X * corner2.X), (int)(scaling.Y * corner2.Y))); } }
/* * This function firstly applies the rendevouz, and when the robots are in a certain range from each other the flocking strategy */ public override void calculateNextMove(AForge.DoublePoint robotPosition, double speed, AForge.DoublePoint heading, List <Robot> neighbors, out double referenceSpeed, out AForge.DoublePoint referenceHeading) { bool startFlocking = false; double distance; for (int i = 0; i < neighbors.Count; i++) { distance = robotPosition.DistanceTo(neighbors[i].getPosition()); if (distance < startFlockingRange) { startFlocking = true; } } if (startFlocking) { flockingStrategy.calculateNextMove(robotPosition, speed, heading, neighbors, out referenceSpeed, out referenceHeading); } else { rendevouzStrategy.calculateNextMove(robotPosition, speed, heading, neighbors, out referenceSpeed, out referenceHeading); } }
public void calculateNextMove(CollisionArea collisionArea, AForge.DoublePoint robotPosition, double speed, AForge.DoublePoint heading, List <Robot> neighbors, out double referenceSpeed, out AForge.DoublePoint referenceHeading) { bool go = true; if (ControlStrategy.isAtHeading(collisionArea, robotPosition, heading)) { int distance = collisionArea.distance2Middle(robotPosition); if (queue.Count == 0) { foreach (Robot neighbor in neighbors) { if (ControlStrategy.isAtHeading(collisionArea, neighbor.getPosition(), neighbor.getHeading())) { if (distance > collisionArea.distance2Robot(neighbor)) { queue.Add(neighbor.getID()); go = false; } } } } else { foreach (Robot neighbor in neighbors) { if (ControlStrategy.isAtHeading(collisionArea, neighbor.getPosition(), neighbor.getHeading())) { foreach (int ID in queue) { if (ID == neighbor.getID()) { go = false; break; } } } } } foreach (Robot neighbor in neighbors) { if (collisionArea.intersects(neighbor.getPosition())) { go = false; break; } } } else { queue.Clear(); } if (go) { referenceSpeed = speed; referenceHeading = heading; } else { stopStrategy.calculateNextMove(collisionArea.getNearestPoint(robotPosition), Program.robotRadius, robotPosition, speed, heading, neighbors, out referenceSpeed, out referenceHeading); } corner1 = collisionArea.getHeadingEdges(robotPosition, heading)[0]; corner2 = collisionArea.getHeadingEdges(robotPosition, heading)[1]; this.robotPosition = robotPosition; }
public static bool isPointInRectangle(AForge.DoublePoint p, RectangleF rect) => isPointInRectangle(p.X, p.Y, rect);
public override void paintStrategy(Graphics g, AForge.DoublePoint scaling) { }