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 
[ ]: