void computePointStatistics(Point[] points ) {
		final int length = points.length;
		double v[] = new double[length];

		for (int axis = 0; axis < 3; axis++) {
			double maxAbs = 0;
			for (int i = 0; i < length; i++) {
				v[i] = points[i].coordinate[axis];
				maxAbs = Math.max( maxAbs , Math.abs(v[i]));
			}

			double median = QuickSelect.select(v,length/2,length);
			switch( axis ) {
				case 0: medianPoint.x = median; break;
				case 1: medianPoint.y = median; break;
				case 2: medianPoint.z = median; break;
			}
		}

		for (int i = 0; i < length; i++) {
			v[i] = points[i].distanceSq(medianPoint);
		}
		medianDistancePoint = Math.sqrt(QuickSelect.select(v,length/2,length));

//		System.out.println("Median P ="+ medianPoint);
//		System.out.println("Median R ="+ medianDistancePoint);
//		System.out.println("Scale    ="+ (desiredDistancePoint / medianDistancePoint));
	}
void computePointStatistics ( Point [ ] points ) { final int length = points . length ; double v [ ] = new double [ length ] ; for ( int axis = 0 ; axis < 3 ; axis ++ ) { double maxAbs = 0 ; for ( int i = 0 ; i < length ; i ++ ) { v [ i ] = points [ i ] . coordinate [ axis ] ; maxAbs = Math . max ( maxAbs , Math . abs ( v [ i ] ) ) ; } double median = QuickSelect . select ( v , length / 2 , length ) ; switch ( axis ) { case 0 : medianPoint . x = median ; break ; case 1 : medianPoint . y = median ; break ; case 2 : medianPoint . z = median ; break ; } } for ( int i = 0 ; i < length ; i ++ ) { v [ i ] = points [ i ] . distanceSq ( medianPoint ) ; } medianDistancePoint = Math . sqrt ( QuickSelect . select ( v , length / 2 , length ) ) ; }
For 3D points, computes the median value and variance along each dimension.