Introduction¶
The scikit-geometry
package contains a whole lot of geometric algorithms. For the moment, scikit-geometry
derives most of it’s functionality from the mature and stable Computational Geometry Algorithms Library (CGAL
) package, a collection of geometric algorithms written in C++.
Basic Geometric Types¶
We aim to cleanly encapsulate the important building blocks of a geometric library. As such we have implementations for the basic geometric types:
Point2, Point3
Segment2, Ray2, Line2, Segment3, Ray3, Line3
Vector2, Vector3
Circle2
IsoRectangle2, Bbox2
Plane3, Triangle3
Polyhedron3
All sorts of operations can be performed with these basic building blocks. For example, one can construct a new segment from two points, then test against intersection with another segment, or a line.
[1]:
import skgeom as sg
a = sg.Point2(5, 3)
b = sg.Point2(10, 8)
print(a, b)
PointC2(5, 3) PointC2(10, 8)
Now we can create a vector from two points by subtracting one from another.
[2]:
v = a - b
print(v)
VectorC2(-5, -5)
Or a segment between two points, where a
is the source and b
the target.
[3]:
s = sg.Segment2(a, b)
print(s)
Segment_2(PointC2(5, 3), PointC2(10, 8))
And a ray from a point and a vector which indicates the direction.
[4]:
r = sg.Ray2(a, v)
print(r)
RayC2(PointC2(5, 3), PointC2(-0, -2))
Finding intersections¶
It’s possible to find intersections between two geometric primitives by using the intersection function:
[5]:
a = sg.Segment2(sg.Point2(3, 5), sg.Point2(0, -2))
b = sg.Segment2(sg.Point2(5, 3), sg.Point2(-2, -2))
i = sg.intersection(a, b)
print(i)
PointC2(0.882353, 0.0588235)
Note: depending on the type of intersection, the return type could also be None
or Segment2
if there is a complete overlap between the two elements.
Drawing functions¶
We have functionality to draw some of the geometric primitives presented here.
[6]:
from skgeom.draw import draw
[7]:
draw(s)
[8]:
from random import random as r
import itertools
segments = []
for i in range(10):
segments.append(sg.Segment2(sg.Point2(r(), r()),
sg.Point2(r(), r())))
intersections = []
for s1, s2 in itertools.permutations(segments, 2):
isect = sg.intersection(s1, s2)
if isect:
intersections.append(isect)
for s in segments:
draw(s)
for i in intersections:
draw(i)
Further functionality¶
Of course, scikit-geometry comes with much more functionality.
Compute convex hulls from points
Visibility polygons from two-dimensional arrangements
Compute the Minkowski sum of two polygons
[ ]: