Example #1
0
    private void PaintQuadtree <T> (IQuadtree <T> tree)
    {
        Vector2 center = new Vector2(tree.Region.center.x, tree.Region.center.y);

        if (tree.IsLeaf)
        {
            Gizmos.color = Color.green;
            Vector2 size = new Vector2(
                tree.Region.halfRegionSize.x * 2f,
                tree.Region.halfRegionSize.y * 2f
                );
            if (paintQuadtreeDepths)
            {
                Handles.Label(center, tree.Depth.ToString());
            }
            Gizmos.DrawWireCube(center, size);
        }
        else
        {
            for (QQuadrant quadrant = QQuadrant.NorthEast; quadrant < QQuadrant.NumberOfQuadrants; ++quadrant)
            {
                PaintQuadtree(tree.GetChild(quadrant));
            }
        }
    }
Example #2
0
        private QRegion CalculateChildRegion(QQuadrant quadrant)
        {
            QVector2D childHalfRegion = .5f * region.halfRegionSize;

            return(new QRegion(
                       CalculateChildCenter(quadrant, childHalfRegion),
                       childHalfRegion
                       ));
        }
Example #3
0
        private QVector2D CalculateChildCenter(QQuadrant quadrant, QVector2D childHalfRegion)
        {
            float xSign = (quadrant.XComponentIsPositive()) ? 1 : -1;
            float ySign = (quadrant.YComponentIsPositive()) ? 1 : -1;

            return(new QVector2D(
                       region.center.x + xSign * childHalfRegion.x,
                       region.center.y + ySign * childHalfRegion.y
                       ));
        }
Example #4
0
        public IQuadtree <T> GetChild(QQuadrant quadrant)
        {
            if (quadrant == QQuadrant.NumberOfQuadrants)
            {
                throw new System.Exception("Argument cannot be \"NumberOfRegions\"");
            }

            if (IsLeaf)
            {
                throw new System.Exception("Quadtree is leaf");
            }

            return(children[(int)quadrant]);;
        }
Example #5
0
 public static bool YComponentIsPositive(this QQuadrant quadrant)
 {
     return(quadrant == QQuadrant.NorthEast || quadrant == QQuadrant.NorthWest);
 }
Example #6
0
 public static bool XComponentIsPositive(this QQuadrant quadrant)
 {
     return(quadrant <= QQuadrant.SouthEast);
 }
Example #7
0
        [MethodImpl(MethodImplOptions.AggressiveInlining)] private QVector2D CalculateChildCenter(QQuadrant quadrant, QVector2D childHalfRegion)
        {
            float xSign = (quadrant.XComponentIsPositive()) ? 1 : -1;
            float ySign = (quadrant.YComponentIsPositive()) ? 1 : -1;

            return(new QVector2D(
                       lastPointInserted.x + xSign * childHalfRegion.x,
                       lastPointInserted.y + ySign * childHalfRegion.y
                       ));
        }
Example #8
0
        [MethodImpl(MethodImplOptions.AggressiveInlining)] private QVector2D GetQuadrantsCorner(QQuadrant quadrant)
        {
            switch (quadrant)
            {
            case QQuadrant.NorthEast:
                return(region.rightUpperCorner);

            case QQuadrant.SouthEast:
                return(region.rightLowerCorner);

            case QQuadrant.SouthWest:
                return(region.leftLowerCorner);

            case QQuadrant.NorthWest:
                return(region.leftUpperCorner);

            default:
                throw new System.Exception("This point should not be reached");
            }
        }
Example #9
0
        [MethodImpl(MethodImplOptions.AggressiveInlining)] private QVector2D CalculateChildHalfSize(QQuadrant quadrant)
        {
            QVector2D quadrantsCorner = GetQuadrantsCorner(quadrant);

            float xComponent = .5f * (Math.Max(lastPointInserted.x, quadrantsCorner.x) -
                                      Math.Min(lastPointInserted.x, quadrantsCorner.x));
            float yComponent = .5f * (Math.Max(lastPointInserted.y, quadrantsCorner.y) -
                                      Math.Min(lastPointInserted.y, quadrantsCorner.y));

            return(new QVector2D(xComponent, yComponent));
        }
Example #10
0
        [MethodImpl(MethodImplOptions.AggressiveInlining)] private QRegion CalculateChildRegion(QQuadrant quadrant)
        {
            QVector2D childHalfRegion = CalculateChildHalfSize(quadrant);

            return(new QRegion(
                       CalculateChildCenter(quadrant, childHalfRegion),
                       childHalfRegion
                       ));
        }