Thunder.UnitsNET.Vectors.Geometry 0.5.0

There is a newer version of this package available.
See the version list below for details.
dotnet add package Thunder.UnitsNET.Vectors.Geometry --version 0.5.0
                    
NuGet\Install-Package Thunder.UnitsNET.Vectors.Geometry -Version 0.5.0
                    
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="Thunder.UnitsNET.Vectors.Geometry" Version="0.5.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Thunder.UnitsNET.Vectors.Geometry" Version="0.5.0" />
                    
Directory.Packages.props
<PackageReference Include="Thunder.UnitsNET.Vectors.Geometry" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Thunder.UnitsNET.Vectors.Geometry --version 0.5.0
                    
#r "nuget: Thunder.UnitsNET.Vectors.Geometry, 0.5.0"
                    
#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.
#:package Thunder.UnitsNET.Vectors.Geometry@0.5.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Thunder.UnitsNET.Vectors.Geometry&version=0.5.0
                    
Install as a Cake Addin
#tool nuget:?package=Thunder.UnitsNET.Vectors.Geometry&version=0.5.0
                    
Install as a Cake Tool

Thunder.UnitsNET.Vectors.Geometry

Unit-aware 2D geometry library built on Thunder.UnitsNET.Vectors. Shapes, directions, and spatial primitives where all distances are Length, all areas are Area, and all angles are Angle — dimensional errors in geometric code are impossible by construction.

Supported frameworks: net8.0, net10.0

Quick start

// dotnet add package Thunder.UnitsNET.Vectors.Geometry

using Thunder.UnitsNET.Vectors.Geometry;
using UnitsNet;

// Circle
var circle = new Circle2(LengthPoint2.FromMeters(0, 0), Radius.FromMeters(5));
bool hit = circle.Contains(LengthPoint2.FromMeters(3, 4)); // true

// Direction2 — a unit-magnitude direction
var dir = Direction2.FromDegrees(45); // North-East
var rotated = dir.Rotate(Angle.FromDegrees(90)); // North-West (135°)

// Collision manifold — penetration depth, contact normal, contact point
var a = Rectangle2.FromCenterAndSize(LengthPoint2.Origin, Length.FromMeters(2), Length.FromMeters(2));
var b = Rectangle2.FromCenterAndSize(LengthPoint2.FromMeters(1, 0), Length.FromMeters(2), Length.FromMeters(2));
if (a.TryGetManifold(b, out var manifold))
{
    Length depth = manifold.PenetrationDepth;
    Direction2 normal = manifold.ContactNormal;
    LengthPoint2 contact = manifold.ContactPoint;
}

// Raycasting
var ray = new LengthRay2(LengthPoint2.FromMeters(-10, 0), Direction2.East);
if (ray.TryIntersect(circle, out var hit2))
{
    Length distance = hit2.Distance;
    LengthPoint2 point = hit2.Point;
    Direction2 surfaceNormal = hit2.Normal;
}

// Path following
var path = new LengthPath2(new[] {
    LengthPoint2.FromMeters(0, 0),
    LengthPoint2.FromMeters(5, 0),
    LengthPoint2.FromMeters(5, 5),
});
LengthPoint2 pos = path.Evaluate(Length.FromMeters(3));   // 3 m along the path
Direction2 tangent = path.TangentAt(Length.FromMeters(3));

Primitive types

Type Description
Direction2 Unit-magnitude direction with rotation, compass constants, and angle helpers
Transform2 2D coordinate frame: position + rotation (Direction2) + scale (Ratio)
Circle2 Centre + radius; containment, tangent lines, point-on-circle
Rectangle2 Centre + dimensions + rotation; corners, area, perimeter
Triangle2 Three vertices; area (signed shoelace), centroid, containment
Ellipse2 Centre + semi-axes + rotation; area, perimeter (Ramanujan)
Arc2 Circle + start direction + signed sweep; arc length, polyline, PointAt/TangentAt parametric traversal
Sector2 Circle + two radial edges + direction; area, containment
Capsule2 Two spine endpoints + radius; area, closest-point containment
Polygon2 N-vertex polygon; area, centroid, convexity, ray-cast containment
LengthSegment2 Start + End endpoints; length, direction, closest-point projection
LengthLine2 Infinite line through a point + direction
LengthRay2 Half-line from origin in a direction
LengthPath2 Arc-length parameterised polyline with Evaluate and TangentAt

Collision detection

All shapes support TryGetManifold(other, out CollisionManifold) for every pairing:

CollisionManifold field Type Description
PenetrationDepth Length Minimum separation to resolve overlap
ContactNormal Direction2 Push direction — apply to the first shape
ContactPoint LengthPoint2 Representative contact point

