/// <summary> /// add a function for each edge of this <see cref="Quad"/> to lookup the neighbors. /// for <see cref="Quad"/> objects with siblings, these will be known, but for non-sibling /// neighbors, these must be found through detection of others sharing the same edge /// </summary> private void AddNeighbors() { switch (QuadType) { case QuadType.BottomLeft: // add siblings AddNeighbor(EdgeType.Top, () => { return(Parent.GetChild(QuadType.TopLeft)); }); AddNeighbor(EdgeType.Right, () => { return(Parent.GetChild(QuadType.BottomRight)); }); // add non-siblings AddNeighbor(EdgeType.Bottom, () => { //GetParentsNeighbor(EdgeType.Bottom)?.GetChildren()?.FirstOrDefault(c => c != null && HasAnySharedEdge(c)); return(null); }); AddNeighbor(EdgeType.Left, () => { //GetParentsNeighbor(EdgeType.Left)?.GetChildren()?.FirstOrDefault(c => c != null && HasAnySharedEdge(c)); return(null); }); break; case QuadType.BottomRight: // add siblings AddNeighbor(EdgeType.Top, () => { return(Parent.GetChild(QuadType.TopRight)); }); AddNeighbor(EdgeType.Left, () => { return(Parent.GetChild(QuadType.BottomLeft)); }); // add non-siblings AddNeighbor(EdgeType.Bottom, () => { return(null); //GetParentsNeighbor(EdgeType.Bottom)?.GetChildren()?.FirstOrDefault(c => c != null && HasAnySharedEdge(c)); }); AddNeighbor(EdgeType.Right, () => { return(null); //GetParentsNeighbor(EdgeType.Right)?.GetChildren()?.FirstOrDefault(c => c != null && HasAnySharedEdge(c)); }); break; case QuadType.TopLeft: // add siblings AddNeighbor(EdgeType.Bottom, () => { return(Parent.GetChild(QuadType.BottomLeft)); }); AddNeighbor(EdgeType.Right, () => { return(Parent.GetChild(QuadType.TopRight)); }); // add non-siblings AddNeighbor(EdgeType.Top, () => { var pn = GetParentsNeighbor(EdgeType.Top); if (pn != null) { var pnc = pn.GetChildren(); if (pnc != null && pnc.Any(c => c != null)) { var pncs = pnc.FirstOrDefault(c => c != null && HasAnySharedEdge(c)); return(pncs); } } return(null); }); AddNeighbor(EdgeType.Left, () => { return(null); //GetParentsNeighbor(EdgeType.Left)?.GetChildren()?.FirstOrDefault(c => c != null && HasAnySharedEdge(c)); }); break; case QuadType.TopRight: // add siblings AddNeighbor(EdgeType.Bottom, () => { return(Parent.GetChild(QuadType.BottomRight)); }); AddNeighbor(EdgeType.Left, () => { return(Parent.GetChild(QuadType.TopLeft)); }); // add non-siblings AddNeighbor(EdgeType.Top, () => { return(null); //GetParentsNeighbor(EdgeType.Top)?.GetChildren()?.FirstOrDefault(c => c != null && HasAnySharedEdge(c)); }); AddNeighbor(EdgeType.Right, () => { return(null); //GetParentsNeighbor(EdgeType.Right)?.GetChildren()?.FirstOrDefault(c => c != null && HasAnySharedEdge(c)); }); break; } }