#pragma once #include #include namespace da { namespace sha { namespace FieldTPMSFunctions { using FieldTPMSFunction = std::function; inline FieldTPMSFunction Primitive(double t = 0) { return [=](double x, double y, double z, double coeff) -> double { x = x * coeff; y = y * coeff; z = z * coeff; return cos(x) + cos(y) + cos(z) + t; }; } inline FieldTPMSFunction Gyroid(double t = 0) { return [=](double x, double y, double z, double coeff) -> double { x = x * coeff; y = y * coeff; z = z * coeff; return sin(x) * cos(y) + sin(y) * cos(z) + sin(z) * cos(x) + t; }; } inline FieldTPMSFunction Diamond(double t = 0) { return [=](double x, double y, double z, double coeff) -> double { x = x * coeff; y = y * coeff; z = z * coeff; return cos(x) * cos(y) * cos(z) - sin(x) * sin(y) * sin(z) + t; }; } inline FieldTPMSFunction Schwarzp(double t = 0) { return [=](double x, double y, double z, double coeff) -> double { x = x * coeff; y = y * coeff; z = z * coeff; return sin(x) * sin(y) * sin(z) + sin(x) * cos(y) * cos(z) + cos(x) * sin(y) * cos(z) + cos(x) * cos(y) * sin(z) + t; }; } inline FieldTPMSFunction DoubleP(double t = 0) { return [=](double x, double y, double z, double coeff) -> double { x = x * coeff; y = y * coeff; z = z * coeff; return cos(x) * cos(y) + cos(y) * cos(z) + cos(x) * cos(z) + 0.35 * (cos(2 * x) + cos(2 * y) + cos(2 * z)) + t; }; } inline FieldTPMSFunction Schwarzd(double t = 0) { return [=](double x, double y, double z, double coeff) -> double { x = x * coeff; y = y * coeff; z = z * coeff; return sin(x) * sin(y) * sin(z) + sin(x) * cos(y) * cos(z) + cos(x) * sin(y) * cos(z) + cos(x) * cos(y) * sin(z) + t; }; } inline FieldTPMSFunction DoubleD(double t = 0) { return [=](double x, double y, double z, double coeff) -> double { x = x * coeff; y = y * coeff; z = z * coeff; return -1 * (cos(x) * cos(y) + cos(y) * cos(z) + cos(x) * cos(z)) - 1 * (sin(x) * sin(y) * sin(z)) + t; }; } } // namespace FieldTPMSFunctions } // namespace sha } // namespace da