@Override public Tuple2<String, Instance> call(Tuple2<String, Instance> inst) throws Exception { Instance bestCluster = null; double bestScore = Double.MAX_VALUE; for (String clusterId : clusters.keySet()) { Instance cluster = clusters.get(clusterId); double d = distFunc.distance(inst._2, cluster); if (d < bestScore && d < threshold) { bestScore = d; bestCluster = cluster; } } // System.out.println(inst._1 + " -> " + bestCluster); if (bestCluster == null) { return null; } return new Tuple2<String, Instance>(bestCluster.getId(), inst._2); }
/** * Not 'pure' Worley, but the results are virtually the same. Returns distances in da and point * coords in pa */ public static void voronoi( float x, float y, float z, float[] da, float[] pa, float distanceExponent, int distanceType) { float xd, yd, zd, d, p[] = new float[3]; DistanceFunction distanceFunc = distanceFunctions.get(Integer.valueOf(distanceType)); if (distanceFunc == null) { distanceFunc = distanceFunctions.get(Integer.valueOf(0)); } int xi = (int) FastMath.floor(x); int yi = (int) FastMath.floor(y); int zi = (int) FastMath.floor(z); da[0] = da[1] = da[2] = da[3] = Float.MAX_VALUE; // 1e10f; for (int i = xi - 1; i <= xi + 1; ++i) { for (int j = yi - 1; j <= yi + 1; ++j) { for (int k = zi - 1; k <= zi + 1; ++k) { NoiseMath.hash(i, j, k, p); xd = x - (p[0] + i); yd = y - (p[1] + j); zd = z - (p[2] + k); d = distanceFunc.execute(xd, yd, zd, distanceExponent); if (d < da[0]) { da[3] = da[2]; da[2] = da[1]; da[1] = da[0]; da[0] = d; pa[9] = pa[6]; pa[10] = pa[7]; pa[11] = pa[8]; pa[6] = pa[3]; pa[7] = pa[4]; pa[8] = pa[5]; pa[3] = pa[0]; pa[4] = pa[1]; pa[5] = pa[2]; pa[0] = p[0] + i; pa[1] = p[1] + j; pa[2] = p[2] + k; } else if (d < da[1]) { da[3] = da[2]; da[2] = da[1]; da[1] = d; pa[9] = pa[6]; pa[10] = pa[7]; pa[11] = pa[8]; pa[6] = pa[3]; pa[7] = pa[4]; pa[8] = pa[5]; pa[3] = p[0] + i; pa[4] = p[1] + j; pa[5] = p[2] + k; } else if (d < da[2]) { da[3] = da[2]; da[2] = d; pa[9] = pa[6]; pa[10] = pa[7]; pa[11] = pa[8]; pa[6] = p[0] + i; pa[7] = p[1] + j; pa[8] = p[2] + k; } else if (d < da[3]) { da[3] = d; pa[9] = p[0] + i; pa[10] = p[1] + j; pa[11] = p[2] + k; } } } } }