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)); } } }
private QRegion CalculateChildRegion(QQuadrant quadrant) { QVector2D childHalfRegion = .5f * region.halfRegionSize; return(new QRegion( CalculateChildCenter(quadrant, childHalfRegion), childHalfRegion )); }
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 )); }
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]);; }
public static bool YComponentIsPositive(this QQuadrant quadrant) { return(quadrant == QQuadrant.NorthEast || quadrant == QQuadrant.NorthWest); }
public static bool XComponentIsPositive(this QQuadrant quadrant) { return(quadrant <= QQuadrant.SouthEast); }
[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 )); }
[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"); } }
[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)); }
[MethodImpl(MethodImplOptions.AggressiveInlining)] private QRegion CalculateChildRegion(QQuadrant quadrant) { QVector2D childHalfRegion = CalculateChildHalfSize(quadrant); return(new QRegion( CalculateChildCenter(quadrant, childHalfRegion), childHalfRegion )); }