docs: public boolean prunePoints(int count) {
  		// create a lookup table from old to new point indexes
  		int oldToNew[] = new int[ structure.points.length ];
  
  		// list of remaining points
  		List<SceneStructureProjective.Point> remainingP = new ArrayList<>();
  		for (int pointIdx = 0; pointIdx < structure.points.length; pointIdx++) {
  			SceneStructureProjective.Point sp = structure.points[pointIdx];
  
  			if( sp.views.size < count) {
  				// remove observations of this point from each view
  				for (int i = 0; i < sp.views.size; i++) {
  					int viewIdx = sp.views.data[i];
  					SceneObservations.View ov = observations.views[viewIdx];
  					int localIdx = ov.point.indexOf(pointIdx);
  					if( localIdx == -1 )
  						throw new RuntimeException("Point not in view's observation!?");
  					ov.remove(localIdx);
  				}
  			} else {
  				oldToNew[pointIdx] = remainingP.size();
  				remainingP.add(sp);
  			}
  		}
  
  		// if all of them are still remaining nothing changed
  		if( remainingP.size() == structure.points.length )
  			return false;
  
  		// update point references
  		for (int viewIdx = 0; viewIdx < structure.views.length; viewIdx++) {
  			SceneObservations.View so = observations.views[viewIdx];
  
  			for (int i = 0; i < so.point.size; i++) {
  				so.point.data[i] = oldToNew[ so.point.data[i]];
  			}
  		}
  
  		// create a new array with just the remaining points
  		structure.points = new SceneStructureProjective.Point[remainingP.size()];
  		for (int i = 0; i < remainingP.size(); i++) {
  			structure.points[i] = remainingP.get(i);
  		}
  		return true;
  	}