clifford.tools.g3c.val_rotor_between_objects_explicit

g3c.val_rotor_between_objects_explicit

Lasenby and Hadfield AGACSE2018 For any two conformal objects X1 and X2 this returns a rotor that takes X1 to X2

Implements an optimised version of:

gamma1 = (X1 * X1)[0]
gamma2 = (X2 * X2)[0]

M12 = X1*X2 + X2*X1
K = 2 + gamma1*M12

if np.sum(np.abs(K.value)) < 0.0000001:
    return 1 + 0*e1

if sum(np.abs(M12(4).value)) > 0.0000001:
    lamb = (-(K(4) * K(4)))[0]
    mu = K[0]**2 + lamb
    root_mu = np.sqrt(mu)
    if abs(lamb) < 0.0000001:
        beta = 1.0/(2*np.sqrt(K[0]))
    else:
        beta_sqrd = 1/(2*(root_mu + K[0]))
        beta = np.sqrt(beta_sqrd)
    R = ( beta*K(4) - (1/(2*beta)) )*(1 + gamma1*X2*X1)/(root_mu)
    return R
else:
    return (1 + gamma1*X2*X1)/(np.sqrt(abs(K[0])))