Skip to content

goswinr/Euclid

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

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.

Related Projects

🦏 Euclid.Rhino - Rhino3D integration

License

MIT

About

A 2D and 3D geometry library for F# (and JavaScript)

Topics

Resources

License

Stars

Watchers

Forks

Contributors 2

  •  
  •  

Languages