Skip to main content

A 2D/3D geometry library for CAD/CAM applications.

Project description

raygeo

A high-performance 2D/3D geometry library for Python, built in Rust with PyO3.

raygeo provides vector path construction, polygon boolean operations, curve fitting, path transformations, and geometric queries — all backed by a native Rust extension.

Installation

pip install raygeo

Requires Python 3.10+ and a compatible platform (Linux, Windows, macOS Intel, or macOS Apple Silicon). Pre-compiled wheels are available on PyPI.

Quick Start

Building Paths

The Geometry class is the core abstraction. It stores a vector path as a sequence of move, line, arc, and cubic Bezier commands:

from raygeo import Geometry

# Create a 10x10 square
g = Geometry()
g.move_to(0, 0)
g.line_to(10, 0)
g.line_to(10, 10)
g.line_to(0, 10)
g.close_path()

print(g.area())    # 100.0
print(g.rect())    # (0.0, 0.0, 10.0, 10.0)
print(g.is_closed())  # True

You can also create paths from point lists:

triangle = Geometry.from_points([(0, 0), (10, 0), (5, 8.66)])

Accessing Raw Data

Internally, geometry data is stored as an (N, 8) NumPy float64 array. Each row represents one command:

import numpy as np
from raygeo import COL_TYPE, COL_X, COL_Y, CMD_TYPE_LINE

data = g.data  # numpy array, shape (N, 8)
print(data[:, COL_X])  # all x coordinates

The 8 columns are:

Column Index Description
COL_TYPE 0 Command type (move/line/arc/bezier)
COL_X 1 X coordinate
COL_Y 2 Y coordinate
COL_Z 3 Z coordinate
COL_I / COL_C1X 4 Arc center offset X / Bezier control 1 X
COL_J / COL_C1Y 5 Arc center offset Y / Bezier control 1 Y
COL_CW / COL_C2X 6 Arc clockwise flag / Bezier control 2 X
— / COL_C2Y 7 (unused for arcs) / Bezier control 2 Y

Arcs and Bezier Curves

g = Geometry()
g.move_to(0, 0)
g.arc_to(10, 0, i=5, j=0, clockwise=False)  # semicircular arc
g.close_path()

# Bezier curves
g2 = Geometry()
g2.move_to(0, 0)
g2.bezier_to(10, 0, c1x=3, c1y=5, c2x=7, c2y=5)

# Convert arcs to Bezier curves (for non-uniform scaling)
g3 = Geometry()
g3.move_to(0, 0)
g3.arc_to_as_bezier(10, 0, i=5, j=0)
g3.upgrade_to_scalable()

Path Analysis

print(g.distance())       # total path length
print(g.area())           # signed enclosed area
print(g.rect())           # bounding box (x_min, y_min, x_max, y_max)
print(g.is_closed())      # path closure check
print(g.segments())       # split into sub-paths

# Find closest point on path
result = g.find_closest_point(5, 5)  # (segment_index, distance, (px, py))

# Point and tangent at parameter t on a segment
pos, tangent = g.get_point_and_tangent_at(segment_index=0, t=0.5)

Transformations

import numpy as np
from raygeo import Geometry

g = Geometry.from_points([(0, 0), (10, 0), (10, 10), (0, 10)])

# Offset (grow/shrink)
grown = g.grow(2.0)   # offset outward by 2 units
shrunk = g.grow(-1.0)  # offset inward by 1 unit

# Affine transform (4x4 matrix)
matrix = [
    [1, 0, 0, 5],  # translate x by 5
    [0, 1, 0, 3],  # translate y by 3
    [0, 0, 1, 0],
    [0, 0, 0, 1],
]
g.transform(matrix)

# Map geometry into a frame
mapped = g.map_to_frame(
    origin=(0, 0),
    p_width=(100, 0),
    p_height=(0, 100),
)

