docs: protected void computeBarycentricCoordinates(FastQueue<Point3D_F64> controlWorldPts,
  												 DMatrixRMaj alphas,
  												 List<Point3D_F64> worldPts )
  	{
  		alphas.reshape(worldPts.size(),numControl,false);
  		v_temp.reshape(3,1);
  		A_temp.reshape(3, numControl - 1);
  
  		for( int i = 0; i < numControl-1; i++ ) {
  			Point3D_F64 c = controlWorldPts.get(i);
  			A_temp.set(0, i, c.x - meanWorldPts.x);
  			A_temp.set(1, i, c.y - meanWorldPts.y);
  			A_temp.set(2, i, c.z - meanWorldPts.z);
  		}
  
  		// invert the matrix
  		solverPinv.setA(A_temp);
  		A_temp.reshape(A_temp.numCols, A_temp.numRows);
  		solverPinv.invert(A_temp);
  
  		w_temp.reshape(numControl - 1, 1);
  
  		for( int i = 0; i < worldPts.size(); i++ ) {
  			Point3D_F64 p = worldPts.get(i);
  			v_temp.data[0] = p.x- meanWorldPts.x;
  			v_temp.data[1] = p.y- meanWorldPts.y;
  			v_temp.data[2] = p.z- meanWorldPts.z;
  
  			MatrixVectorMult_DDRM.mult(A_temp, v_temp, w_temp);
  
  			int rowIndex = alphas.numCols*i;
  			for( int j = 0; j < numControl-1; j++ )
  				alphas.data[rowIndex++] = w_temp.data[j];
  
  			if( numControl == 4 )
  				alphas.data[rowIndex] = 1 - w_temp.data[0] - w_temp.data[1] - w_temp.data[2];
  			else
  				alphas.data[rowIndex] = 1 - w_temp.data[0] - w_temp.data[1];
  		}
  	}