Esempio n. 1
0
    /// <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;
        }
    }