GeomPP
A modern C++20 geometry library for 2D and 3D spatial computation — fast, mathematically correct, thoroughly tested, and usable from C++, C# (.Net 8/9/10 or .Net Framework 4.8), and Python 3.
You may be a CAD or a Game developer using C#.Net, and you use APIs native to the platform you develop into. These native APIs are easy to get in, but may contain bugs that have not been fixed, or simply lack some functionalities. You may be a Data Scientist using Python on a GIS project, and having to import 3+ libraries, and covert from data-structure to data-structure to use it. You may be a C++ developer who wants to import a more lightweight library than those which already exist, and possibly more user friendly.
This library was born a few years ago to solve all these problems. It was recently augmented with the aim of using the most modern algorithms to solve a variety of geometrical problems.
The sources of these algorithms are to be found in several textbooks, such as
- Practical Geometry Algorithms (Danniel Sunday)
- Computational Geometry in C (Joseph O'Rourke)
- Computational Geometry (Mark de Berg, Marc van Kreveld, Mark Overmars, Otfried Schwarzkopf)
Finally, the help of AI was used to validate algorithms (bug-free, guarantee the desired big-O), bind into other languages than C++, add edge cases to achieve a high test coverage, and build documentation.
Python Bindings
Python bindings for geompp — a C++ 2D/3D geometry library.
Changelog — full release notes for every version.
Install
pip install geompp
Platform note
Pre-built wheels are available for:
| Platform | Python versions |
|---|---|
| Linux x86_64 | 3.8 · 3.9 · 3.10 · 3.11 · 3.12 · 3.13 · 3.14 |
| Windows x64 | 3.8 · 3.9 · 3.10 · 3.11 · 3.12 · 3.13 · 3.14 |
If your platform or Python version is not in the table above, pip will compile from source — you will need CMake ≥ 3.15 and a C++20-capable compiler.
Test Coverage
This is the summary of the current test coverage. More on test coverage.
| Metric | Count | Notes |
|---|---|---|
| Public methods (C++) | ~519 | Excl. ctors/dtors/operators. geompp::maths/geompp::transformations (templated/free-function, header-only) tracked separately, see test_coverage_report.md |
| C++ methods tested | ~499/519 | ~96% (1303 TEST cases, 1301 run, 2 disabled — incl. 37+17 for geompp::maths +6 for its own detail::, 30+6 for geompp::transformations (incl. TransformBuilder2D/3D::Apply), +40 direct detail::/detail::view:: tests, +39 for the polygonize()/merge()/Mesh2D/3D.Polygonize()/ConnectedMesh2D/3D.Polygonize() family, +6 T-junction regression fix, +14 for the standalone AdjacencyConformity/PolygonizationParams.conformity feature) |
| Python methods tested | 478/498 | ~96% (949 pytest cases — incl. 27+6 for geompp.maths, 24+9+6 for geompp.transformations (incl. TransformBuilder2D/3D.apply), +4 for distance_to(Point) on Polygon2D/3D/Triangle2D/3D, +19 for polygonization, +6 T-junction regression fix, +15 for AdjacencyConformity/PolygonizationParams.conformity) |
| C# methods tested | 527/606 | ~87% (1049 harness tests — incl. 24+6 for GeomPP.Maths, 23+9+6 for GeomPP.Transformations (incl. TransformBuilder2D/3D.Apply), +6 for DistanceTo(Point) on Polygon2D/3D/Triangle2D/3D, +2 for Triangle2D-Triangle2D intersection parity, +19 for polygonization, +6 T-junction regression fix, +15 for AdjacencyConformity/PolygonizationParams.Conformity) |
| Stubs (not yet impl.) | 0 | MonotonePolygon and ConstrainedDelaunay are now fully implemented (v0.18.0) |
How to use it
You can look at the test suite to see detailed usage.
A quick list of code examples per topic is provided here.
👉 Visual Documentation and Code Examples on Github
What it provides
Serialization
All primitives support:
- WKT (Well-Known Text) —
to_wkt()/from_wkt()for standard text interchange - Binary file I/O —
to_file()/from_file()for compact storage
Precision
Floating-point comparisons use a thread-local DECIMAL_PRECISION constant via AlmostEquals() methods, making the library robust against rounding errors while remaining configurable per thread.
Classes
Where not explicitely specified, both 2D and 3D variants are available for all core types:
| Primitive | Description |
|---|---|
Point |
A coordinate in space |
Vector |
Direction and magnitude |
Line |
An infinite line through two points |
Ray |
A semi-infinite line from an origin in one direction |
LineSegment |
A finite segment between two endpoints |
Polyline |
A connected chain of segments |
Triangle |
Three non-collinear points forming a closed face |
Polygon |
A closed polygon defined by an ordered list of vertices |
BBox |
Axis-aligned bounding box |
BBall |
Minimum bounding sphere (Ritter's algorithm) |
BRect2D |
Minimum oriented bounding rectangle (rotating calipers) |
BPrism3D |
Minimum oriented bounding prism (PCA + rotating calipers) |
Plane |
A flat surface in 3D defined by a point and a normal |
View2D |
A class that converts a 3D point into 2D quicker than plane |
Mesh |
A set of adjacent triangles that together make up a detailed 2D or 3D shape (a surface or a solid) |
ConnectedMesh |
This one keeps track of the neighbors of each triangle, so that going from a facet to its 0-3 neighbors is very quick |
PolyMesh |
Not just triangles, also polygons are allowed, in order to save on the number of vertices on the same planar regions of the surface |
Algorithm overview
Each class supports a consistent set of spatial operations where applicable:
- Containment — does a shape contain a given point?
- Intersection — do two shapes strike through each other, and what is the resulting geometry? Also available as the free function
find_intersections()on a free set of segments. The meaning of this operation changes from 2D to 3D — check the class docs. - Overlap — do two shapes have a portion in common, and what is the resulting geometry? Meaning changes from 2D to 3D.
- Touch — do two shapes have a point in common, and which is it? Meaning changes from 2D to 3D.
- Distance — closest distance from a point to a shape.
- Plane operations — projection of a point from 3D to 2D, and re-projection from 2D to 3D, via the
Planeclass or the fasterView2D(one of the 3 world planes XY/YZ/ZX, or a custom plane). - Interpolation / Location —
lerp(p0, p1, t)retrieves a point at parametertbetween two points (not clamped);interpolate(t)does the same along a segment or polyline; the opposite operation finds the parametertfor a point already on a shape. - Area / Perimeter / Centroid — geometric properties for closed shapes.
- Signed area — encodes orientation (clockwise vs. counter-clockwise in 2D, surface normal direction in 3D).
- Simplicity / self-intersection —
Polygon2D.is_simple()and the free functionshas_intersections(segments)(Shamos–Hoey, boolean) /find_intersections(segments)(Bentley–Ottmann, every crossing point). - Convex hull —
convex_hull(points)— Andrew's monotone chain, returns hull vertices in CCW order. - Bounding containers — tight-fitting containers around point clouds: axis-aligned bounding box, bounding ball, minimal oriented rectangle, convex hull.
- Polyline operations —
Polyline.reduce()(decimation) andPolyline.expand()(Bezier corner smoothing), or the underlying free functions (dist_decimation()/rdp_decimation()/vw_decimation(),bezier_smoothing_2(),polyline_expansion()) for a plain point list. - Polygon boolean operations —
intersection(),union(),difference(),xor()between two polygons (map-overlay method), or the free functionclip(clipper_loop, subject_loop)for raw point loops without constructing aPolygonfirst. - Point cloud operations —
principal_axes()(PCA) finds the empirical 3 directive axes of a list of points in space. - Triangulation — decomposition of a polygon into n-triangles. Four strategies:
EarClipping,EarClippingBestFit(default),MonotonePolygon(O(n log n) y-monotone sweep — check precondition withis_axis_monotone),ConstrainedDelaunay(O(n²) ear clipping + Lawson flips — boundary kept, all triangles inside, minimum angle maximized, verify within_circumcircle). Point clouds:delaunay(points)/delaunay(points, normal)— unconstrained Delaunay covering the convex hull. - Polygonization — the reverse of triangulation: merges coplanar, edge-adjacent triangles back into polygons, via
Mesh2D/3D.polygonize()/ConnectedMesh2D/3D.polygonize()or the freepolygonize(triangles, settings), under 3 strategies (PlanarBoundaryExtraction— O(n) external boundary of a triangle set,PlanarQuads— O(n) pairs of coplanar triangles into quads,HertelMehlhorn— merges coplanar triangles into convex n-gons). A related free functionmerge(polygons)welds a set of non-overlapping polygons that tile a plane (3D: grouped by plane first) into fewer, bigger polygons, including merging any of their holes that touch along the same seam. - Linear algebra (
geompp.maths) — a small fixed-size linear algebra submodule, independent of the geometry classes above:Vector2/Vector3/Vector4,Matrix2/Matrix3/Matrix4, and thesolve_gauss()/solve_cramer()system solvers forAx = b. - Affine transformations (
geompp.transformations) —translate(),rotate(),scale(),shear(),reflect()(fast, single-point, no matrix needed), and the generaltransform(primitive, matrix)for every primitive fromPoint2D/Point3DtoPolyMesh2D/PolyMesh3D. UseTransformBuilder2D/TransformBuilder3Dto fluently chain several transforms (e.g..translate(...).rotate(...).scale(...)) into a singleMatrix3/Matrix4, then apply it once with.build()/transform().
Return values are None on no-intersection, and sometimes a Point/list[LineSegment]/list[Polygon] depending on
what the operation produced — check each method's docstring for the exact shape.
Free functions
| Function | Description |
|---|---|
are_collinear(p1, p2, p3) |
Three points on the same line |
remove_consecutive_duplicates(points) |
Drop consecutive duplicate points |
remove_duplicates(points) |
Drop duplicate points |
remove_collinear(points) |
Drop collinear intermediate points |
linear_combination(points, weights) |
Weighted sum |
average(points) |
Arithmetic mean |
lerp(p0, p1, t) |
Linear interpolation between two points — P0 + t*(P1-P0), not clamped |
centroid(points[, plane]) |
Centroid of a polygon (3D: plane auto-detected if omitted) |
signed_area(points[, plane]) |
Signed area of a polygon; positive = CCW, negative = CW |
are_ccw(points[, ref_plane]) |
Counter-clockwise winding (2D or 3D) |
are_cw(points[, ref_plane]) |
Clockwise winding (2D or 3D) |
are_coplanar(points) |
List of Point3D on the same plane |
closest_world_plane_to(points) |
XY / YZ / ZX plane nearest to the point cloud |
has_intersections(segments) |
Shamos–Hoey: True if any two segments in list[LineSegment2D] cross |
find_intersections(segments) |
Bentley–Ottmann: returns list[Point2D] — every crossing point, sorted left-to-right |
convex_hull(points) |
Andrew's monotone chain: convex hull of a list[Point2D], returned in CCW order |
convex_hull(points, normal=None) |
Convex hull of a coplanar list[Point3D]; optional Vector3D normal (auto-detected if omitted) |
clip(clipper_loop, subject_loop) |
Set intersection of two point loops — list[Point2D] natively, list[Point3D] if coplanar (same map-overlay engine as Polygon.intersection()) |
dist_decimation(points, threshold) |
O(n) radial-distance point decimation |
rdp_decimation(points, threshold) |
Ramer–Douglas–Peucker point decimation |
vw_decimation(points, threshold) |
Visvalingam–Whyatt point decimation |
bezier_smoothing_2(p0, p1, p2, smoothness, min_distance|num_segments, min_segment_length=...) |
Rounds one polyline corner with a quadratic Bezier arc |
polyline_expansion(points, settings) |
Rounds every inner corner of a point list and works with either fixed number of segmens or fixed min segment length (the engine behind Polyline.expand()) |
principal_axes(points) |
PCA on a list[Point3D]: returns CoordinateFrame (.x primary, .y secondary, .z best-fit normal) |
principal_normal(points) |
Best-fit plane normal of a list[Point3D] (PCA eigenvector with smallest eigenvalue) |
principal_direction(points) |
Dominant direction of a list[Point3D] (PCA eigenvector with largest eigenvalue) |
find_extreme_points(polygon, line) |
The two polygon vertices least/greatest projected along a line's direction |
distance_to(polygon, line) |
Distance from a polygon to a line (zero if they intersect) |
tangents_to(polygon, point_or_polygon) |
PolygonTangents2D/PolygonTangents3D (.left/.right) — tangent segments to a point, or common outer tangents to another polygon |
is_axis_monotone(ring, direction) |
Returns True if the ring has at most one local max and one local min when projected onto direction — guard for triangulate with MonotonePolygon |
in_circumcircle(a, b, c, p) |
Returns True if p lies strictly inside the circumcircle of CCW triangle (a,b,c) — verify the Delaunay condition |
delaunay(points[, normal]) |
Delaunay triangulation of a list[Point2D] or list[Point3D] cloud, covering its convex hull. O(n²). Duplicates ignored; all-collinear → []; fewer than 3 points → ValueError |
triangulate(polygons, settings) |
Returns a set of adjacent triangles replacing the surface of 1+ polygons (the engine behind Polygon.triangulate() and PolyMesh.triangulate()), and with a robust input validation |
maths.solve_gauss(a, b) |
Solve Ax = b via Gaussian elimination |
maths.solve_cramer(a, b) |
Solve Ax = b via Cramer's rule; raises ValueError if a is singular |
transformations.translate(primitive, offset) |
Translate a primitive by a vector |
transformations.rotate(primitive, angle_rad[, axis]) |
Rotate about the origin — 3D takes an axis |
transformations.scale(primitive, factor | sx, sy[, sz]) |
Uniform or non-uniform scale about the origin |
transformations.shear(primitive, ...) |
Shear along one axis by a multiple of another |
transformations.reflect(primitive, normal) |
Reflect about a line/plane through the origin with the given normal |
transformations.transform(primitive, matrix) |
Apply an arbitrary Matrix3/Matrix4 (homogeneous) to any primitive from Point to PolyMesh |
Metadata
Release files for geompp 0.18.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| geompp-0.18.0.tar.gz | 108.2 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| geompp-0.18.0-cp313-cp313-win_amd64.whl | CPython 3.13 | CPython 3.13 | Windows x86-64 | Details |
| geompp-0.18.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl | CPython 3.13 | CPython 3.13 | Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 | Details |
| geompp-0.18.0-cp312-cp312-win_amd64.whl | CPython 3.12 | CPython 3.12 | Windows x86-64 | Details |
| geompp-0.18.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl | CPython 3.12 | CPython 3.12 | Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 | Details |
| geompp-0.18.0-cp311-cp311-win_amd64.whl | CPython 3.11 | CPython 3.11 | Windows x86-64 | Details |
| geompp-0.18.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl | CPython 3.11 | CPython 3.11 | Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 | Details |
| geompp-0.18.0-cp310-cp310-win_amd64.whl | CPython 3.10 | CPython 3.10 | Windows x86-64 | Details |
| geompp-0.18.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl | CPython 3.10 | CPython 3.10 | Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 | Details |
| geompp-0.18.0-cp39-cp39-win_amd64.whl | CPython 3.9 | CPython 3.9 | Windows x86-64 | Details |
| geompp-0.18.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl | CPython 3.9 | CPython 3.9 | Linux glibc 2.28+ x86-64, Linux glibc 2.27+ x86-64 | Details |
| geompp-0.18.0-cp38-cp38-win_amd64.whl | CPython 3.8 | CPython 3.8 | Windows x86-64 | Details |
| geompp-0.18.0-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl | CPython 3.8 | CPython 3.8 | Linux glibc 2.27+ x86-64, Linux glibc 2.28+ x86-64 | Details |
Total release size: 57.6 MB
Release files / geompp-0.18.0.tar.gz
| Download URL | geompp-0.18.0.tar.gz |
|---|---|
| Size | 108.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6e00f2df3b0386863f76da052d51d97c15c9f454f73c53dc201b2d2b72ba5982
|
|
BLAKE2b-256 checksum How to use checksums |
5c0bcab0c589ed01f6314c01f68fdde83f84fc7c17d03b4d19c7cce6c50074fd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / geompp-0.18.0-cp313-cp313-win_amd64.whl
| Download URL | geompp-0.18.0-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 6.2 MB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
761a51d39cc822ffdcc21a495763f74a382f21a1cd254e11f1f78ca6d9b147e4
|
|
BLAKE2b-256 checksum How to use checksums |
3ebf009206b9d00e7e1dcb2bb1d7c25bfecef22146c4ec45f3eca85edccab78c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / geompp-0.18.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | geompp-0.18.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 9.9 MB |
| Tags | CPython 3.13 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
188a66aa488e220b51cbc28d255479c60ea86cf6792a52b6ebce3ddb08541aa6
|
|
BLAKE2b-256 checksum How to use checksums |
36de22454308590cae5db4a74fb80e31d2a8593d0a5eecbe2777f99c56030b99
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / geompp-0.18.0-cp312-cp312-win_amd64.whl
| Download URL | geompp-0.18.0-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 5.2 MB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
7bf8793c857cfb239b0b9e2a24a6a0096ffcba5be36fd3e3e4d99817bf71ac73
|
|
BLAKE2b-256 checksum How to use checksums |
6a4530c0453e3b1b10736161ce498f72d13e8df76c1cf53d6f7ae42b3c5e3809
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / geompp-0.18.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | geompp-0.18.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 8.3 MB |
| Tags | CPython 3.12 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
c594dc4ce8a5bec6298178f7c85502d2b69523da4c6453a001c9e46e3c905e9d
|
|
BLAKE2b-256 checksum How to use checksums |
76ad73105cc61c09c494fc0e64f584e387b3f2bb4860b454a9bcb8808fca3baa
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / geompp-0.18.0-cp311-cp311-win_amd64.whl
| Download URL | geompp-0.18.0-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 4.3 MB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
e7298db1feb73fad7dc7e403079e1e6b715b57e7bab93c82c38ce629281acb16
|
|
BLAKE2b-256 checksum How to use checksums |
ac0e3bcf9a72d385684fd071c555a02f66b68f1d156167ca34727b5d39091194
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / geompp-0.18.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | geompp-0.18.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 6.6 MB |
| Tags | CPython 3.11 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
9ede94ba3bceaad177503e7b31b621c83ccec25a12693ffa64e15f44dde41282
|
|
BLAKE2b-256 checksum How to use checksums |
e508fd33f301d58096f705109965dc05d791870b0cbdedec538b95f67515c56a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / geompp-0.18.0-cp310-cp310-win_amd64.whl
| Download URL | geompp-0.18.0-cp310-cp310-win_amd64.whl |
|---|---|
| Size | 3.3 MB |
| Tags | CPython 3.10 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
4d9428e7c5f1956fde17677ab628aa170aa1d9305058c23245bf73f3adbc1b94
|
|
BLAKE2b-256 checksum How to use checksums |
b5a0b1a4f667b241366aaa086305299a1e9859ee6cb8ccd7e699b02d881454a8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / geompp-0.18.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | geompp-0.18.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 4.9 MB |
| Tags | CPython 3.10 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
fe60e07a788dda7fd9421117902a25a823df1c76a25b365b2bc7464c9d7db8e6
|
|
BLAKE2b-256 checksum How to use checksums |
eaefa9874e1ab33e253e2430086da4bd899179815023058583ebe856ff578d7a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / geompp-0.18.0-cp39-cp39-win_amd64.whl
| Download URL | geompp-0.18.0-cp39-cp39-win_amd64.whl |
|---|---|
| Size | 2.4 MB |
| Tags | CPython 3.9 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
a983de1ac205839601763b3d028b3a28784ae7e97f72a7d82ebf87c2d6b8e995
|
|
BLAKE2b-256 checksum How to use checksums |
244cf49c0981f96a2780ba3cac08bdddf792214db799ab8d04aea918451c52f2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / geompp-0.18.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | geompp-0.18.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 3.3 MB |
| Tags | CPython 3.9 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
5473d5da77da154bfb5eaa2a5b15fbe49dc2d5db10d504a7e342e00b5d64efc3
|
|
BLAKE2b-256 checksum How to use checksums |
8f6d467623a1d92882a7653f8594d8e3a81e2557a77ebd5462adfb582cc0b650
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / geompp-0.18.0-cp38-cp38-win_amd64.whl
| Download URL | geompp-0.18.0-cp38-cp38-win_amd64.whl |
|---|---|
| Size | 1.4 MB |
| Tags | CPython 3.8 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
471bcb8485be6537a3d567a950f6c720adc09c99b5fa3cf3f07184af0ebf99bb
|
|
BLAKE2b-256 checksum How to use checksums |
246ff11d354535efdb05ac46e2482dddff0e777816524f3b387cd53799c615a4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / geompp-0.18.0-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
| Download URL | geompp-0.18.0-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 1.7 MB |
| Tags | CPython 3.8 Linux glibc 2.27+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
117d28eb4c996b608b11cc48746d03b2914065e19d979383fa9057a44776fb07
|
|
BLAKE2b-256 checksum How to use checksums |
58a5222e4953bedfb9d6530aa115cdd67657a011d9da16f7aeba903fedec1afe
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|