function TPMS(surface = "SchwarzD", scope) {
scope.sinTable = {};
scope.cosTable = {};
function cos(number) {
const foundResult = scope.cosTable[number];
if (foundResult === undefined) {
const result = Math.cos(number);
scope.cosTable[number] = result;
return result;
} else {
return foundResult;
}
}
function sin(number) {
const foundResult = scope.sinTable[number];
if (foundResult === undefined) {
const result = Math.sin(number);
scope.sinTable[number] = result;
return result;
} else {
return foundResult;
}
}
switch (surface) {
case "SchwarzD":
return (x, y, z) => cos(x) * cos(y) * cos(z) - sin(x) * sin(y) * sin(z);
case "SchwarzP":
return (x, y, z) => cos(x) + cos(y) + cos(z);
case "Gyroid":
return (x, y, z) => sin(x) * cos(y) + sin(y) * cos(z) + sin(z) * cos(x);
case "IWP": {
return (x, y, z) =>
2 * (cos(x) * cos(y) + cos(y) * cos(z) + cos(x) * cos(z)) -
(cos(2 * x) + cos(2 * y) + cos(2 * z));
}
case "F-K S":
return (x, y, z) =>
cos(2 * x) * sin(y) * cos(z) +
cos(2 * y) * sin(z) * cos(x) +
cos(2 * z) * sin(x) * cos(y);
case "F-K C(Y)": return (x,y,z)=>sin(2*x)*sin(y) + sin(2*y)*sin(z) + sin(x)*sin(2*z) - cos(x)*cos(y)*cos(z)
+ sin(2*x)*cos(z) + cos(x)*sin(2*y) + cos(y)*sin(2*z) - sin(x)*sin(y)*sin(z)
case "Split P": return (x,y,z)=>1.1*(sin(2*x)*sin(z)*cos(y) +sin(2*y)*sin(x)*cos(z)+sin(2*z)*sin(y)*cos(x))
-0.2*(cos(2*x)*cos(2*y)+cos(2*y)*cos(2*z)+cos(2*z)*cos(2*x))
-0.4*(cos(2*x)+cos(2*y)+cos(2*z))
case "F-RD":return (x,y,z)=>4*cos(x)*cos(y)*cos(z)-cos(2*x)*cos(2*y)-cos(2*y)*cos(2*z)
-cos(2*x)*cos(2*z)
case "G Prime": return (x,y,z)=>sin(2*x)*cos(y)* sin(z) + sin(2*y)* cos(z)* sin(x) +sin(2*z)* cos(x) *sin(y)+0.32
}
}