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); }