public List <Vector2D> GetRelocatePositions(int numsectors) { List <Vector2D> positions = new List <Vector2D>(); BlockMap <BlockEntry> blockmap = CreateBlockmap(true); int margin = (int)((gridsize - sectorsize) / 2); for (int x = (int)outerleft; x < (int)outerright; x += (int)gridsize) { for (int y = (int)outertop; y > (int)outerbottom; y -= (int)gridsize) { List <BlockEntry> blocks = blockmap.GetLineBlocks( new Vector2D(x + 1, y - 1), new Vector2D(x + gridsize - 1, y - gridsize + 1) ); // The way our blockmap is built and queried we will always get exactly one block if (blocks[0].Sectors.Count == 0) { positions.Add(new Vector2D(x + margin, y - margin)); numsectors--; } if (numsectors == 0) { return(positions); } } } throw new Exception("Not enough space for control sector relocation"); }
public List <DrawnVertex> GetNewControlSectorVertices() { BlockMap <BlockEntry> blockmap = CreateBlockmap(); int margin = (int)((gridsize - sectorsize) / 2); // find position for new control sector for (int x = (int)outerleft; x < (int)outerright; x += (int)gridsize) { for (int y = (int)outertop; y > (int)outerbottom; y -= (int)gridsize) { List <BlockEntry> blocks = blockmap.GetLineBlocks( new Vector2D(x + 1, y - 1), new Vector2D(x + gridsize - 1, y - gridsize + 1) ); // The way our blockmap is built and queried we will always get exactly one block if (blocks[0].Sectors.Count == 0) { List <DrawnVertex> dv = new List <DrawnVertex>(); Point p = new Point(x + margin, y - margin); dv.Add(SectorVertex(p.X, p.Y)); dv.Add(SectorVertex(p.X + BuilderPlug.Me.ControlSectorArea.SectorSize, p.Y)); dv.Add(SectorVertex(p.X + BuilderPlug.Me.ControlSectorArea.SectorSize, p.Y - BuilderPlug.Me.ControlSectorArea.SectorSize)); dv.Add(SectorVertex(p.X, p.Y - BuilderPlug.Me.ControlSectorArea.SectorSize)); dv.Add(SectorVertex(p.X, p.Y)); return(dv); } } } throw new Exception("No space left for control sectors"); }
// This runs the check public override void Run() { Dictionary <Linedef, Linedef> donelines = new Dictionary <Linedef, Linedef>(); BlockMap <BlockEntry> blockmap = BuilderPlug.Me.ErrorCheckForm.BlockMap; int progress = 0; int stepprogress = 0; // Go for all the liendefs foreach (Linedef l in General.Map.Map.Linedefs) { // Check if not already done if (!donelines.ContainsKey(l)) { // And go for all the linedefs that could overlap List <BlockEntry> blocks = blockmap.GetLineBlocks(l.Start.Position, l.End.Position); Dictionary <Linedef, Linedef> doneblocklines = new Dictionary <Linedef, Linedef>(blocks.Count * 3); foreach (BlockEntry b in blocks) { foreach (Linedef d in b.Lines) { // Not the same line and not already checked if (!object.ReferenceEquals(l, d) && !doneblocklines.ContainsKey(d)) { double lu, du; //mxd. This can also happen. I suppose. Some people manage to do this. I dunno how, but they do... if ((l.Start.Position == d.Start.Position && l.End.Position == d.End.Position) || (l.Start.Position == d.End.Position && l.End.Position == d.Start.Position)) { SubmitResult(new ResultLineOverlapping(l, d)); donelines[d] = d; } else if (l.Line.GetIntersection(d.Line, out du, out lu)) { // Check if the lines touch. Note that I don't include 0.0 and 1.0 here because // the lines may be touching at the ends when sharing the same vertex. if (General.Map.FormatInterface.VertexDecimals > 0) //mxd { lu = Math.Round(lu, General.Map.FormatInterface.VertexDecimals); du = Math.Round(du, General.Map.FormatInterface.VertexDecimals); } if ((lu > 0.0) && (lu < 1.0) && (du > 0.0) && (du < 1.0)) { // Check if not the same sector on all sides Sector samesector = null; if (l.Front != null) { samesector = l.Front.Sector; } else if (l.Back != null) { samesector = l.Back.Sector; } else if (d.Front != null) { samesector = d.Front.Sector; } else if (d.Back != null) { samesector = d.Back.Sector; } if ((l.Front == null) || (l.Front.Sector != samesector)) { samesector = null; } else if ((l.Back == null) || (l.Back.Sector != samesector)) { samesector = null; } else if ((d.Front == null) || (d.Front.Sector != samesector)) { samesector = null; } else if ((d.Back == null) || (d.Back.Sector != samesector)) { samesector = null; } if (samesector == null) { SubmitResult(new ResultLineOverlapping(l, d)); donelines[d] = d; } } } // Checked doneblocklines.Add(d, d); } } } } // Handle thread interruption try { Thread.Sleep(0); } catch (ThreadInterruptedException) { return; } // We are making progress! if ((++progress / PROGRESS_STEP) > stepprogress) { stepprogress = (progress / PROGRESS_STEP); AddProgress(1); } } }