public static void RemovePointFromWire(Vec2 point, Dictionary <Vec2, List <DrawableObject> > connections, List <WireLine> wires, int i) { wires[i].RemoveConnections(connections); Vec2 initialStart = wires[i].StartPoint; Vec2 initialEnd = wires[i].EndPoint; Vec2 startsEnd; Vec2 endsStart; var xpri = wires[i].IsHorizontal; if (xpri) { if (wires[i].StartPoint.X > wires[i].EndPoint.X) { startsEnd = point + new Vec2(1, 0); endsStart = point + new Vec2(-1, 0); } else { startsEnd = point + new Vec2(-1, 0); endsStart = point + new Vec2(1, 0); } } else { if (wires[i].StartPoint.Y > wires[i].EndPoint.Y) { startsEnd = point + new Vec2(0, 1); endsStart = point + new Vec2(0, -1); } else { startsEnd = point + new Vec2(0, -1); endsStart = point + new Vec2(0, 1); } } if (point == wires[i].StartPoint) { wires[i] = new WireLine(endsStart, wires[i].EndPoint, wires[i].IsHorizontal); wires[i].InsertAndAttach(wires, connections); } else if (point == wires[i].EndPoint) { wires[i] = new WireLine(wires[i].StartPoint, startsEnd, wires[i].IsHorizontal); wires[i].InsertAndAttach(wires, connections); } else { var temp = wires[i].StartPoint; wires[i] = new WireLine(endsStart, wires[i].EndPoint, wires[i].IsHorizontal); wires[i].InsertAndAttach(wires, connections); WireLine newWire = new WireLine(temp, startsEnd, xpri); wires.Add(newWire); newWire.InsertAndAttach(wires, connections); } }
/// <summary> /// Inserts wire into given list of wires, accounting for many cases such as a wire contained inside another wire, /// a wire which intersects other wires, a wire which is an extension of another wire, etc. /// At the end, it returns a list of references to the newly created wires. /// Note: The original wire this function was run on might not end up being added into the wires list depending on the case, /// so please only refer to the list of WireLines which are returned. /// </summary> public List <WireLine> InsertAndAttach(List <WireLine> wires, Dictionary <Vec2, List <DrawableObject> > connections) { List <WireLine> createdWires = new List <WireLine>(); wires.Remove(this); bool fullyContained = false; if (StartPoint == EndPoint) { //Check to see if this is a request to dot two wires together for (int i = 0; i < wires.Count; i++) { if (StartPoint.IsContainedIn(wires[i])) { WireLine wire1 = new WireLine(StartPoint, wires[i].EndPoint, wires[i].IsHorizontal); WireLine wire2 = new WireLine(wires[i].StartPoint, StartPoint, wires[i].IsHorizontal); if (wire1.StartPoint != wire1.EndPoint && wire2.StartPoint != wire2.EndPoint) { wires[i].RemoveConnections(connections); wires[i] = wire1; var new1 = wires[i].InsertAndAttach(wires, connections); wires.Add(wire2); var new2 = wires[wires.Count - 1].InsertAndAttach(wires, connections); createdWires.AddRange(new1); createdWires.AddRange(new2); } else { //Refresh wire by tapping on it wires[i].RemoveConnections(connections); createdWires.AddRange(wires[i].InsertAndAttach(wires, connections)); } return(createdWires); } } return(createdWires); } for (int i = 0; i < wires.Count; i++) { if (!MathHelper.OnLine(this, wires[i])) { //If wirestart is contained in wires[i], split wires[i] into two wires if (MathHelper.IsContainedIn(StartPoint, wires[i])) { WireLine wire1 = new WireLine(StartPoint, wires[i].EndPoint, wires[i].IsHorizontal); WireLine wire2 = new WireLine(wires[i].StartPoint, StartPoint, wires[i].IsHorizontal); //Both wires exist if (wire1.StartPoint != wire1.EndPoint && wire2.StartPoint != wire2.EndPoint) { wires[i].RemoveConnections(connections); //Temporarily add this wire as a validated wire, then split wires[i] and validate both splits //before removing the temporary wire and revalidating this AddConnections(connections); wires.Add(this); wires[i] = wire1; createdWires.AddRange(wires[i].InsertAndAttach(wires, connections)); wires.Add(wire2); createdWires.AddRange(wires[wires.Count - 1].InsertAndAttach(wires, connections)); wires.Remove(this); RemoveConnections(connections); createdWires.AddRange(this.InsertAndAttach(wires, connections)); return(createdWires); } } //If wireend is contained in wires[i], split wires[i] into two wires else if (MathHelper.IsContainedIn(EndPoint, wires[i])) { WireLine wire1 = new WireLine(EndPoint, wires[i].EndPoint, wires[i].IsHorizontal); WireLine wire2 = new WireLine(wires[i].StartPoint, EndPoint, wires[i].IsHorizontal); //Both wires exist if (wire1.StartPoint != wire1.EndPoint && wire2.StartPoint != wire2.EndPoint) { wires[i].RemoveConnections(connections); //Temporarily add this wire as a validated wire, then split wires[i] and validate both splits //before removing the temporary wire and revalidating this AddConnections(connections); wires.Add(this); wires[i] = wire1; createdWires.AddRange(wires[i].InsertAndAttach(wires, connections)); wires.Add(wire2); createdWires.AddRange(wires[wires.Count - 1].InsertAndAttach(wires, connections)); wires.Remove(this); RemoveConnections(connections); createdWires.AddRange(this.InsertAndAttach(wires, connections)); return(createdWires); } } //If wires[i].wirestart is contained in this wire, split this wire into two wires if (MathHelper.IsContainedIn(wires[i].StartPoint, this)) { WireLine wire1 = new WireLine(wires[i].StartPoint, EndPoint, IsHorizontal); WireLine wire2 = new WireLine(StartPoint, wires[i].StartPoint, IsHorizontal); //Both wires exist if (wire1.StartPoint != wire1.EndPoint && wire2.StartPoint != wire2.EndPoint) { wires.Add(wire1); createdWires.AddRange(wire1.InsertAndAttach(wires, connections)); wires.Add(wire2); createdWires.AddRange(wire2.InsertAndAttach(wires, connections)); return(createdWires); } } //If wires[i].wireend is contained in this wire, split this wire into two wires if (MathHelper.IsContainedIn(wires[i].EndPoint, this)) { WireLine wire1 = new WireLine(wires[i].EndPoint, EndPoint, IsHorizontal); WireLine wire2 = new WireLine(StartPoint, wires[i].EndPoint, IsHorizontal); //Both wires exist if (wire1.StartPoint != wire1.EndPoint && wire2.StartPoint != wire2.EndPoint) { wires.Add(wire1); createdWires.AddRange(wire1.InsertAndAttach(wires, connections)); wires.Add(wire2); createdWires.AddRange(wire2.InsertAndAttach(wires, connections)); return(createdWires); } } continue; } //Cases where an start/end point matches with the target wire if (checkMatchCases(connections, wires, i, createdWires)) { return(createdWires); } //Cases where this wire is contained in the target wire if (StartPoint.IsContainedIn(wires[i])) { //If both points of this wire are contained in the target wire if (EndPoint.IsContainedIn(wires[i])) { fullyContained = true; continue; } //Else //Create a match case Vec2 temp = StartPoint; StartPoint = wires[i].StartPoint; if (checkMatchCases(connections, wires, i, createdWires)) { return(createdWires); } StartPoint = temp; continue; } if (EndPoint.IsContainedIn(wires[i])) { //Create a match case Vec2 temp = EndPoint; EndPoint = wires[i].EndPoint; if (checkMatchCases(connections, wires, i, createdWires)) { return(createdWires); } EndPoint = temp; continue; } //Cases where the target wire is contained in this wire if (wires[i].StartPoint.IsContainedIn(this) && wires[i].EndPoint.IsContainedIn(this)) { //Split wire in two and validate both sides int startDist = MathHelper.ManhattanDistance(wires[i].StartPoint, StartPoint); int endDist = MathHelper.ManhattanDistance(wires[i].EndPoint, StartPoint); if (startDist < endDist) { WireLine toStart = new WireLine(StartPoint, wires[i].StartPoint, wires[i].IsHorizontal); WireLine toEnd = new WireLine(EndPoint, wires[i].EndPoint, wires[i].IsHorizontal); wires.Add(toStart); createdWires.AddRange(toStart.InsertAndAttach(wires, connections)); wires.Add(toEnd); createdWires.AddRange(toEnd.InsertAndAttach(wires, connections)); } else { WireLine toStart = new WireLine(EndPoint, wires[i].StartPoint, wires[i].IsHorizontal); WireLine toEnd = new WireLine(StartPoint, wires[i].EndPoint, wires[i].IsHorizontal); wires.Add(toStart); createdWires.AddRange(toStart.InsertAndAttach(wires, connections)); wires.Add(toEnd); createdWires.AddRange(toEnd.InsertAndAttach(wires, connections)); } return(createdWires); } } if (fullyContained) { return(createdWires); } wires.Add(this); wires[wires.Count - 1].AddConnections(connections); createdWires.Add(this); return(createdWires); }