docs: private void sortTracksForEstimation() {
  		// reset data structures
  		planeSamples.reset();
  		farAngles.reset();
  		tracksOnPlane.clear();
  		tracksFar.clear();
  
  		// list of active tracks
  		List<PointTrack> active = tracker.getActiveTracks(null);
  
  		for (PointTrack t : active) {
  			VoTrack p = t.getCookie();
  
  			// compute normalized image coordinate
  			pixelToNorm.compute(t.x, t.y, n);
  
  			// rotate pointing vector into plane reference frame
  			pointing.set(n.x, n.y, 1);
  			GeometryMath_F64.mult(cameraToPlane.getR(), pointing, pointing);
  			pointing.normalize();
  
  			if (p.onPlane) {
  				// see if it still intersects the plane
  				if (pointing.y > 0) {
  					// create data structure for robust motion estimation
  					PlanePtPixel ppp = planeSamples.grow();
  					ppp.normalizedCurr.set(n);
  					ppp.planeKey.set(p.ground);
  
  					tracksOnPlane.add(t);
  				}
  			} else {
  				// if the point is not on the plane visually and (optionally) if it passes a strict y-axis rotation
  				// test, consider using the point for estimating rotation.
  				boolean allGood = pointing.y < 0;
  				if (strictFar) {
  					allGood = isRotationFromAxisY(t, pointing);
  				}
  				// is it still above the ground plane and only has motion consistent with rotation on ground plane axis
  				if (allGood) {
  					computeAngleOfRotation(t, pointing);
  					tracksFar.add(t);
  				}
  			}
  		}
  	}