Skip to main content

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

Project description

raygeo

PyPI CI

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))

Documentation

Full API documentation is available in the docs/ directory:

Document Description
docs/raygeo.md Top-level: Geometry, constants, types, utils
docs/geometry.md Geometry class — commands, properties, transforms
docs/path.md Path ops: splitting, contours, winding, fitting
docs/shape.md Shape primitives: arcs, beziers, circles, polygons
docs/algo.md Algorithms: clipping, fitting, Minkowski, smooth

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.9.tar.gz (164.2 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.9-cp311-abi3-win_amd64.whl (535.6 kB view details)

Uploaded CPython 3.11+Windows x86-64

raygeo-0.1.9-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (704.7 kB view details)

Uploaded CPython 3.11+manylinux: glibc 2.17+ x86-64

raygeo-0.1.9-cp311-abi3-macosx_11_0_arm64.whl (634.8 kB view details)

Uploaded CPython 3.11+macOS 11.0+ ARM64

raygeo-0.1.9-cp311-abi3-macosx_10_12_x86_64.whl (658.3 kB view details)

Uploaded CPython 3.11+macOS 10.12+ x86-64

File details

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

File metadata

  • Download URL: raygeo-0.1.9.tar.gz
  • Upload date:
  • Size: 164.2 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.9.tar.gz
Algorithm Hash digest
SHA256 a39639b91d88dba2431e19dc2a1952520425bfef7390091157b3ae75003f9ff1
MD5 f8a78f3378d7c094f7a69c21baeef1f0
BLAKE2b-256 1a037015b8bb85244e80aac7e04040d98059e2955c00c9dcf8f11c1150671e87

See more details on using hashes here.

Provenance

The following attestation bundles were made for raygeo-0.1.9.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.9-cp311-abi3-win_amd64.whl.

File metadata

  • Download URL: raygeo-0.1.9-cp311-abi3-win_amd64.whl
  • Upload date:
  • Size: 535.6 kB
  • Tags: CPython 3.11+, 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.9-cp311-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 b6ce9c5bcbbfa23d28197cb5ec66c5573ffe4daff953feb95bd17aebad1f2712
MD5 9971f150e3f6ae625369339e2d2de072
BLAKE2b-256 306f6cdc8f6de10490fcaf137dd34ba7909c48810b92319a3d8baf1f9d473d53

See more details on using hashes here.

Provenance

The following attestation bundles were made for raygeo-0.1.9-cp311-abi3-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.9-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for raygeo-0.1.9-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2bd6f60889291b7d1fbc8c32d77ff4847cfa6bc81ef1f0078d999853e1cf9480
MD5 6228e550d9231d88d1ba807b1e383b32
BLAKE2b-256 eedeb6ff570586b79d98d25d1d4761d41721cb601f9d6f79c2a721eda7e2298d

See more details on using hashes here.

Provenance

The following attestation bundles were made for raygeo-0.1.9-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_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.9-cp311-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for raygeo-0.1.9-cp311-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 16d0b7a52a105da985ed1da90e944c3553622153870b76cc2389046cdbfadf49
MD5 5f71029c8ad3913b9620960c5a50bb72
BLAKE2b-256 78e9fe7fec43a7a14c1d5448e914ed7bf5a2815fdedc4bd3f7ba33f387c72dd1

See more details on using hashes here.

Provenance

The following attestation bundles were made for raygeo-0.1.9-cp311-abi3-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.9-cp311-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for raygeo-0.1.9-cp311-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 306d23fe0b6122e9a8dfb8842c0ebd4339788c8e15541dd6435ecfa8a08cf1b8
MD5 dcc4f8ffdf9258afc8f90cf684ec9b2d
BLAKE2b-256 96e08607fd92d333b044e6e007a5fd82a43babe22f19e20fed5313a2b8151cd9

See more details on using hashes here.

Provenance

The following attestation bundles were made for raygeo-0.1.9-cp311-abi3-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