public static SampleSet generateData(
            final int samples, final float rel, final Random rnd
    ) {
        //
        final SampleSet result = new SampleSet();
        //
        int size1 = (int)(samples * rel);
        int size2 = samples - size1;
        //
        int size = size1 + size2;
        while (size > 0) {
            Vector2f v = new Vector2f(rnd.nextFloat(), rnd.nextFloat());
            Vector2f l1 = Vector2f.sub(c1, v);
            Vector2f l2 = Vector2f.sub(c2, v);
            Vector2f l3 = Vector2f.sub(c3, v);
            if (l1.length() > r1 && l2.length() > r2 && l3.length() > r3) {
                //
                // outer point
                //
                if (size2 > 0) {
                    result.add(new Sample(
                        new double[]{v.x, v.y}, new double[]{0.0})
                    );
                    size2--;
                }
            } else {
                //
                // inner point
                //
                if (size1 > 0) {
                    result.add(
                        new Sample(new double[]{v.x, v.y}, new double[]{1.0})
                    );
                    size1--;
                }
            }
            size--;
        }
        return result;
    }