Euclid 0.15.0
Prefix Reserveddotnet add package Euclid --version 0.15.0
NuGet\Install-Package Euclid -Version 0.15.0
<PackageReference Include="Euclid" Version="0.15.0" />
<PackageVersion Include="Euclid" Version="0.15.0" />
<PackageReference Include="Euclid" />
paket add Euclid --version 0.15.0
#r "nuget: Euclid, 0.15.0"
#addin nuget:?package=Euclid&version=0.15.0
#tool nuget:?package=Euclid&version=0.15.0
Euclid
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
- Installation
- Quick Start
- Coordinate System
- Design Philosophy
- Usage Examples
- API Documentation
- Platform Support
- Development
- Testing
- Contributing
- License
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.
Related Projects
🦏 Euclid.Rhino - Rhino3D integration
License
Product | Versions 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. |
-
.NETFramework 4.7.2
- FSharp.Core (>= 6.0.7)
-
net6.0
- FSharp.Core (>= 6.0.7)
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