docs: public boolean process(DMatrixRMaj F21 ,
  						   double x1 , double y1, double x2, double y2,
  						   Point2D_F64 p1 , Point2D_F64 p2 )
  	{
  		// translations used to move points to the origin
  		assignTinv(T1,x1,y1);
  		assignTinv(T2,x2,y2);
  
  		// take F to the new coordinate system
  		// F1 = T2'*F*T1
  		PerspectiveOps.multTranA(T2,F21,T1,Ft);
  
  		extract.process(Ft,e1,e2);
  
  		// normalize so that e[x]*e[x] + e[y]*e[y] == 1
  		normalizeEpipole(e1);
  		normalizeEpipole(e2);
  
  		assignR(R1,e1);
  		assignR(R2,e2);
  
  		// Ft = R2*Ft*R1'
  		PerspectiveOps.multTranC(R2,Ft,R1,Ft);
  
  		double f1 = e1.z;
  		double f2 = e2.z;
  		double a = Ft.get(1,1);
  		double b = Ft.get(1,2);
  		double c = Ft.get(2,1);
  		double d = Ft.get(2,2);
  
  		if( !solvePolynomial(f1,f2,a,b,c,d))
  			return false;
  
  		if( !selectBestSolution(rootFinder.getRoots(),f1,f2,a,b,c,d))
  			return false;
  
  		// find the closeset point on the two lines below to the origin
  		double t = solutionT;
  		l1.set(t*f1,1,-t);
  		l2.set(-f2*(c*t+d),a*t+b,c*t+d);
  		closestPointToOrigin(l1,e1); // recycle epipole storage
  		closestPointToOrigin(l2,e2);
  
  		// original coordinates
  		originalCoordinates(T1,R1,e1);
  		originalCoordinates(T2,R2,e2);
  
  		// back to 2D coordinates
  		p1.set(e1.x/e1.z, e1.y/e1.z);
  		p2.set(e2.x/e2.z, e2.y/e2.z);
  
  		return true;
  	}