def test_calibration(test_x, test_y): def valid(a, b, name): d = sphere.spherical_distance(a,b) if d<1e-6: print "Testing %s: OK, error is within %.4e" % (name, d) return True else: print "Testing %s: FAIL! error exceeds 1e-6 at %.4e" % (name, d) return False lat, lon = sphere.tuio_to_polar(test_x, test_y) lon += np.pi assert(valid(cal.test_calibrated_touch(test_x, test_y, 'gp'),gp_adjust(lon, lat, gp_x, gp_y), 'GP')) assert(valid(cal.test_calibrated_touch(test_x, test_y, 'cubic'),cubic_polar_adjust(lon, lat, cubic_coeff), 'cubic')) assert(valid(cal.test_calibrated_touch(test_x, test_y, 'quadratic'),quadratic_polar_adjust(lon, lat, quadratic_coeff),'quadratic')) assert(valid(cal.test_calibrated_touch(test_x, test_y, 'constant'),polar_adjust(lon, lat, correction_factor), 'constant')) assert(valid(cal.test_calibrated_touch(test_x, test_y, 'none'),polar_adjust(lon, lat, 1), 'none'))
def augment_calibration(calibration): xs, ys = calibration["tuio_x"], calibration["tuio_y"] lonlat = np.array([sphere.tuio_to_polar(x,y) for x,y in zip(xs,ys)]) calibration["touch_lon"],calibration["touch_lat"] = lonlat[:,0], lonlat[:,1] lons,lats = calibration["target_lon"], calibration["target_lat"] xys = np.array([sphere.polar_to_tuio(lon,lat) for lon,lat in zip(lons,lats)]) calibration["target_x"],calibration["target_y"] = xys[:,0], xys[:,1] # remove extreme targets which could not be hit (distance > 1 radian) calibration["target_lon"] = calibration["target_lon"] % (2*np.pi) - np.pi calibration["touch_lon"] = calibration["touch_lon"] % (2*np.pi) - np.pi # calculate co-ordinates in azimuthal space lons, lats = calibration["touch_lon"], calibration["touch_lat"] xy = np.array([sphere.polar_to_az(lon,lat) for lon,lat in zip(lons,lats)]) calibration["touch_az_x"],calibration["touch_az_y"] = xy[:,0], xy[:,1] lons, lats = calibration["target_lon"], calibration["target_lat"] xy = np.array([sphere.polar_to_az(lon,lat) for lon,lat in zip(lons,lats)]) calibration["target_az_x"],calibration["target_az_y"] = xy[:,0], xy[:,1]