1
package opencog.spacetime.tutorial.projects.ksurfaces;
4
/** The algorithms to generate the Gauss map of a K-surface and the surface. The arrays are in xt--coordinates,
5
* where the first index is time t and the second is the position x.
7
* @author Ulrich Pinkall, adapted for the tutorial by G. Paul Peters, 24.07.2009
8
* @see Ulrich Pinkall: "Designing Cylinders with Constant Negative Curvature", in
9
* Discrete Differential Geometry, pages 57-66. Springer 2008.
12
public class KSurfaces {
13
/** Computes the Gauss map of a K-surface from initial Cauchy data, i.e., two closed curves. Assums that the points of
14
* the initial data lie on the 2-sphere this method generates more points so that the quadrilaterals
15
* (i-1,j-1), (i-1,j), (i,j),(i-2,j-1) form spherical parallelograms.
17
* @param initialAnnulus the initial data, i.e., a double array double[2][n][3] containing 2 polygons with n vertices,
18
* which are both interpreted as closed curves connecting that last and the first one.
19
* @param target a double array that will be filled with the result, i.e., an array double[m][n][3], where m>1 is the number of
20
* time steps to be calculated.
22
public static void gaussMapFromInitialAnnulus(double[][][] initialAnnulus, double[][][] target) {
23
final int m = target.length;
24
final int n = target[0].length;
25
final double[] a = new double[3];
27
// copy first two rows
28
for (int i=0; i<2; i++) {
29
for (int j=0; j<n; j++) {
30
R3.copy(initialAnnulus[i][j], target[i][j]);
34
// compute the other rows
35
for (int i=2; i<m; i++) {
36
for (int j=0; j<n; j++) {
37
int k = j==0 ? n-1 : j-1;
38
R3.plus(target[i-1][k], target[i-1][j], a);
39
double[] w = target[i-2][k];
40
double s = 2 * R3.dot(a,w) / R3.dot(a,a);
42
R3.minus(a, w, target[i][j]);
47
/** Calculates the K-surface from the given Gauss map, assuming that the Gauss map consists
48
* of spherical parallelograms as described in {@link #gaussMapFromInitialAnnulus(double[][][], double[][][])}.
50
* @param gaussMap the given Gauss map.
51
* @param target a double array with enough space to hold the resulting surface. A quad mesh where the
52
* quadrilaterals consist of (i-1,j-1), (i-1,j), (i,j),(i-2,j-1).
54
public static void kSurfaceFromGaussMap(double[][][] gaussMap, double[][][] target) {
55
final int m = gaussMap.length;
56
final int n = gaussMap[0].length;
57
final double[] a = new double[3];
60
R3.zero(target[0][0]);
61
for (int j=0; j<n-1; j++) {
63
R3.plus(gaussMap[0][j], gaussMap[0][k], a);
64
R3.cross(gaussMap[1][k], a, a);
65
R3.plus(target[0][j], a, target[0][k]);
68
// compute the other rows
69
for (int i=1; i<m; i++) {
70
for (int j=0; j<n; j++) {
71
R3.cross(gaussMap[i-1][j], gaussMap[i][j], a);
72
R3.plus(target[i-1][j], a, target[i][j]);