code: def fitlin_rscale(xy,uv,verbose=False):
      
      mu = uv[:,0].mean()
      mv = uv[:,1].mean()
      mx = xy[:,0].mean()
      my = xy[:,1].mean()
  
      u = uv[:,0] - mu
      v = uv[:,1] - mv
      x = xy[:,0] - mx
      y = xy[:,1] - my
  
      Sxx = np.dot(x,x)
      Syy = np.dot(y,y)
      Sux = np.dot(u,x)
      Suy = np.dot(u,y)
      Svx = np.dot(v,x)
      Svy = np.dot(v,y)
  
      # implement parity check
      if (np.dot(Sux,Svy) > 0):
          p = 1
      else:
          p = -1
  
      XX = p*Sux + Svy
      YY = Suy - p*Svx
  
      # derive output values
      theta_deg = np.rad2deg(np.arctan2(YY,XX))% 360.0
      scale = np.sqrt(XX**2 + YY**2) / (Sxx+Syy)
      shift = (mu-mx,mv-my)
      if verbose:
          print('Linear RSCALE fit: rotation = ',theta_deg,'  scale = ',scale,'  offset = ',shift)
      coeffs = scale * fileutil.buildRotMatrix(-theta_deg)
  
      P = [coeffs[0,0],coeffs[0,1],shift[0]]
      Q = [coeffs[1,1],coeffs[1,0],shift[1]]
      return P,Q
docs: Performs a linear, orthogonal fit between matched
          lists of positions 'xy' (input) and 'uv' (output).
  
          Output: (same as for fit_arrays_general)