Initializing 3D Canvas...

Curvature Combs & Continuity

3 min read•1 page

Porcupine Diagnostic Rules:

1. Spike Length: Exactly proportional to local curvature κ = 1 / R_osculating. 2. Inflection Zero Crossing: Spikes shrink to zero and flip to the opposite side at inflection points. 3. Smooth Comb Envelope: High-end Class-A surfacing mandates monotonic, smoothly changing comb envelopes.
python
1import numpy as np
2
3def compute_curvature_comb(curve_pts, d1_pts, d2_pts, scale=1.0):
4 """
5 Computes porcupine curvature comb for a parametric curve C(t).
6 Curvature kappa(t) = ||C' x C''|| / ||C'||^3.
7 Porcupine spikes point along unit normal n(t), with length proportional to kappa(t).
8 Inflections appear where comb passes through zero and flips sides.
9 """
10 comb_tips = []
11 for p, v1, v2 in zip(curve_pts, d1_pts, d2_pts):
12 speed = np.linalg.norm(v1)
13 if speed < 1e-6:
14 comb_tips.append(p)
15 continue
16 cross_prod = v1[0] * v2[1] - v1[1] * v2[0]
17 kappa = cross_prod / (speed ** 3)
18
19 # Unit normal
20 unit_norm = np.array([-v1[1], v1[0]]) / speed
21 spike = p + unit_norm * (kappa * scale)
22 comb_tips.append(spike)
23
24 return comb_tips

Curvature Combs (Porcupine Diagnostics): In automotive Class-A surfacing and industrial CAD, inspecting a spline curve visually is deceptively inadequate; flat spots, sudden radius jerks, and unwanted inflection wiggles remain invisible to the naked eye. A curvature comb plots needle-like spikes perpendicular to the curve with lengths strictly proportional to instantaneous curvature κ(t), ruthlessly exposing any second-derivative defects.

Comb Spike Scale
1.50
Curvature Perturbation
0.00
4 min read•1 page

Continuity Tiers:

1. G0 (Point): Curves share a common junction endpoint; angle crease remains visible. 2. G1 (Tangent): Tangent directions align; eliminates creases, but curvature jumps abruptly. 3. G2 (Curvature): Osculating circles match in radius and center; smooth zebra reflections. 4. G3 (Flow): Derivative of curvature is continuous; automotive Class-A standard.
python
1import numpy as np
2
3def classify_joint_continuity(c1_derivs, c2_derivs, tol=1e-3):
4 """
5 Classifies geometric continuity (G0, G1, G2, G3) at the junction between two curves
6 given endpoint derivatives [C(t), C'(t), C''(t), C'''(t)] at C1(1) and C2(0).
7 """
8 p1, d1, dd1, ddd1 = [np.asarray(v, dtype=float) for v in c1_derivs]
9 p2, d2, dd2, ddd2 = [np.asarray(v, dtype=float) for v in c2_derivs]
10
11 if np.linalg.norm(p1 - p2) > tol:
12 return "Discontinuous"
13 t1 = d1 / np.linalg.norm(d1)
14 t2 = d2 / np.linalg.norm(d2)
15 if np.linalg.norm(t1 - t2) > tol:
16 return "G0 (Position Only)"
17
18 # Curvature vector kappa * N = (C' x C'') x C' / ||C'||^4
19 k1 = np.cross(np.cross(d1, dd1), d1) / (np.linalg.norm(d1) ** 4)
20 k2 = np.cross(np.cross(d2, dd2), d2) / (np.linalg.norm(d2) ** 4)
21 if np.linalg.norm(k1 - k2) > tol:
22 return "G1 (Tangent Continuity)"
23
24 # Arc-length derivative of curvature d(kappa)/ds
25 dk1 = np.dot( np.cross(d1, ddd1), np.cross(d1, dd1) ) / (np.linalg.norm(d1) ** 6)
26 dk2 = np.dot( np.cross(d2, ddd2), np.cross(d2, dd2) ) / (np.linalg.norm(d2) ** 6)
27 return "G3 (Class-A Flow)" if abs(dk1 - dk2) <= tol else "G2 (Curvature Continuity)"

Geometric Continuity Hierarchy (G0 to G3): In luxury automotive styling, surface reflection lines dictate visual perceived quality. While G^0 has a sharp crease and G^1 aligns tangents,G^1 still suffers from a sudden jump in curvature, causing zebra reflection stripes to break abruptly.G^2 continuity equates the osculating radius, while G^3 Class-A surfacing smooths the rate of change of curvature to make car body reflections flow seamlessly.

Continuity Tier (0=G0, 1=G1, 2=G2, 3=G3)
2.00

Related Concepts