Kernel rig: patched holes graded by their continuity, at clashing corners and in one sheet

Four continuity cases for the patch fill. A hole in one smooth sheet (a cubic Bezier profile
extruded, a square trimmed out) patched g2 and g3: every seam reaches the order, corners
included, since round the hole there is one surface. The hole a three-round corner's blend
face leaves, patched g2 and g3: exactly g1 over each whole seam, since at the hole's corners
the rounds meet each other G1 (their curvatures differ by 1/4 or 1/8 per mm) and a patch smooth
there has one curvature; the middle of each seam reaches the order (kernel test).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
jyviko
2026-10-28 22:12:09 -04:00
committed by Irakli Kourtis
parent 7d00ad78c4
commit 102cde292c
8 changed files with 614 additions and 0 deletions
@@ -0,0 +1,33 @@
{
"sources": [],
"body_count": 1,
"what": "the hole a three-round corner's blend face leaves, patched g2 (Curvature): G1 and not G2 over each whole seam, since the faces round the hole meet each other G1 at its corners",
"source": "analytic",
"method": "box 40x40x30, its vertical edge at (40,40) rounded r8, then the top edges and the arc between them rounded r4; the blend face at the corner deleted (heal false), the four-sided hole patched g2 and stitched in. At each corner of the hole two of its neighbours (the r4 rounds, the r8 round) meet along their own G1 seam, their normal curvatures there differing by 1/4 or 1/8 per mm; a patch smooth at the corner has one curvature there, so it cannot meet both, and the fill asks no more than G1 near such a corner. Each seam's worst G2 station is its end: 0.125 or 0.25 per mm. In the middle of each seam (30-70 %) the patch reaches g2 (kernel test a_corner_of_three_rounds_patched_g3_holds_the_curvature_change_a_g2_patch_does_not).",
"continuity": {
"order": "g1",
"exact": true,
"edges": [
[
34.828,
34.828,
30.0
],
[
37.657,
37.657,
26.0
],
[
38.828,
32.0,
28.828
],
[
32.0,
38.828,
28.828
]
]
}
}
@@ -0,0 +1,104 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"corner": [
0,
0,
0
],
"length": 40,
"width": 40,
"height": 30,
"body_name": "Plate"
}
},
{
"command": "solid.fillet",
"params": {
"body": "Plate",
"edges": [
[
40,
40,
15
]
],
"radius": 8
}
},
{
"command": "solid.fillet",
"params": {
"body": "Plate",
"edges": [
[
40,
20,
30
],
[
20,
40,
30
]
],
"radius": 4
}
},
{
"command": "face.delete",
"params": {
"body": "Plate",
"faces": [
[
37.79,
36.155,
28.43
]
],
"heal": false
}
},
{
"command": "surface.patch",
"params": {
"body": "Plate",
"edges": [
[
34.828,
34.828,
30.0
],
[
37.657,
37.657,
26.0
],
[
38.828,
32.0,
28.828
],
[
32.0,
38.828,
28.828
]
],
"continuity": "g2",
"body_name": "Patch"
}
},
{
"command": "surface.stitch",
"params": {
"bodies": [
"Plate",
"Patch"
]
}
}
]
}
@@ -0,0 +1,33 @@
{
"sources": [],
"body_count": 1,
"what": "the hole a three-round corner's blend face leaves, patched g3 (Curvature change): G1 and not G2 over each whole seam, since the faces round the hole meet each other G1 at its corners",
"source": "analytic",
"method": "box 40x40x30, its vertical edge at (40,40) rounded r8, then the top edges and the arc between them rounded r4; the blend face at the corner deleted (heal false), the four-sided hole patched g3 and stitched in. At each corner of the hole two of its neighbours (the r4 rounds, the r8 round) meet along their own G1 seam, their normal curvatures there differing by 1/4 or 1/8 per mm; a patch smooth at the corner has one curvature there, so it cannot meet both, and the fill asks no more than G1 near such a corner. Each seam's worst G2 station is its end: 0.125 or 0.25 per mm. In the middle of each seam (30-70 %) the patch reaches g3 (kernel test a_corner_of_three_rounds_patched_g3_holds_the_curvature_change_a_g2_patch_does_not).",
"continuity": {
"order": "g1",
"exact": true,
"edges": [
[
34.828,
34.828,
30.0
],
[
37.657,
37.657,
26.0
],
[
38.828,
32.0,
28.828
],
[
32.0,
38.828,
28.828
]
]
}
}
@@ -0,0 +1,104 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"corner": [
0,
0,
0
],
"length": 40,
"width": 40,
"height": 30,
"body_name": "Plate"
}
},
{
"command": "solid.fillet",
"params": {
"body": "Plate",
"edges": [
[
40,
40,
15
]
],
"radius": 8
}
},
{
"command": "solid.fillet",
"params": {
"body": "Plate",
"edges": [
[
40,
20,
30
],
[
20,
40,
30
]
],
"radius": 4
}
},
{
"command": "face.delete",
"params": {
"body": "Plate",
"faces": [
[
37.79,
36.155,
28.43
]
],
"heal": false
}
},
{
"command": "surface.patch",
"params": {
"body": "Plate",
"edges": [
[
34.828,
34.828,
30.0
],
[
37.657,
37.657,
26.0
],
[
38.828,
32.0,
28.828
],
[
32.0,
38.828,
28.828
]
],
"continuity": "g3",
"body_name": "Patch"
}
},
{
"command": "surface.stitch",
"params": {
"bodies": [
"Plate",
"Patch"
]
}
}
]
}
@@ -0,0 +1,32 @@
{
"sources": [],
"body_count": 1,
"what": "a square hole in one smooth sheet, patched g2 (Curvature): every seam reaches g2, corners included, since round the hole there is only the one surface and its corners ask nothing it cannot give",
"source": "invariants",
"method": "the sheet: a single-span cubic Bezier through control points (0,0), (13,8), (27,-8), (40,0) on XZ, extruded 40 as a surface; trimmed by the square x, y 12..28 swept along Z, keeping the outside. The hole's sides are two copies of the profile's middle (at y = 12 and 28) and two straight rulings (x = 12 and 28), all on the one face. Patched g2 from its four edges and stitched in. Each corner's two sides lie on the same surface, so they agree to every order and the fill holds the order asked up to the corners. Not exact: a fill may read higher where it happens to.",
"continuity": {
"order": "g2",
"edges": [
[
20,
12,
0.0
],
[
28,
20,
2.002857
],
[
20,
28,
0.0
],
[
12,
20,
-2.002857
]
]
}
}
@@ -0,0 +1,138 @@
{
"commands": [
{
"command": "sketch.create",
"params": {
"plane": "XZ"
}
},
{
"command": "sketch.spline.control_point",
"params": {
"points": [
[
0,
0
],
[
13,
8
],
[
27,
-8
],
[
40,
0
]
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "surface.extrude",
"params": {
"sketch": "Sketch1",
"curves": [
"s1"
],
"distance": 40,
"body_name": "Sheet"
}
},
{
"command": "sketch.create",
"params": {
"plane": "XY"
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
12,
12
],
[
28,
12
],
[
28,
28
],
[
12,
28
],
[
12,
12
]
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "surface.trim",
"params": {
"body": "Sheet",
"curves": {
"sketch": "Sketch2"
},
"keep": [
2,
2,
-1.044595
]
}
},
{
"command": "surface.patch",
"params": {
"body": "Sheet",
"edges": [
[
20,
12,
0.0
],
[
28,
20,
2.002857
],
[
20,
28,
0.0
],
[
12,
20,
-2.002857
]
],
"continuity": "g2",
"body_name": "Patch"
}
},
{
"command": "surface.stitch",
"params": {
"bodies": [
"Sheet",
"Patch"
]
}
}
]
}
@@ -0,0 +1,32 @@
{
"sources": [],
"body_count": 1,
"what": "a square hole in one smooth sheet, patched g3 (Curvature change): every seam reaches g3, corners included, since round the hole there is only the one surface and its corners ask nothing it cannot give",
"source": "invariants",
"method": "the sheet: a single-span cubic Bezier through control points (0,0), (13,8), (27,-8), (40,0) on XZ, extruded 40 as a surface; trimmed by the square x, y 12..28 swept along Z, keeping the outside. The hole's sides are two copies of the profile's middle (at y = 12 and 28) and two straight rulings (x = 12 and 28), all on the one face. Patched g3 from its four edges and stitched in. Each corner's two sides lie on the same surface, so they agree to every order and the fill holds the order asked up to the corners. Not exact: a fill may read higher where it happens to.",
"continuity": {
"order": "g3",
"edges": [
[
20,
12,
0.0
],
[
28,
20,
2.002857
],
[
20,
28,
0.0
],
[
12,
20,
-2.002857
]
]
}
}
@@ -0,0 +1,138 @@
{
"commands": [
{
"command": "sketch.create",
"params": {
"plane": "XZ"
}
},
{
"command": "sketch.spline.control_point",
"params": {
"points": [
[
0,
0
],
[
13,
8
],
[
27,
-8
],
[
40,
0
]
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "surface.extrude",
"params": {
"sketch": "Sketch1",
"curves": [
"s1"
],
"distance": 40,
"body_name": "Sheet"
}
},
{
"command": "sketch.create",
"params": {
"plane": "XY"
}
},
{
"command": "sketch.line",
"params": {
"points": [
[
12,
12
],
[
28,
12
],
[
28,
28
],
[
12,
28
],
[
12,
12
]
]
}
},
{
"command": "sketch.finish",
"params": {}
},
{
"command": "surface.trim",
"params": {
"body": "Sheet",
"curves": {
"sketch": "Sketch2"
},
"keep": [
2,
2,
-1.044595
]
}
},
{
"command": "surface.patch",
"params": {
"body": "Sheet",
"edges": [
[
20,
12,
0.0
],
[
28,
20,
2.002857
],
[
20,
28,
0.0
],
[
12,
20,
-2.002857
]
],
"continuity": "g3",
"body_name": "Patch"
}
},
{
"command": "surface.stitch",
"params": {
"bodies": [
"Sheet",
"Patch"
]
}
}
]
}