singleCellular3 method
Implementation
double singleCellular3(double x, double y, double z) {
final xr = x.round();
final yr = y.round();
final zr = z.round();
var distance = 999999.0;
var xc = 0;
var yc = 0;
var zc = 0;
switch (cellularDistanceFunction) {
case CellularDistanceFunction.euclidean:
for (var xi = xr - 1; xi <= xr + 1; xi++) {
for (var yi = yr - 1; yi <= yr + 1; yi++) {
for (var zi = zr - 1; zi <= zr + 1; zi++) {
final vec = cell3d[hash3D(seed, xi, yi, zi) & 255];
final vecX = xi - x + vec.x;
final vecY = yi - y + vec.y;
final vecZ = zi - z + vec.z;
final newDistance = vecX * vecX + vecY * vecY + vecZ * vecZ;
if (newDistance < distance) {
distance = newDistance;
xc = xi;
yc = yi;
zc = zi;
}
}
}
}
break;
case CellularDistanceFunction.manhattan:
for (var xi = xr - 1; xi <= xr + 1; xi++) {
for (var yi = yr - 1; yi <= yr + 1; yi++) {
for (var zi = zr - 1; zi <= zr + 1; zi++) {
final vec = cell3d[hash3D(seed, xi, yi, zi) & 255];
final vecX = xi - x + vec.x;
final vecY = yi - y + vec.y;
final vecZ = zi - z + vec.z;
final newDistance = vecX.abs() + vecY.abs() + vecZ.abs();
if (newDistance < distance) {
distance = newDistance;
xc = xi;
yc = yi;
zc = zi;
}
}
}
}
break;
case CellularDistanceFunction.natural:
for (var xi = xr - 1; xi <= xr + 1; xi++) {
for (var yi = yr - 1; yi <= yr + 1; yi++) {
for (var zi = zr - 1; zi <= zr + 1; zi++) {
final vec = cell3d[hash3D(seed, xi, yi, zi) & 255];
final vecX = xi - x + vec.x;
final vecY = yi - y + vec.y;
final vecZ = zi - z + vec.z;
final newDistance = (vecX.abs() + vecY.abs() + vecZ.abs()) +
(vecX * vecX + vecY * vecY + vecZ * vecZ);
if (newDistance < distance) {
distance = newDistance;
xc = xi;
yc = yi;
zc = zi;
}
}
}
}
break;
}
switch (cellularReturnType) {
case CellularReturnType.cellValue:
return valCoord3D(0, xc, yc, zc);
case CellularReturnType.distance:
return distance - 1.0;
default:
return .0;
}
}