A comprehensive 2D and 3D geometry library in F# without dependencies, designed for precision engineering and computational design.
It runs on JavaScript too.
- Features
- Installation
- Quick Start
- Coordinate System
- Design Philosophy
- Usage Examples
- API Documentation
- Platform Support
- Development
- Testing
- Contributing
- License
π― 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
Add Euclid to your F# project via NuGet:
dotnet add package Euclid
Or in F# scripting:
#r "nuget: Euclid"
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
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.
- 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.
Type | 2D | 3D |
---|---|---|
Point | Pt |
Pnt |
Vector | Vc |
Vec |
Unit Vector | UnitVc |
UnitVec |
Functions are available in multiple forms:
// Static module function (lowercase)
let normalized = Vec.unitized myVector
// Instance method/property (uppercase)
let normalized = myVector.Unitized
π Full API Reference: goswinr.github.io/Euclid
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)
git clone https://github.com/goswinr/Euclid.git
cd Euclid
dotnet build
- .NET SDK 6.0 or later
- Node.js (for JavaScript testing)
Tests run on both .NET and JavaScript platforms with TypeScript verification.
cd Tests
dotnet run
cd Tests
npm install
npm test
The test suite ensures cross-platform compatibility and verifies TypeScript type definitions.
Contributions are welcome!
π See CHANGELOG.md for version history.
π¦ Euclid.Rhino - Rhino3D integration