Compare commits

...

2 Commits

Author SHA1 Message Date
jyviko e976d45a8f Kernel rig: the exact-class rounds pass on SMLib's classified exact rounds
The rounds now come as the rational surfaces their classes give, closed ones as two faces split
at their seams, the touching pipes' as four: one splines entry a face, each of the class's degrees.
Their KNOWN_FAILING lines go.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 13:09:33 -04:00
jyviko 4cc5b6b4a9 Kernel rig: constant rounds of the exact classes, and a tee's round
A plane cutting a cylinder or a cone at an angle, a sphere or a cone coaxial with the other face, a
cone and a cylinder touching one ball, two pipes touching at a point: their rounds' centre lines
are rational, so the rounds are rational surfaces of degrees fixed by the construction ((4, 2),
(2, 2) revolved, (6, 2), (12, 2)). The tee's centre line is not rational; its round is graded on
its volume. Volumes from the divergence theorem over the exact pieces, at rel 1e-6. The six that
SMLib 0cc48bd traces are listed in KNOWN_FAILING with what they come out as.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 11:41:35 -04:00
16 changed files with 676 additions and 0 deletions
@@ -0,0 +1,27 @@
{
"sources": [],
"what": "two coaxial frusta joined, R10 to 6 over z 0..8 and R6 to 1 over z 8..9: the convex circle between their cones rounded r2",
"source": "analytic",
"method": "both cones turn about z: the ball's centre runs on a circle about z, so the round is the ball's arc turned about z: rational, of degrees (2, 2). V0 = the frusta, pi h (R^2 + R r + r^2) / 3; the round removes 2 pi times the first moment about z of its section (the ball R2 tangent to both profile lines): 5.065333649310.",
"body_count": 1,
"volume_mm3": 1681.969921328409,
"tolerance": {
"rel": 1e-06
},
"surface_types": [
"bspline",
"cone",
"plane"
],
"splines": [
{
"degree": [
2,
2
]
}
],
"continuity": {
"order": "g1"
}
}
@@ -0,0 +1,49 @@
{
"commands": [
{
"command": "solid.cone",
"params": {
"radius": 10,
"height": 8,
"top_radius": 6,
"base": [
0,
0,
0
],
"operation": "new",
"body_name": "Top"
}
},
{
"command": "solid.cone",
"params": {
"radius": 6,
"height": 1,
"top_radius": 1,
"base": [
0,
0,
8
],
"operation": "join",
"targets": [
"Top"
]
}
},
{
"command": "solid.fillet",
"params": {
"edges": [
[
0,
6,
8
]
],
"radius": 2
}
}
]
}
@@ -0,0 +1,34 @@
{
"sources": [],
"what": "a cone (apex (0, 0, 10 sqrt 2), half-angle 45 deg) and a post R10 tilted 20 deg through the origin, both touching the ball R10 about the origin along circles that do not meet, joined: the concave edge where the cone leaves the post rounded r1",
"source": "analytic",
"method": "the offsets by 1 (the post R11, the cone with its apex sqrt 2 higher) both touch the ball R11 about the origin, so they meet in two plane conics (the cone and the post are each the ball's sphere less a multiple of the square of their contact circle's plane, and their difference is two planes); the spine is the conic round the post, and the round, between contact lines that are rational on both quadrics, is a rational B-spline of degrees (6, 2). V0 = the cone and the post less their overlap, about the cone's apex (where the cone gives no flux): the post's wall below the edge and its bottom cap: 21763.823377543333; the round adds 1.884007899126, (1/3) of the flux of the position through the boundary of the material the round adds: the round's surface as the ball's circles about the spine from contact to contact, the strips of the faces between the edge and the contact lines, each written out exactly and integrated by Gauss-Legendre quadrature (24 points a panel), about the apex. The round's faces, each of those degrees: a closed round is two faces (split at the seam of its closed surface).",
"body_count": 1,
"volume_mm3": 21765.70738544246,
"tolerance": {
"rel": 1e-06
},
"surface_types": [
"bspline",
"cone",
"cylinder",
"plane"
],
"splines": [
{
"degree": [
6,
2
]
},
{
"degree": [
6,
2
]
}
],
"continuity": {
"order": "g1"
}
}
@@ -0,0 +1,53 @@
{
"commands": [
{
"command": "solid.cone",
"params": {
"radius": 24.14213562373095,
"height": 24.14213562373095,
"top_radius": 0,
"base": [
0,
0,
-10
],
"operation": "new",
"body_name": "Hill"
}
},
{
"command": "solid.cylinder",
"params": {
"radius": 10,
"height": 30,
"base": [
0,
0,
0
],
"axis": [
0.3420201433256687,
0,
0.9396926207859084
],
"operation": "join",
"targets": [
"Hill"
]
}
},
{
"command": "solid.fillet",
"params": {
"edges": [
[
1.46857451100787,
10,
4.034875307780737
]
],
"radius": 1
}
}
]
}
@@ -0,0 +1,45 @@
{
"sources": [],
"what": "two pipes touching at one point (R10 about y = 0, z = -10 and R5 about x = 0, z = -5, both touching z = 0 at the origin from below), joined and cut at z = -2: the concave arc of their edge on the +y side, from (4, 6, -2) down through (0, 10, -10) to (-4, 6, -2), rounded r1",
"source": "analytic",
"method": "the offsets by 1 (R11 and R6) touch at (0, 0, 1) as the pipes do at the origin, so they meet in a quartic with a node there, which is rational (the lines through the node meet it once more); the round is a rational B-spline of degrees (12, 2). V0 = the two cut pipes less their overlap, integral of 4 sqrt(25 - (z+5)^2) sqrt(100 - (z+10)^2) over z in [-10, -2]: 13437.742049099792; the round adds 4.961081486747, (1/3) of the flux of the position through the boundary of the material the round adds: the round's surface as the ball's circles about the spine from contact to contact, the strips of the faces between the edge and the contact lines, and its end pieces in the plane z = -2 (bounded by the round's section there), each written out exactly and integrated by Gauss-Legendre quadrature (24 points a panel). The round's faces, each of those degrees: four, as the body's topology splits the edge and the round.",
"body_count": 1,
"volume_mm3": 13442.703130586538,
"tolerance": {
"rel": 1e-06
},
"surface_types": [
"bspline",
"cylinder",
"plane"
],
"splines": [
{
"degree": [
12,
2
]
},
{
"degree": [
12,
2
]
},
{
"degree": [
12,
2
]
},
{
"degree": [
12,
2
]
}
],
"continuity": {
"order": "g1"
}
}
@@ -0,0 +1,71 @@
{
"commands": [
{
"command": "solid.cylinder",
"params": {
"radius": 10,
"height": 40,
"base": [
-20,
0,
-10
],
"axis": "X",
"operation": "new",
"body_name": "Pipes"
}
},
{
"command": "solid.cylinder",
"params": {
"radius": 5,
"height": 40,
"base": [
0,
-20,
-5
],
"axis": "Y",
"operation": "join",
"targets": [
"Pipes"
]
}
},
{
"command": "solid.box",
"params": {
"length": 100,
"width": 100,
"height": 50,
"corner": [
-50,
-50,
-2
],
"operation": "cut",
"targets": [
"Pipes"
]
}
},
{
"command": "solid.fillet",
"params": {
"edges": [
[
4.207354924039483,
9.732263392975257,
-7.701511529340699
],
[
-4.207354924039483,
9.732263392975257,
-7.701511529340699
]
],
"radius": 1
}
}
]
}
@@ -0,0 +1,33 @@
{
"sources": [],
"what": "a frustum R10 narrowing at 10 deg, cut by the plane z = 15 + 0.3 x: its elliptical top rim rounded r1.5",
"source": "analytic",
"method": "the ball's centre runs on the cone moved 1.5 in (its apex 1.5 / sin 10 deg lower) and on the plane moved 1.5 down: a plane section of a cone, an ellipse (rho = K / (1 + 0.3 tan 10 deg cos phi) about the axis), so the round is a rational B-spline of degrees (4, 2). V0 = 3565.939077141579 (the bottom disc gives no flux about the origin, the cone X.n = 10 sin 10 deg / tan 10 deg over its area, the top X.n = 15 / sqrt 1.09 over its area); the round removes 16.021667699147, (1/3) of the flux of the position through the boundary of the material the round removes: the round's surface as the ball's circles about the spine from contact to contact, the strips of the faces between the edge and the contact lines, each written out exactly and integrated by Gauss-Legendre quadrature (24 points a panel). The round's faces, each of those degrees: a closed round is two faces (split at the seam of its closed surface).",
"body_count": 1,
"volume_mm3": 3549.917409442432,
"tolerance": {
"rel": 1e-06
},
"surface_types": [
"bspline",
"cone",
"plane"
],
"splines": [
{
"degree": [
4,
2
]
},
{
"degree": [
4,
2
]
}
],
"continuity": {
"order": "g1"
}
}
@@ -0,0 +1,53 @@
{
"commands": [
{
"command": "solid.cone",
"params": {
"radius": 10,
"height": 30,
"top_radius": 4.710190578746051,
"base": [
0,
0,
0
],
"operation": "new",
"body_name": "Post"
}
},
{
"command": "solid.cylinder",
"params": {
"radius": 100,
"height": 100,
"base": [
0,
0,
15
],
"axis": [
-0.2873478855663454,
0,
0.9578262852211513
],
"operation": "cut",
"targets": [
"Post"
]
}
},
{
"command": "solid.fillet",
"params": {
"edges": [
[
5.013316645912501,
5.013316645912501,
16.503994993773752
]
],
"radius": 1.5
}
}
]
}
@@ -0,0 +1,33 @@
{
"sources": [],
"what": "a cylinder R10 cut by the plane z = 20 + x/2: its elliptical top rim rounded r2",
"source": "analytic",
"method": "the ball's centre runs on the cylinder R8 and on the plane moved 2 down, so the spine is their ellipse; the contact lines are the ellipse moved along each face's normal, rational, and the round (the circles of the ball between them, rational quadratic arcs whose weights are rational in the ellipse's parameter) is a rational B-spline of degrees (4, 2). V0 = 2000 pi (the plane's tilt cancels round the axis); the round removes 68.775042921067, (1/3) of the flux of the position through the boundary of the material the round removes: the round's surface as the ball's circles about the spine from contact to contact, the strips of the faces between the edge and the contact lines, each written out exactly and integrated by Gauss-Legendre quadrature (24 points a panel). The round's faces, each of those degrees: a closed round is two faces (split at the seam of its closed surface).",
"body_count": 1,
"volume_mm3": 6214.41026425852,
"tolerance": {
"rel": 1e-06
},
"surface_types": [
"bspline",
"cylinder",
"plane"
],
"splines": [
{
"degree": [
4,
2
]
},
{
"degree": [
4,
2
]
}
],
"continuity": {
"order": "g1"
}
}
@@ -0,0 +1,52 @@
{
"commands": [
{
"command": "solid.cylinder",
"params": {
"radius": 10,
"height": 40,
"base": [
0,
0,
0
],
"operation": "new",
"body_name": "Post"
}
},
{
"command": "solid.cylinder",
"params": {
"radius": 100,
"height": 100,
"base": [
0,
0,
20
],
"axis": [
-0.4472135954999579,
0,
0.8944271909999159
],
"operation": "cut",
"targets": [
"Post"
]
}
},
{
"command": "solid.fillet",
"params": {
"edges": [
[
7.0710678118654755,
7.0710678118654755,
23.535533905932738
]
],
"radius": 2
}
}
]
}
@@ -0,0 +1,28 @@
{
"sources": [],
"what": "a ball R10 and a frustum about z through its centre (R5 at z = 0 to R3 at z = 20) joined: the concave circle where the cone leaves the ball rounded r3",
"source": "analytic",
"method": "the ball's centre (outside both) runs on the sphere R13 and on the cone moved 3 out, both about z: a circle, so the round is the ball's arc turned about z: rational, of degrees (2, 2). V0 = the ball and the frustum less their overlap (the frustum below the edge at z = 9.1265, the ball's cap above it): 4597.853510151037; the round adds 2 pi times the first moment of its section: 9.688315962175.",
"body_count": 1,
"volume_mm3": 4607.541826113212,
"tolerance": {
"rel": 1e-06
},
"surface_types": [
"bspline",
"cone",
"plane",
"sphere"
],
"splines": [
{
"degree": [
2,
2
]
}
],
"continuity": {
"order": "g1"
}
}
@@ -0,0 +1,47 @@
{
"commands": [
{
"command": "solid.sphere",
"params": {
"radius": 10,
"center": [
0,
0,
0
],
"operation": "new",
"body_name": "Ball"
}
},
{
"command": "solid.cone",
"params": {
"radius": 5,
"height": 20,
"top_radius": 3,
"base": [
0,
0,
0
],
"operation": "join",
"targets": [
"Ball"
]
}
},
{
"command": "solid.fillet",
"params": {
"edges": [
[
0,
4.087346743853332,
9.12653256146668
]
],
"radius": 3
}
}
]
}
@@ -0,0 +1,33 @@
{
"sources": [],
"what": "a ball R10 cut flat at z = 4: its rim rounded r2",
"source": "analytic",
"method": "the ball's centre runs on the sphere R8 and the plane z = 2: the circle of radius sqrt 60 about z, so the round is the ball's arc turned about z, a rational B-spline of degrees (2, 2). V0 = 4000 pi / 3 - 288 pi; the round removes 2 pi times the first moment about z of its section (Pappus), from contact (sqrt 60, 4) on the plane to (1.25 sqrt 60, 2.5) on the sphere: 22.492758031524. The round's faces, each of those degrees: a closed round is two faces (split at the seam of its closed surface).",
"body_count": 1,
"volume_mm3": 3261.518762521006,
"tolerance": {
"rel": 1e-06
},
"surface_types": [
"bspline",
"plane",
"sphere"
],
"splines": [
{
"degree": [
2,
2
]
},
{
"degree": [
2,
2
]
}
],
"continuity": {
"order": "g1"
}
}
@@ -0,0 +1,51 @@
{
"commands": [
{
"command": "solid.sphere",
"params": {
"radius": 10,
"center": [
0,
0,
0
],
"operation": "new",
"body_name": "Ball"
}
},
{
"command": "solid.cylinder",
"params": {
"radius": 100,
"height": 100,
"base": [
0,
0,
4
],
"axis": [
0,
0,
1
],
"operation": "cut",
"targets": [
"Ball"
]
}
},
{
"command": "solid.fillet",
"params": {
"edges": [
[
0,
9.16515138991168,
4
]
],
"radius": 2
}
}
]
}
@@ -0,0 +1,19 @@
{
"sources": [],
"what": "the saddle edge of a tee: a branch R8 standing on a pipe R20, rounded r3",
"source": "analytic",
"method": "the ball's centre runs where the cylinders R23 and R11 meet, a quartic with no node: not rational, so the round is fitted (a B-spline within the fillet's tolerance). V0 = the pipes less the branch inside the pipe, integral over the branch's disc of sqrt(400 - y^2): 129767.064584659383; the round adds 62.888321009560, (1/3) of the flux of the position through the boundary of the material the round adds: the round's surface as the ball's circles about the spine from contact to contact, the strips of the faces between the edge and the contact lines, each written out exactly and integrated by Gauss-Legendre quadrature (24 points a panel), the spine written out by the branch's angle, (11 cos f, 11 sin f, sqrt(529 - 121 sin^2 f)).",
"body_count": 1,
"volume_mm3": 129829.95290566895,
"tolerance": {
"rel": 1e-06
},
"surface_types": [
"bspline",
"cylinder",
"plane"
],
"continuity": {
"order": "g1"
}
}
@@ -0,0 +1,48 @@
{
"commands": [
{
"command": "solid.cylinder",
"params": {
"radius": 20,
"height": 100,
"base": [
-50,
0,
0
],
"axis": "X",
"operation": "new",
"body_name": "Tee"
}
},
{
"command": "solid.cylinder",
"params": {
"radius": 8,
"height": 40,
"base": [
0,
0,
0
],
"operation": "join",
"targets": [
"Tee"
]
}
},
{
"command": "solid.fillet",
"params": {
"edges": [
[
5.656854249492381,
5.656854249492381,
19.183326093250876
]
],
"radius": 3
}
}
]
}