public class Sphere { int M, N; // sphereMesh dimensions double sphereMesh[][][]; public Sphere(int m, int n) { M = m; N = n; sphereMesh = new double[M][N][3]; fillMesh(); } public double[][][] transformedBy(Matrix3D t) { double[][][] transformed = new double[M][N][3]; for (int i = 0; i < transformed.length; i++) for (int j = 0; j < transformed[i].length; j++) { transformed[i][j] = t.transform(sphereMesh[i][j]); } return transformed; } private void fillMesh() { for (int i = 0; i < M; i++) for (int j = 0; j < N; j++) { double u = i / (M - 1.0); double v = j / (N - 1.0); sphereMesh[i][j][0] = x(u, v); sphereMesh[i][j][1] = y(u, v); sphereMesh[i][j][2] = z(u, v); } } private double x(double u, double v) { return ( Math.cos(2 * Math.PI * u) * Math.cos(Math.PI * v - (Math.PI / 2))); } private double y(double u, double v) { return (Math.sin(Math.PI * v - (Math.PI / 2))); } private double z(double u, double v) { return ( -1 * Math.sin(2 * Math.PI * u) * Math.cos(Math.PI * v - (Math.PI / 2))); } }