Euclid 0.15.0

Prefix Reserved
dotnet add package Euclid --version 0.15.0
                    
NuGet\Install-Package Euclid -Version 0.15.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="Euclid" Version="0.15.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Euclid" Version="0.15.0" />
                    
Directory.Packages.props
<PackageReference Include="Euclid" />
                    
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 Euclid --version 0.15.0
                    
#r "nuget: Euclid, 0.15.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.
#addin nuget:?package=Euclid&version=0.15.0
                    
Install Euclid as a Cake Addin
#tool nuget:?package=Euclid&version=0.15.0
                    
Install Euclid as a Cake Tool

Logo

Euclid

Euclid on nuget.org Build Status Docs Build Status Test Status license code size

A comprehensive 2D and 3D geometry library in F# without dependencies, designed for precision engineering and computational design.
It runs on JavaScript too.

Table of Contents

Features

🎯 Core Geometry Types

  • Points (Pt, Pnt), Vectors (Vc, Vec), Unit Vectors (UnitVc, UnitVec)
  • Lines, Planes, Boxes, Bounding Boxes, Polylines
  • Rotations, Quaternions, 4x4 and rigid orthonormal 4x3 matrices

Key Advantages

  • Zero dependencies - lightweight and self-contained
  • Double precision - engineered for CAD/manufacturing accuracy
  • Immutable types - functional programming friendly
  • Type safety - dedicated unit vector types prevent common errors
  • Cross-platform - compiles to .NET, JavaScript, TypeScript, Rust, Python via Fable
  • Performant - All small types are structs, functions are often inline and try to minimize the allocation of intermediate objects.

🔧 Design & Manufacturing Focus

  • Optimized for design, construction, and manufacturing workflows
  • Integrates seamlessly with Rhino3D
  • Right-handed coordinate system (Z-up) matching industry standards

Installation

Add Euclid to your F# project via NuGet:

dotnet add package Euclid

Or in F# scripting:

#r "nuget: Euclid"

Quick Start

open Euclid

// Create 3D points and vectors
let point1 = Pnt(1.0, 2.0, 3.0)
let point2 = Pnt(4.0, 5.0, 6.0)
let vector = Vec(1.0, 1.0, 0.0)

// Calculate distance
let distance = Pnt.distance point1 point2

// Create and use unit vectors
let unitVec = vector.Unitized  // returns a UnitVec

// Transform with 4x4 matrix
let matrix =
    Matrix.createShear(3.0, 0, 0, 0, 0, 0)
    *** // Combine transfromations
    Matrix.createRotationZ 45

point1
|> Pnt.translate vector
|> Pnt.scale 3.0
|> Pnt.transform matrix

Coordinate System

This library uses a right-handed coordinate system with the Z-axis pointing up.

Same as in: Rhino3D, Blender, SketchUp, Revit, AutoCAD ❌ Different from: Unity, Unreal Engine, Maya

This choice aligns with industry-standard CAD and architectural software.

Design Philosophy

Points vs Vectors

  • Points (Pt, Pnt): Positions in space
  • Vectors (Vc, Vec): Directions and displacements

When a 4x4 transformation matrix is applied:

  • Points: Undergo full transformation (rotation, scaling, translation)
  • Vectors: Only rotate and scale (no translation)

This follows homogeneous coordinate conventions where vectors have w=0.

Naming Conventions

Type 2D 3D
Point Pt Pnt
Vector Vc Vec
Unit Vector UnitVc UnitVec

Function Patterns

Functions are available in multiple forms:

// Static module function (lowercase)
let normalized = Vec.unitized myVector

// Instance method/property (uppercase)
let normalized = myVector.Unitized

API Documentation

📚 Full API Reference: goswinr.github.io/Euclid

Platform Support

Thanks to Fable, Euclid can be compiled to multiple platforms:

  • .NET (Primary target)
  • JavaScript (Browser/Node.js)
  • TypeScript (Type-safe JS)
  • Rust (Systems programming)
  • Python (Data science/ML)

Development

Building from Source

git clone https://github.com/goswinr/Euclid.git
cd Euclid
dotnet build

Prerequisites

  • .NET SDK 6.0 or later
  • Node.js (for JavaScript testing)

Testing

Tests run on both .NET and JavaScript platforms with TypeScript verification.

.NET Testing

cd Tests
dotnet run

JavaScript Testing

cd Tests
npm install
npm test

The test suite ensures cross-platform compatibility and verifies TypeScript type definitions.

Contributing

Contributions are welcome!

Changelog

📋 See CHANGELOG.md for version history.

🦏 Euclid.Rhino - Rhino3D integration

License

MIT

Product Compatible and additional computed target framework versions.
.NET net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  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 was computed.  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. 
.NET Framework net472 is compatible.  net48 was computed.  net481 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 Euclid:

Package Downloads
Euclid.Rhino

Utilities to use types from Euclid in Rhino3d

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
0.15.0 153 6/14/2025
0.14.0 103 5/24/2025
0.13.0 249 3/15/2025
0.12.0 449 11/27/2024
0.11.1 482 10/1/2024
0.11.0 138 9/25/2024
0.10.0 129 9/19/2024
0.9.0 646 7/6/2024
0.8.0 358 5/2/2024
0.7.0 129 4/29/2024
0.6.1 201 2/17/2024
0.6.1-a 108 2/13/2024
0.5.0 298 1/6/2024
0.4.1 148 12/2/2023
0.4.0 137 11/28/2023
0.3.0 152 10/22/2023
0.2.1 299 2/26/2023
0.2.0 341 2/4/2023
0.1.0 317 1/21/2023
0.0.0 374 11/2/2022

### Added

* - FreeBox type
* - Matrix tests
* - add Polyline.Segment
* - add Scale and ScaleOn methods

### Changed

* - args for Box.createFromRect2D are curried now
* - Matrix rewrite