import numpy as np 

from quaternion import qrot, qinverse


def normalize_screen_coordinates(X, w, h): 
    assert X.shape[-1] == 2
    # Normalize so that [0, w] is mapped to [-1, 1], while preserving the aspect ratio
    return X/w*2 - [1, h/w]

def image_coordinates(X, w, h):
    assert X.shape[-1] == 2
    # Reverse camera frame normalization
    return (X + [1, h/w])*w/2

def world_to_camera(X, R, t):
    Rt = qinverse(R)
    Q = np.tile(Rt, (*X.shape[:-1], 1))
    V = X - t
    return qrot(Q, V)
    
def camera_to_world(X, R, t):
    Q = np.tile(R, (*X.shape[:-1], 1))
    V = X
    return qrot(Q, V) + t

