ZMatrixTools { public static Point3d[] zmatrixToCartesian(double[] distances, int[] first_atoms, double[] angles, int[] second_atoms, double[] dihedrals, int[] third_atoms) { Point3d[] cartesianCoords = new Point3d[distances.length]; for (int index = 0; index < distances.length; index++) { if (index == 0) { cartesianCoords[index] = new Point3d(0d, 0d, 0d); } else if (index == 1) { cartesianCoords[index] = new Point3d(distances[1], 0d, 0d); } else if (index == 2) { cartesianCoords[index] = new Point3d(-Math.cos((angles[2] / 180) * Math.PI) * distances[2] + distances[1], Math.sin((angles[2] / 180) * Math.PI) * distances[2], 0d); if (first_atoms[index] == 0) cartesianCoords[index].x = (cartesianCoords[index].x - distances[1]) * -1; } else { Vector3d cd = new Vector3d(); cd.sub(cartesianCoords[third_atoms[index]], cartesianCoords[second_atoms[index]]); Vector3d bc = new Vector3d(); bc.sub(cartesianCoords[second_atoms[index]], cartesianCoords[first_atoms[index]]); Vector3d n1 = new Vector3d(); n1.cross(cd, bc); Vector3d n2 = rotate(n1, bc, -dihedrals[index]); Vector3d ba = rotate(bc, n2, -angles[index]); ba.normalize(); ba.scale(distances[index]); Point3d result = new Point3d(); result.add(cartesianCoords[first_atoms[index]], ba); cartesianCoords[index] = result; } } return cartesianCoords; }  static Point3d[] zmatrixToCartesian(double[] distances, int[] first_atoms, double[] angles,
            int[] second_atoms, double[] dihedrals, int[] third_atoms);  }
@Test public void testZmatrixToCartesian_arraydouble_arrayint_arraydouble_arrayint_arraydouble_arrayint() { int[] first_atoms = {0, 0, 0, 0, 3, 3, 3}; double[] distances = {0, 1.2, 1.1, 1.5, 1.1, 1.1, 1.1}; int[] second_atoms = {0, 0, 1, 1, 0, 0, 0}; double[] angles = {0, 0, 120, 120, 110, 110, 110}; int[] third_atoms = {0, 0, 0, 2, 1, 1, 1}; double[] dihedrals = {0, 0, 0, 180, 0, 120, -120}; Point3d points[] = ZMatrixTools.zmatrixToCartesian(distances, first_atoms, angles, second_atoms, dihedrals, third_atoms); Assert.assertEquals(-0.5500, points[2].x, 0.0001); Assert.assertEquals(-1.3664, points[5].y, 0.0001); Assert.assertEquals(-0.8952, points[6].z, 0.0001); }