Examples¶
Basic Usage¶
Creating Superellipses¶
from superellipse import Superellipse
# Circle (p=2)
circle = Superellipse(p=2)
# Squircle (p=4)
squircle = Superellipse(p=4)
# Approaching rectangle (large p)
nearly_rect = Superellipse(p=32)
# Astroid (p < 1)
astroid = Superellipse(p=0.5)
# Ellipse with different axes
ellipse = Superellipse(a=2, b=1, p=2)
Sampling Points¶
import numpy as np
import matplotlib.pyplot as plt
curve = Superellipse(p=4)
# Uniform in parameter
points_uniform = curve.sample(n=100, method="uniform")
# Uniform in arc length
points_arc = curve.sample(n=100, method="arclength")
# Adaptive (more points where curvature is high)
points_adaptive = curve.sample(n=100, method="adaptive")
Curvature Analysis¶
curve = Superellipse(p=8)
t = np.linspace(0, 2*np.pi, 1000)
# Curvature at each point
kappa = curve.curvature(t)
# Curvature is highest at corners (t = 0, π/2, π, 3π/2)
print(f"Max curvature: {kappa.max():.2f}")
print(f"Min curvature: {kappa.min():.2f}")
Panel Discretization¶
For numerical methods (BIE, etc.), panel-based discretization is essential:
curve = Superellipse(p=16)
# Create panel discretization
disc = curve.panel_discretization(
panels_per_quadrant=8,
nodes_per_panel=16,
beta=8.0 # Grading parameter
)
# Access discretization data
print(f"Total nodes: {len(disc.points)}")
print(f"Points shape: {disc.points.shape}")
print(f"Normals shape: {disc.normals.shape}")
print(f"Weights shape: {disc.weights.shape}")
SVG Export¶
curve = Superellipse(a=100, b=80, p=5)
# Get SVG path data
path_d = curve.to_svg_path(n=200)
# Full SVG with svgwrite (requires: pip install superellipse[export])
curve.save_svg("output.svg", width=300, height=200)
Signed Distance Field¶
import numpy as np
curve = Superellipse(p=4)
# Create grid
x = np.linspace(-1.5, 1.5, 100)
y = np.linspace(-1.5, 1.5, 100)
X, Y = np.meshgrid(x, y)
points = np.stack([X.ravel(), Y.ravel()], axis=1)
# Compute signed distance
sdf = curve.signed_distance(points).reshape(X.shape)
# sdf < 0 inside, sdf > 0 outside, sdf = 0 on boundary