Пример #1
0
            public override Node Insert(LSeg l)
            {
                if (m_s == null)
                {
                    m_s = new LNode(m_o, l.Val.LineSeg.BBox.Square.Grown(l.Val.LineSeg.BBox.W * 0.01)); // grow 1%
                }
                else
                {
                    int dir = 0; // Sloppy: grow m_s (in rotating directions)
                                 // until it contains the segment.

                    while (!m_s.Contains(l.Val.LineSeg))
                    {
                        Aabb bigger, vll, vlr, vul, vur;
                        Aabb sbounds = m_s.Bounds;
                        int  c       = sbounds.ConstructNeighborsTowards(dir % 4,
                                                                         out vll, out vlr,
                                                                         out vul, out vur,
                                                                         out bigger);
                        Node nll = (c == 0) ? m_s : new LNode(m_o, vll);
                        Node nlr = (c == 1) ? m_s : new LNode(m_o, vlr);
                        Node nul = (c == 2) ? m_s : new LNode(m_o, vul);
                        Node nur = (c == 3) ? m_s : new LNode(m_o, vur);

                        dir++;

                        if (nll == null || nlr == null || nul == null || nur == null)
                        {
                            throw new Exception("Hmmm here 1");
                        }

                        if (dir > 100)
                        {
                            throw new Exception("Issues fitting " + l.Val.LineSeg + " inside " + m_s.Bounds);
                        }

                        m_s = new QNode(m_o, bigger, nll, nlr, nul, nur);
                    }
                }
                m_s = m_s.Insert(l);
                return(this);
            }