Alpha-Hull#
Constructs the alpha-hull with circular arc boundaries.
The alpha-hull replaces straight edges with circular arcs of radius \(R = \frac{1}{|\alpha|}\).
Constructor#
Alpha_Hull(setpoints, alpha, n_points_per_arc=40, tol=1e-12, qhull_options=None)
Parameters:
setpoints (SetPoints): The set of points (must be 2D).
alpha (float): Alpha parameter.
\(\alpha \approx 0\): Convex hull with straight edges
\(\alpha \neq 0\): Circular arcs with radius \(R = \frac{1}{|\alpha|}\)
n_points_per_arc (int, optional): Samples per arc for rendering. Default 40.
tol (float, optional): Numerical tolerance. Default \(10^{-12}\).
qhull_options (str, optional): Qhull options. Default None.
Mathematical Definition:#
The \(\alpha\)-hull extends the \(\alpha\)-shape by replacing straight boundary edges with circular arcs.
For each boundary edge \((p, q)\) in the \(\alpha\)-shape, the \(\alpha\)-hull replaces it with a circular arc of radius \(R = \frac{1}{|\alpha|}\).
Arc construction:
Given edge \((p, q)\), the arc is part of a circle with:
Radius: \(R = \frac{1}{|\alpha|}\)
Center \(c\) satisfying: \(\|c - p\| = \|c - q\| = R\)
The center is on the perpendicular bisector of \(\overline{pq}\)
The center is located at:
where \(d = \|p - q\|\), \(h = \sqrt{R^2 - (d/2)^2}\), and \((q-p)^{\perp}\) is the perpendicular vector.
The sign \(\pm\) is chosen so the arc bulges outward from the point set.
Properties:
\(\alpha \to 0\): Reduces to convex hull (straight edges)
\(\alpha > 0\): Arcs bulge inward
\(\alpha < 0\): Arcs bulge outward
Larger \(|\alpha|\): Smaller radius, tighter fit
Provides smooth boundary representation
Attributes:
arcs (list): Sampled points for each circular arc
segments (list): Straight edge representations for analytics
Value Errors:
Raises
ValueErrorifsetpointsis not 2DRaises
ValueErrorif \(\alpha = 0\) (infinite radius)Raises
ValueErrorifn_points_per_arc < 2Raises
TypeErrorifn_points_per_arcis not an integerRaises
QhullErrorif fewer than 3 points provided
Custom Drawing#
The Alpha_Hull class overrides draw() to render circular arcs instead of straight edges.
Method:
Alpha_Hull.draw(figsize=(8, 8), ax=None, e_color='blue', e_size=2, v_size=20, **kwargs)
Parameters:
figsize (tuple): Figure size if creating new figure
ax (matplotlib.axes.Axes): Existing axes to draw on
e_color (str): Edge/arc color
e_size (float): Edge/arc line width
v_size (float): Vertex marker size
kwargs: Additional matplotlib arguments
Implementation Detail:
Instead of drawing straight lines between vertices, the draw() method:
Iterates through
self.arcsPlots each arc as a smooth curve using the sampled points
Renders vertices as scatter points
Example#
import proximitygraphs as pg
import numpy as np
theta = np.linspace(0, 2*np.pi, 200, endpoint=False)
r = 1 + 0.35*np.sin(5*theta)
x = r * np.cos(theta) + 0.05*np.random.default_rng(42).standard_normal(theta.size)
y = r * np.sin(theta) + 0.05*np.random.default_rng(43).standard_normal(theta.size)
pts = pg.SetPoints(np.column_stack([x, y]))
A01 = pg.Alpha_Hull(pts, alpha=0.1)
A05 = pg.Alpha_Hull(pts, alpha=0.5)
A20 = pg.Alpha_Hull(pts, alpha=-0.5)
graphs = [A01, A05, A10, A20]
pg.draw_grid(graphs, 2, 2, figsize=(10, 10), details=True)