Supported pairings: Circle↔Circle, Circle↔Rectangle, Circle↔Triangle, Circle↔Capsule, Circle↔Polygon, Rectangle↔Rectangle, Rectangle↔Triangle, Rectangle↔Capsule, Rectangle↔Polygon, Triangle↔Triangle, Triangle↔Capsule, Triangle↔Polygon, Capsule↔Capsule, Capsule↔Polygon, Polygon↔Polygon. All zero-heap-allocation on the hot path.

Raycasting

LengthRay2.TryIntersect(shape, out RaycastHit) for all 5 shapes:

RaycastHit field Type Description
Distance Length Distance from ray origin to hit
Point LengthPoint2 World-space contact point
Normal Direction2 Surface normal at contact

MonoGame integration

Add Thunder.UnitsNET.Vectors.Geometry.MonoGame to convert geometry types to XNA rendering primitives, and for DebugDraw extension methods that render all shapes as wireframes via SpriteBatch.


What's new in v0.5.0

Spline typesBezierCurve2 and CatmullRomSpline2 with unit-aware control points (LengthPoint2). Evaluate(Ratio t)LengthPoint2, TangentAt(Ratio t)Direction2, ToPath(resolution)LengthPath2. LengthPath2.FromCatmullRom(waypoints) factory for converting a waypoint list directly to an arc-length path.

Arc2 parametric traversalArc2.PointAt(Ratio t) and TangentAt(Ratio t) for smooth arc traversal (train-on-track style). Arc2.FromPoints(circle, start, end) infers direction and returns the shorter arc. CalculateArcPoints(n) generates a polyline approximation.

LengthVector2 dot-product and projectionsDot(LengthVector2)Area (unit-preserving), Dot(ForceVector2)Energy, Project(direction)LengthVector2, PerpendicularDot(LengthVector2)Area. No SI round-trips.

Polar constructors and dimension liftingLengthVector2.FromPolar(Radius, Angle), LengthVector2.Extend(z)LengthVector3, LengthVector3.Truncate()LengthVector2. Available in the core Thunder.UnitsNET.Vectors package.

LengthSegment2.End.Target renamed to .End (and AsRayFromStartToEnd / AsRayFromEndToStart for the ray-conversion methods). Hard rename — update call sites.

Radius unit properties.Meters, .Centimeters, .Millimeters, .Feet, .Inches, .Kilometers pass-through properties for improved discoverability.

See alsoCHANGELOG.md for full Phase 5 release notes (M27–M31.2).


What's new in v0.4.0

Collision manifoldsTryGetManifold between all 15 shape pairings. Returns penetration depth, contact normal, and contact point. Zero heap allocation.

RaycastingLengthRay2.TryIntersect for all 5 shapes. Returns distance, contact point, and surface normal. Zero heap allocation.

Path followingLengthPath2: arc-length parameterised polyline with Evaluate(Length)LengthPoint2, TangentAt(Length)Direction2, and Project(LengthPoint2) for path snapping.

DebugDraw — Draw all geometry shapes and Transform2 axes as wireframes via SpriteBatch (Geometry.MonoGame package).

Performance — All hot paths profiled and optimised. Zero allocation. Rectangle_Rectangle manifold: 1,466 ns → 124 ns (colliding, 11.8×) / 27 ns (non-colliding, 44×).

See alsoCHANGELOG.md for full Phase 4 release notes (M19–M26.2).


📖 API docs · 💻 Source

Packages in this family

NuGet Thunder.UnitsNET.Vectors — Core vector types
NuGet Thunder.UnitsNET.Vectors.MonoGame — XNA/MonoGame conversions
NuGet Thunder.UnitsNET.Vectors.Geometry — Unit-aware 2D geometry (this package)
NuGet Thunder.UnitsNET.Vectors.Geometry.MonoGame — Geometry → MonoGame
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.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on Thunder.UnitsNET.Vectors.Geometry:

Package Downloads
Thunder.UnitsNET.Vectors.Geometry.MonoGame

MonoGame/XNA integration for Thunder.UnitsNET.Vectors.Geometry. Converts unit-aware 2D geometry shapes to XNA rendering primitives with explicit scale, keeping physics and rendering units separate.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.7.0 112 5/5/2026
0.7.0-preview37 105 5/5/2026
0.7.0-preview36 97 5/5/2026
0.7.0-preview35 99 5/4/2026
0.6.0-preview34 115 4/28/2026
0.6.0-preview33 109 4/27/2026
0.6.0-preview32 114 4/27/2026
0.5.0 123 4/23/2026
0.5.0-preview31 106 4/28/2026
0.5.0-preview30 125 4/28/2026
0.5.0-preview29 112 4/28/2026
0.5.0-preview28 112 4/28/2026
0.5.0-preview27 111 4/28/2026
0.4.0 135 4/22/2026
0.4.0-preview6 118 4/20/2026
0.4.0-preview5 107 4/20/2026
0.4.0-preview4 115 4/20/2026
0.4.0-preview25 96 4/20/2026
0.4.0-preview24 110 4/20/2026
0.4.0-preview23.1 53 4/20/2026
Loading failed