g.flip_x()  # negate all x coordinates
g.flip_y()  # negate all y coordinates

Contour Operations

# Split into separate closed contours
contours = g.split_into_contours()

# Split into disconnected components
components = g.split_into_components()

# Separate holes from solids
inner, outer = g.split_inner_and_outer_contours()

# Remove shared edges between sub-paths
outer_only = g.remove_inner_edges()

Polygon Operations

The shape.polygon submodule provides polygon-specific operations powered by Clipper2:

from raygeo import Geometry
from raygeo.shape.polygon import (
    get_polygon_area,
    get_polygon_bounds,
    offset_polygon,
    get_polygons_union,
    get_polygons_intersection,
    get_polygons_difference,
    is_point_inside_polygon,
    polygons_intersect,
    get_polygon_convex_hull,
)

square = [(0, 0), (10, 0), (10, 10), (0, 10)]
circle_approx = [(5 + 5 * math.cos(a), 5 + 5 * math.sin(a))
                 for a in [i * math.pi / 20 for i in range(40)]]

get_polygon_area(square)                # 100.0
get_polygon_bounds(square)              # (0.0, 0.0, 10.0, 10.0)
is_point_inside_polygon((5, 5), square) # True

# Boolean operations
union = get_polygons_union([square, circle_approx])
intersection = get_polygons_intersection([square, circle_approx])
difference = get_polygons_difference([square], [circle_approx])

# Offset
inflated = offset_polygon(square, 2.0)

# NumPy variants are also available (suffixed with _numpy)
import numpy as np
sq_np = np.array(square)
get_polygon_area(sq_np)  # also works with numpy arrays

Curve Fitting

from raygeo import Geometry

# Simplify a path
g.simplify(tolerance=0.1)

# Convert curves to line segments
g.linearize(tolerance=0.01)

# Fit arcs and beziers to linear data
g.fit_arcs(tolerance=0.5)
g.fit_curves(tolerance=0.5, beziers=True, arcs=True)

# Convert geometry to polygons
polygons = g.to_polygons(tolerance=0.01)

Self-Intersection Detection

g.has_self_intersections()          # check for self-intersections
g.intersects_with(other_geometry)   # check intersection with another geometry
g.encloses(other_geometry)          # check if this fully encloses another

Serialization

# Dump to dict (JSON-safe)
data = g.dump()

# Load from dict
g2 = Geometry.load(data)

# Pickle support (via __reduce_ex__)
import pickle
g3 = pickle.loads(pickle.dumps(g))

Submodule Reference

Module Description
raygeo Top-level module: Geometry class, constants, type aliases, utility functions
raygeo.path Path-level operations: splitting, contours, winding orders, intersection, fitting
raygeo.shape.arc Arc operations: bounds, direction, linearization, intersection tests
raygeo.shape.bezier Bezier operations: evaluation, splitting, bounds, linearization, flatness
raygeo.shape.circle Circle operations: intersections, containment tests
raygeo.shape.line Line/segment operations: intersections, closest point, distance
raygeo.shape.polygon Polygon operations: area, bounds, boolean ops, offset, transforms (Clipper2)
raygeo.shape.point Point utilities: midpoint
raygeo.shape.rect Rectangle operations: containment, intersection
raygeo.algo.clipping Line clipping against rectangles and polygons
raygeo.algo.fitting Curve fitting: circle fitting, arc conversion, primitive fitting
raygeo.algo.minkowski Minkowski sums, no-fit polygons, inner-fit polygons
raygeo.algo.simplify Ramer-Douglas-Peucker polyline simplification
raygeo.algo.smooth Gaussian smoothing and polyline resampling

Development

Prerequisites

  • Rust toolchain (via rustup)
  • Python 3.10+ with maturin and pytest:
pip install maturin pytest

Build and Test

maturin develop
pytest tests/ -v

Running Rust Tests

cargo test

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

