Kernel rig: the section orders, chord, circle and curvature section, on planes and against a cylinder

Eight fillet cases for the blend's cross-section by its order of contact with the faces, each
graded on its analytic volume at rel 1e-7 and its exact continuity (the order, and not the next):

- a box's top back edge chamfered 3 (G0), rounded r3 (G1) and curvature-rounded 3 (G2): the
  areas cut off the corner s^2/2, (1 - pi/4) s^2 and 113/756 s^2, the last by the default
  thumbweight's definition;
- a pipe R10 dipping into a plate, its concave edge chamfered 2 (the chord between the contacts of
  the ball SMLib rolls for that setback, radius 1), rounded r2 and curvature-rounded 2, each
  section's added area by Green's theorem along the plate, the section and the pipe's arc; the
  order-2 section is built from the faces' feet of the point at distance d from both, which on
  the pipe are not linear in d;
- a boss root curvature-rounded 2, the square corner's section revolved (Pappus);
- a variable round r1 to r5 along a box edge (rel 1e-5): the balls' envelope is a circular cone,
  and the volume is the cone's sections integrated along the edge.

Three fail today and are listed: the two curvature rounds whose faces are not a square corner of
planes (SMLib's quintic blend curve, not the order-2 section: rel 6.5e-7 and 1.2e-5) and the
variable round (great circles, not the envelope's: rel 4.8e-5). The other five pass on SMLib
7ac037e.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
jyviko
2026-10-31 14:58:18 -04:00
committed by jyviko
parent 9d4f780010
commit 922ee28f37
17 changed files with 473 additions and 0 deletions
+3
View File
@@ -16,6 +16,9 @@ cov-fillet-g2-corner-beside-a-cylinder not supported yet: the curvature fillet b
cov-fillet-g2-five-edge-apex-corner refused: the default setback is shorter than where the rounds' contact lines meet (3.5056 mm from the apex); the corner should take a setback that works
cov-fillet-g2-four-edge-apex-corner refused: the default setback is shorter than where the rounds' contact lines meet (3.9027 mm from the apex); the corner should take a setback that works
cov-fillet-g2-mixed-corner not supported yet: SMLib sets back a corner only where its edges are all convex or all concave
cov-fillet-section-curvature-boss-root-r2 the curvature round's section is SMLib's quintic blend curve, not the order-2 section: volume 26042.0901 against 26042.0732 (rel 6.5e-7)
cov-fillet-section-curvature-pipe-on-plate-r2 the curvature round's section is SMLib's quintic blend curve, not the order-2 section: volume 40255.6308 against 40256.1327 (rel 1.2e-5)
cov-fillet-variable-box-edge-1-to-5-on-its-cone the variable round's sections are the balls' great circles, not the circles their envelope touches them along: volume 11955.6466 against 11956.2224 (rel 4.8e-5)
report-drafted-peg-front-and-concave-rounds-together-r2 not supported yet: SMLib refuses the corner where the drafted front top edge runs tangent into the concave arc (on the cone) as of no kind its blend corners take
report-fillet-concave-arc-and-front-top-edge-together-r5-solver-residues the corner patch where the convex and concave rounds meet stands 0.128 out of the front face (box y min -0.0699 against 0.0579)
report-fillet-concave-arc-and-front-top-edge-together-r7-solver-residues the corner patch where the convex and concave rounds meet stands 0.230 out of the front face (box y min -0.1723 against 0.0579)
@@ -0,0 +1,28 @@
{
"sources": [],
"what": "a box's top back edge chamfered 3: the chord between the faces' contact lines, a crease with each face",
"source": "analytic",
"method": "box 40x30x20, the top back edge (y = 30, z = 20, 40 long) between the planar end faces x = 0 and 40, set back s = 3 along both faces (square to each other): the chord cuts s^2/2 = 4.5 off the corner: V = 24000 - 40 * 4.5 = 23820. Faces 7; both seams of the chamfer with the faces G0, and not G1 (45 degrees).",
"body_count": 1,
"volume_mm3": 23820.0,
"faces": 7,
"bbox": {
"min": [
0,
0,
0
],
"max": [
40,
30,
20
]
},
"continuity": {
"order": "g0",
"exact": true
},
"tolerance": {
"rel": 1e-07
}
}
@@ -0,0 +1,26 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 40,
"width": 30,
"height": 20,
"body_name": "Part"
}
},
{
"command": "solid.chamfer",
"params": {
"distance": 3,
"edges": [
[
20,
30,
20
]
]
}
}
]
}
@@ -0,0 +1,15 @@
{
"sources": [],
"what": "the concave edge where a pipe dips into a plate chamfered 2: the chord between the contact lines on the plane and on the pipe",
"source": "analytic",
"method": "plate 60x40x10 (z 0..10) joined to a pipe R10 along x (0..60) whose axis is at (y, z) = (20, 16): the pipe dips 4 into the plate and leaves it along y = 20 +- 8, z = 10, the edges ending on the planar faces x = 0 and 60. V0 = 24000 + 60 (100 pi - (100 acos 0.6 - 48)) = 40165.7846. The concave edge y = 28: in a plane x = const, the point at distance d from both faces is (20 + g, 10 + d), g = sqrt(64 + 32 d); its feet are F1 = (20 + g, 10) on the plate and F2 = (20 + 10 g / (10 + d), 26 - 160 / (10 + d)) on the pipe. The chamfer 2 back from the edge rolls the ball of radius 2 sqrt((1 - c) / (1 + c)) = 1 (c = 0.6, the cosine between the faces' directions (1, 0) and (0.6, 0.8) away from the edge): the chord between F1(1) = (29.797959, 10) and F2(1) = (28.907235, 11.454545) adds the area between it, the plate and the pipe (Green's theorem along the plate, the chord and the pipe's arc) 1.265531: V = 40165.7846 + 60 * 1.265531 = 40241.7165. Both seams G0.",
"body_count": 1,
"volume_mm3": 40241.7164766411,
"continuity": {
"order": "g0",
"exact": true
},
"tolerance": {
"rel": 1e-07
}
}
@@ -0,0 +1,47 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 60,
"width": 40,
"height": 10,
"body_name": "Plate"
}
},
{
"command": "solid.cylinder",
"params": {
"radius": 10,
"height": 60,
"base": [
0,
20,
16
],
"axis": [
1,
0,
0
],
"operation": "join",
"targets": [
"Plate"
]
}
},
{
"command": "solid.chamfer",
"params": {
"distance": 2,
"edges": [
[
30,
28,
10
]
]
}
}
]
}
@@ -0,0 +1,16 @@
{
"sources": [],
"what": "the root circle of a boss R8 on a plate rounded curvature-continuous size 2: the order-2 section revolved",
"source": "analytic",
"method": "plate 60x40x10 with a boss R8 x 10 at (30, 20): V0 = 24000 + 640 pi = 26010.6193. In each meridian plane (rho, z) the plate's top and the boss's wall are the lines z = 10 and rho = 8, the feet of the point at distance d from both (8 + d, 10) and (8, 10 + d): the order-2 section at the default thumbweight is that of a square corner (cov-fillet-section-curvature-box-edge-r3), area 113/756 s^2 = 0.597884 (s = 2), first moment about the wall 0.222979 (Green's theorem on the section), revolved (Pappus): 2 pi (8 A + M) = 31.454. V = 26042.0732. Faces 9; both seams G2, not G3.",
"body_count": 1,
"volume_mm3": 26042.0732245589,
"faces": 9,
"continuity": {
"order": "g2",
"exact": true
},
"tolerance": {
"rel": 1e-07
}
}
@@ -0,0 +1,43 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 60,
"width": 40,
"height": 10,
"body_name": "Plate"
}
},
{
"command": "solid.cylinder",
"params": {
"radius": 8,
"height": 10,
"base": [
30,
20,
10
],
"operation": "join",
"targets": [
"Plate"
]
}
},
{
"command": "solid.fillet",
"params": {
"radius": 2,
"type": "curvature",
"edges": [
[
38,
20,
10
]
]
}
}
]
}
@@ -0,0 +1,28 @@
{
"sources": [],
"what": "a box's top back edge rounded curvature-continuous size 3: the order-2 section meets each face with its curvature (0), and not its third derivative",
"source": "analytic",
"method": "box 40x30x20, the top back edge (y = 30, z = 20, 40 long) between the planar end faces x = 0 and 40, set back s = 3 along both faces (square to each other). In a plane x = const the faces' feet of the point at distance d from both are (30 - d, 20) and (30, 20 - d), so the order-2 section is S(t) = f(t) (e + (1 - p1(t)) (rho1 - e)) + (1 - f(t)) (e + p2(t) (rho2 - e)), f = (1-t)^3 / ((1-t)^3 + t^3), p1 = t / (1 - w + w t), p2 = t (1 - w) / (1 - w t), e the edge and rho_i the contacts, at the default thumbweight w = 0.0342934022666073, which is defined by this section cutting 113/756 s^2 off the corner (Green's theorem on S): 1.345238. V = 24000 - 40 * 1.345238 = 23946.1905. Faces 7; both seams G2, not G3.",
"body_count": 1,
"volume_mm3": 23946.190476190477,
"faces": 7,
"bbox": {
"min": [
0,
0,
0
],
"max": [
40,
30,
20
]
},
"continuity": {
"order": "g2",
"exact": true
},
"tolerance": {
"rel": 1e-07
}
}
@@ -0,0 +1,27 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 40,
"width": 30,
"height": 20,
"body_name": "Part"
}
},
{
"command": "solid.fillet",
"params": {
"radius": 3,
"type": "curvature",
"edges": [
[
20,
30,
20
]
]
}
}
]
}
@@ -0,0 +1,15 @@
{
"sources": [],
"what": "the concave edge where a pipe dips into a plate rounded curvature-continuous size 2: the order-2 section meets the plane with curvature 0 and the pipe with its curvature 1/10",
"source": "analytic",
"method": "plate 60x40x10 (z 0..10) joined to a pipe R10 along x (0..60) whose axis is at (y, z) = (20, 16): the pipe dips 4 into the plate and leaves it along y = 20 +- 8, z = 10, the edges ending on the planar faces x = 0 and 60. V0 = 24000 + 60 (100 pi - (100 acos 0.6 - 48)) = 40165.7846. The concave edge y = 28: in a plane x = const, the point at distance d from both faces is (20 + g, 10 + d), g = sqrt(64 + 32 d); its feet are F1 = (20 + g, 10) on the plate and F2 = (20 + 10 g / (10 + d), 26 - 160 / (10 + d)) on the pipe. The order-2 section between the r = 2 ball's contacts: S(t) = f(t) T1(1 - p1(t)) + (1 - f(t)) T2(p2(t)), f = (1-t)^3 / ((1-t)^3 + t^3), p1 = t / (1 - w + w t), p2 = t (1 - w) / (1 - w t), w = 0.0342934022666073 (the default thumbweight), T_i(u) = sum_{k<=2} 2^k / k! F_i^(k)(2) (u - 1)^k (g' = 16 / g, g'' = -256 / g^3). It adds the area between it, the plate and the pipe, 1.505802 (Green's theorem): V = 40165.7846 + 60 * 1.505802 = 40256.1327. Both seams G2, not G3.",
"body_count": 1,
"volume_mm3": 40256.132731918,
"continuity": {
"order": "g2",
"exact": true
},
"tolerance": {
"rel": 1e-07
}
}
@@ -0,0 +1,48 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 60,
"width": 40,
"height": 10,
"body_name": "Plate"
}
},
{
"command": "solid.cylinder",
"params": {
"radius": 10,
"height": 60,
"base": [
0,
20,
16
],
"axis": [
1,
0,
0
],
"operation": "join",
"targets": [
"Plate"
]
}
},
{
"command": "solid.fillet",
"params": {
"radius": 2,
"type": "curvature",
"edges": [
[
30,
28,
10
]
]
}
}
]
}
@@ -0,0 +1,28 @@
{
"sources": [],
"what": "a box's top back edge rounded r3: the ball's circle, tangent to each face with the curvature jumping by 1/3",
"source": "analytic",
"method": "box 40x30x20, the top back edge (y = 30, z = 20, 40 long) between the planar end faces x = 0 and 40, set back s = 3 along both faces (square to each other): the quarter circle cuts (1 - pi/4) s^2 = 1.931417 off the corner: V = 24000 - 40 (1 - pi/4) 9 = 23922.7433. Faces 7; both seams G1, not G2 (curvature 1/3 against 0).",
"body_count": 1,
"volume_mm3": 23922.743338823086,
"faces": 7,
"bbox": {
"min": [
0,
0,
0
],
"max": [
40,
30,
20
]
},
"continuity": {
"order": "g1",
"exact": true
},
"tolerance": {
"rel": 1e-07
}
}
@@ -0,0 +1,26 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 40,
"width": 30,
"height": 20,
"body_name": "Part"
}
},
{
"command": "solid.fillet",
"params": {
"radius": 3,
"edges": [
[
20,
30,
20
]
]
}
}
]
}
@@ -0,0 +1,15 @@
{
"sources": [],
"what": "the concave edge where a pipe dips into a plate rounded r2: the ball's circle (a cylinder along x), tangent to the plane and the pipe",
"source": "analytic",
"method": "plate 60x40x10 (z 0..10) joined to a pipe R10 along x (0..60) whose axis is at (y, z) = (20, 16): the pipe dips 4 into the plate and leaves it along y = 20 +- 8, z = 10, the edges ending on the planar faces x = 0 and 60. V0 = 24000 + 60 (100 pi - (100 acos 0.6 - 48)) = 40165.7846. The concave edge y = 28: in a plane x = const, the point at distance d from both faces is (20 + g, 10 + d), g = sqrt(64 + 32 d); its feet are F1 = (20 + g, 10) on the plate and F2 = (20 + 10 g / (10 + d), 26 - 160 / (10 + d)) on the pipe. The ball r = 2 is centred at (20 + sqrt 128, 12), touching the plate at F1(2) = (31.313708, 10) and the pipe at F2(2) = (29.428090, 12.666667); its arc between them adds 2.250358 (Green's theorem along the plate, the arc and the pipe): V = 40165.7846 + 60 * 2.250358 = 40300.8061. Both seams G1, not G2 (curvature 1/2 against 0 and 1/2 against 1/10).",
"body_count": 1,
"volume_mm3": 40300.8060669181,
"continuity": {
"order": "g1",
"exact": true
},
"tolerance": {
"rel": 1e-07
}
}
@@ -0,0 +1,47 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 60,
"width": 40,
"height": 10,
"body_name": "Plate"
}
},
{
"command": "solid.cylinder",
"params": {
"radius": 10,
"height": 60,
"base": [
0,
20,
16
],
"axis": [
1,
0,
0
],
"operation": "join",
"targets": [
"Plate"
]
}
},
{
"command": "solid.fillet",
"params": {
"radius": 2,
"edges": [
[
30,
28,
10
]
]
}
}
]
}
@@ -0,0 +1,28 @@
{
"sources": [],
"what": "a variable round from r1 to r5 along a box's top back edge: the balls' envelope, a circular cone, not their great circles",
"source": "analytic",
"method": "box 20x30x20, the top back edge (y = 30, z = 20) with r = 1 + x/5 from x = 0 to 20. The balls' centres (x, 30 - r, 20 - r) run on a line, r proportional to their distance from the apex (-5, 30, 20): their envelope is the circular cone about that line with sin(phi) = 1/sqrt(27). Each ball touches it along the circle square to the line of centres, offset -r r'/|c'| from the centre, not along the great circle (whose middle is 0.0101 off the cone at x = 10). In each plane x = const the cone's section cuts off the corner, between the contact lines, the area found by rays from the corner (each meets the cone at the root of a quadratic); integrated over x it is 43.777573: V = 12000 - 43.777573 = 11956.2224. Faces 7; both seams G1, not G2.",
"body_count": 1,
"volume_mm3": 11956.2224267359,
"faces": 7,
"bbox": {
"min": [
0,
0,
0
],
"max": [
20,
30,
20
]
},
"continuity": {
"order": "g1",
"exact": true
},
"tolerance": {
"rel": 1e-05
}
}
@@ -0,0 +1,33 @@
{
"commands": [
{
"command": "solid.box",
"params": {
"length": 20,
"width": 30,
"height": 20,
"body_name": "Part"
}
},
{
"command": "solid.fillet",
"params": {
"edges": [
[
10,
30,
20
]
],
"radius": 1,
"type": "variable",
"radius2": 5,
"start": [
0,
30,
20
]
}
}
]
}