QTree 1.0.5

dotnet add package QTree --version 1.0.5                
NuGet\Install-Package QTree -Version 1.0.5                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="QTree" Version="1.0.5" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add QTree --version 1.0.5                
#r "nuget: QTree, 1.0.5"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install QTree as a Cake Addin
#addin nuget:?package=QTree&version=1.0.5

// Install QTree as a Cake Tool
#tool nuget:?package=QTree&version=1.0.5                

QTree

A simple quadtree implementation.

Example usage

Quad tree

// create the quadtree:

// this tree is faster but constrained to the initial bounds
var quadTree = new QuadTree<string>(x: 0, y: 0, width: 2000, height: 2000);

// this tree is a bit slower but has no constrictions in space
var dynamicTree = new DynamicQuadTree<string>();

// add some objects to the tree
for(var x = 0; x < 2000; x += 20)
{
    for(var y = 0; y < 2000; y += 20)
    {
        quadTree.Add(x, y, 10, 10, "whatevs");
        dynamicTree.Add(x, y, 10, 10, "whatevs");
    }
}

// find some objects
var objectsInArea = quadTree.FindNode(500, 500, 50, 50);
var otherObjectsInSameArea = dynamicTree.Add(x, y, 10, 10, "whatevs");

// remove an object
quadTree.Remove(objectsInArea[0]);
dynamicTree.Remove(objectsInArea[0]);

// clear the tree
quadTree.Clear();
dynamicTree.Clear();

Ray casting

MonoGame

Small disclaimer: In the monogame framework there is already a class called Ray which is used with Vector3, and BoundingBox. To avoid collision, the Ray class in this project is called QTreeRay inside the QTree.MonoGame namespace

// create a ray with a start point and direction
var searchStartPosition = new Vector2(100, 100);
var direction = new Vector2(.5f, .5f);
var ray = new QTreeRay(searchStartPostion, direction);

// if you want to use an angle in radians instead you can do
var rayFromRadians = new QTreeRay(searchStartPosition, 3.14f);

// and if you want the angle to be between two positions you can do
var otherPosition = new Vector2(200, 200);
var rayBetweenPositions = QTreeRay.BetweenVectors(searchStartPosition, otherPosition);

// search on the tree

qtree.RayCast(ray, (hitObject, intersection) => {
  // if you're looking for a specific object:
  if (hitObject.IsTheObjectYoureSearchingFor) {
    return RaySearchOption.STOP;
  } else {
    return RaySearchOption.CONTINUE;
  }

  // if you're looking for all objects in the path:
  if (Vector2.Distance(ray.Start, intersection) > YOUR_MAX_DISTANCE) {
    return RaySearchOption.STOP;
  } else {
    aListWhereYouPlaceAllFoundObjects.Add(hitObject);
    return RaySearchOption.CONTINUE;
  }

  // if you want to look at everything in the direction you can just continue passing CONTINUE
  return RaySearchOption.CONTINUE;
});
Not monogame
// create a ray with a start point and direction
var searchStartPosition = new Point2D(100, 100);
var direction = new PointF2D(.5f, .5f);
var ray = new Ray(searchStartPostion, direction);

// if you want to use an angle in radians instead you can do
var rayFromRadians = new Ray(searchStartPosition, 3.14f);

// and if you want the angle to be between two positions you can do
var otherPosition = new Point2D(200, 200);
var rayBetweenPositions = Ray.BetweenVectors(searchStartPosition, otherPosition);

// search on the tree

qtree.RayCast(ray, (hitObject, intersection) => {
  // if you're looking for a specific object:
  if (hitObject.IsTheObjectYoureSearchingFor) {
    return RaySearchOption.STOP;
  } else {
    return RaySearchOption.CONTINUE;
  }

  // if you're looking for all objects in the path for a set distance:
  if (Vector2.Distance(ray.Start, intersection) > YOUR_MAX_DISTANCE) {
    return RaySearchOption.STOP;
  } else {
    aListWhereYouPlaceAllFoundObjects.Add(hitObject);
    return RaySearchOption.CONTINUE;
  }

  // if you want to look at everything in the direction you can just continue passing CONTINUE
  return RaySearchOption.CONTINUE;
});
Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • net8.0

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.0.5 85 10/12/2024
1.0.4 79 10/12/2024
1.0.3 2,786 11/20/2021
1.0.1 278 11/16/2021
1.0.0 263 11/16/2021