raygeo-0.1.0.tar.gz (152.6 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

raygeo-0.1.0-cp313-cp313-win_amd64.whl (500.4 kB view details)

Uploaded CPython 3.13Windows x86-64

raygeo-0.1.0-cp313-cp313-manylinux_2_35_x86_64.whl (650.0 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.35+ x86-64

raygeo-0.1.0-cp313-cp313-macosx_11_0_arm64.whl (598.7 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

raygeo-0.1.0-cp313-cp313-macosx_10_12_x86_64.whl (619.6 kB view details)

Uploaded CPython 3.13macOS 10.12+ x86-64

File details

Details for the file raygeo-0.1.0.tar.gz.

File metadata

  • Download URL: raygeo-0.1.0.tar.gz
  • Upload date:
  • Size: 152.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for raygeo-0.1.0.tar.gz
Algorithm Hash digest
SHA256 2c6cf80f8e38efa940edec80269367ef628e25b6b3a812b7d6013629e4befbe0
MD5 663a4e9c5a188f6ab7f0d7cc3f9ddee8
BLAKE2b-256 5dcb27980b69ac5ed4e9bcb9f576d77cb1dbaa9b0bc0d85c52a0c1a7d96a5963

See more details on using hashes here.

Provenance

The following attestation bundles were made for raygeo-0.1.0.tar.gz:

Publisher: release.yml on barebaric/raygeo

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file raygeo-0.1.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: raygeo-0.1.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 500.4 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for raygeo-0.1.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 8469225b65214bd5f90b8331d6376e334a1d66adc3357aa138aea18877120f25
MD5 47eae1d2e0972c125e5f09c1da1fb75f
BLAKE2b-256 ed516f4a8f04b13fa16a6b0b5d6613e2a318ec2b034827b056df91b6c3297dbb

See more details on using hashes here.

Provenance

The following attestation bundles were made for raygeo-0.1.0-cp313-cp313-win_amd64.whl:

Publisher: release.yml on barebaric/raygeo

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file raygeo-0.1.0-cp313-cp313-manylinux_2_35_x86_64.whl.

File metadata

File hashes

Hashes for raygeo-0.1.0-cp313-cp313-manylinux_2_35_x86_64.whl
Algorithm Hash digest
SHA256 5d18a18c81bb81e3116955ab69facafdb0ecddd786f13aa55f258cd796f5670e
MD5 527d9aa5b64cf9e7476227a3b46bd65d
BLAKE2b-256 9326cd79944b6e777ffef70168224575df5328b679d880fc72f948f6d0c14260

See more details on using hashes here.

Provenance

The following attestation bundles were made for raygeo-0.1.0-cp313-cp313-manylinux_2_35_x86_64.whl:

Publisher: release.yml on barebaric/raygeo

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file raygeo-0.1.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for raygeo-0.1.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6aa9b858c615ebe4c94dc3d47bef895696017f16334fb191387e144d9ea4fc76
MD5 1d68ca8a3afeb926a6662ef3072d9086
BLAKE2b-256 64b7355a44a00bde099e334ef6ccc81f45d51e61f1ba6c6058d3ac0d18334efe

See more details on using hashes here.

Provenance

The following attestation bundles were made for raygeo-0.1.0-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: release.yml on barebaric/raygeo

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file raygeo-0.1.0-cp313-cp313-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for raygeo-0.1.0-cp313-cp313-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 85bb93d822f4100a074ed3321faab5d48a9e29fb189dc71d51bfff8b6e082621
MD5 a71ef5a0e4a9fad2b9e2b3e29ed5778f
BLAKE2b-256 21e4c46608f5b599686a5f9bf30c4e03e0a1d2de1c9756414eb00919721e0206

See more details on using hashes here.

Provenance

The following attestation bundles were made for raygeo-0.1.0-cp313-cp313-macosx_10_12_x86_64.whl:

Publisher: release.yml on barebaric/raygeo

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page