示例#1
0
        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");
        }
示例#2
0
        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);
                }
            }
        }