def get_heatmap_from_distances_all_predictors(predictions, entry_line, exit_line, half_angle_vec): # Set up the RBF Interpolator way_line, line_distances = set_up_way_line_and_distances(entry_line, exit_line) rbfLineDist = [] rbfMeasureDist = [] for pred in predictions: rbfLineDist.extend(line_distances) rbfMeasureDist.extend(pred) rbfi = RBFValley(rbfLineDist, rbfMeasureDist, 0.5) # Set up the grid to sample the RBF at line_dist_min = -INT_DIST line_dist_max = INT_DIST line_dist_resolution = 100 measure_dist_min = -10. measure_dist_max = 10. measure_dist_resolution = 60 LineDists = np.rot90(np.tile(np.linspace(line_dist_min, line_dist_max, line_dist_resolution), (measure_dist_resolution, 1))) MeasureDists = np.tile(np.linspace(measure_dist_min, measure_dist_max, measure_dist_resolution), (line_dist_resolution, 1)) D = np.zeros((np.shape(LineDists)[0]-1, np.shape(MeasureDists)[1]-1)) # Sample the RBF for j in range(np.shape(LineDists)[0]-1): for k in range(np.shape(LineDists)[1]-1): D[j,k] = rbfi(LineDists[j,k], MeasureDists[j,k]) # Transform RBF grid into XY-Space for heatmap X, Y = get_cartesian_from_distances(LineDists, MeasureDists, way_line, half_angle_vec) return X, Y, D
def plot_sample_intersection_curvature(samples, title="Sample curvature over intersection coordinates", ax=None, color=None): """Plot each sample's curvature relative to the intersection distances coordinate system""" print "Curvature calculation..." sample_steps = 100 curvatures = np.zeros((len(samples), sample_steps)) line_dists = np.array(curvatures) for i, s in enumerate(samples): track_line = s['geometry']['track_line'] entry_line = s['geometry']['entry_line'] exit_line = s['geometry']['exit_line'] try: half_angle_vec = extract_features.get_half_angle_vec(exit_line, s['X'][_feature_types.index('intersection_angle')]) # Limit path to a set s_di interval at intersection # _, track_line = split_path_at_line_dist(track_line, entry_line, half_angle_vec, entry_line.length-36.0) # track_line, _ = split_path_at_line_dist(track_line, exit_line, half_angle_vec, 36.0) curvature_sample_coords = [track_line.interpolate(dist).coords[0] for dist in np.linspace(0, track_line.length, sample_steps)] X, Y = zip(*curvature_sample_coords) way_line, dists = extract_features.set_up_way_line_and_distances(entry_line, exit_line) way_line = extract_features.extend_line(way_line, 1000.0, direction="both") # Make sure the way_line is not too short to cover the whole track LineDistances, _ = extract_features.get_distances_from_cartesian(X, Y, way_line, half_angle_vec) line_dists[i] = LineDistances - 1000.0 - INT_DIST # Shift to the actual coordinate system curvatures[i] = extract_features.get_line_curvature(track_line, sample_steps) except extract_features.NoIntersectionError as e: #plot_helper.plot_intersection(s, additional_lines=[way_line]) print e continue # fig = plt.figure() # sns.plt.hold(True) for i in range(curvatures.shape[0]): handle, = ax.plot(line_dists[i], np.degrees(curvatures[i]), color=color, linestyle='-') return handle # Only need one