function unitball3d_m3(p) {
let range = [...Array(num_steps).keys()].map( i => (i * 2) / (num_steps - 1) - 1 );
let x = [...Array(num_steps)].map( () => Array(num_steps));
let y = [...Array(num_steps)].map( () => Array(num_steps));
let z = [...Array(num_steps)].map( () => Array(num_steps));
range.forEach( (val, i) => z[i].fill(val) );
let r2 = cos.theta.map( (val, i) => Math.abs(val)**p + Math.abs(sin.theta[i])**p );
for (let i = 0; i < num_steps; i++) {
let r1 = (1 - Math.abs(range[i])**p);
for (let j = 0; j < num_steps; j++) {
let r = (r1 / r2[j])**(1/p)
x[i][j] = r * cos.theta[j];
y[i][j] = r * sin.theta[j];
}
}
return {x, y, z};
}