def interpolate(self, results, time): """ Handles the interpolation of points, need to test to make sure this is correct. May have to advise that it is unsuitable for more than pretty pictures """ data_time_points = zip(results, time) point_pairs = zip(data_time_points, data_time_points[1:]) interpolated_data = [] interpolated_time = [] num_of_points = len(results) for ((data_a, time_a), (data_b, time_b)) in point_pairs: interpolated_data.append(data_a) interpolated_time.append(time_a) distance = euclid_distance(self.scale((data_a, time_a)), self.scale((data_b, time_b))) (scaled_data_a, scaled_time_a) = self.scale((data_a, time_a)) (scaled_data_b, scaled_time_b) = self.scale((data_b, time_b)) ratio = float(distance) / self.length interpolation_count = int( (self.guide_points - num_of_points) * ratio) + 1 increment = (time_b - time_a) / float(interpolation_count) for i in range(1, interpolation_count): new_time = time_a + (i * increment) new_data = data_a + ((data_b - data_a) * ((new_time - time_a) / (time_b - time_a))) interpolated_data.append(new_data) interpolated_time.append(new_time) interpolated_data.append(data_b) interpolated_time.append(time_b) return (interpolated_data, interpolated_time)
def interpolate(self, results, time): """ Handles the interpolation of points, need to test to make sure this is correct. May have to advise that it is unsuitable for more than pretty pictures """ data_time_points = zip(results, time) point_pairs = zip(data_time_points, data_time_points[1:]) interpolated_data = [] interpolated_time = [] num_of_points = len(results) for ((data_a, time_a), (data_b, time_b)) in point_pairs: interpolated_data.append(data_a) interpolated_time.append(time_a) distance = euclid_distance(self.scale((data_a, time_a)), self.scale((data_b, time_b))) (scaled_data_a, scaled_time_a) = self.scale((data_a, time_a)) (scaled_data_b, scaled_time_b) = self.scale((data_b, time_b)) ratio = float(distance)/self.length interpolation_count = int((self.guide_points-num_of_points)*ratio)+1 increment = (time_b - time_a)/float(interpolation_count) for i in range(1, interpolation_count): new_time = time_a + (i*increment) new_data = data_a + ((data_b - data_a) * ((new_time - time_a)/(time_b - time_a))) interpolated_data.append(new_data) interpolated_time.append(new_time) interpolated_data.append(data_b) interpolated_time.append(time_b) return (interpolated_data, interpolated_time)
def right_click_handler(self, event): """ Select existing annotations, offer to edit or delete """ self.selected_annotation = None try: for annotation in WorldState.Instance().session_dict['annotations']: dist = 1 if annotation.type == WorldState.Instance()._TEXT_ARROW or annotation.type == WorldState.Instance()._ARROW: dist = point_to_line_distance((annotation.x1/float(WorldState.Instance().session_dict['max_time']), annotation.y1/float(WorldState.Instance().session_dict['max_height'])), (annotation.x2/float(WorldState.Instance().session_dict['max_time']), annotation.y2/float(WorldState.Instance().session_dict['max_height'])), (event.xdata/float(WorldState.Instance().session_dict['max_time']), event.ydata/float(WorldState.Instance().session_dict['max_height']))) else: dist = euclid_distance((annotation.x1/float(WorldState.Instance().session_dict['max_time']), annotation.y1/float(WorldState.Instance().session_dict['max_height'])), (event.xdata/float(WorldState.Instance().session_dict['max_time']), event.ydata/float(WorldState.Instance().session_dict['max_height']))) if dist < 0.025: if self.selected_annotation is None: self.selected_annotation = annotation break if self.selected_annotation is not None: self.selected_annotation.colour = 'red' refresh_plot() self.annotation_menu() refresh_plot() self.selected_annotation = None else: print "Missed annotation" except: print "Clicked outside of graph"
def cohesion_desired_vector(nearby_vectors): """ Returns desired vector based off of Cohesion. nearby_vectors : List of Vectors of nearby bots reperesenting euclidean distance from origin (bot itself) """ return average_from_vectors([vector.normalize().mult(euclid_distance((0, 0), (vector.x, vector.y))) for vector in nearby_vectors] if len(nearby_vectors) > 0 else Vector(0, 0, 0)).normalize();
def separation_desired_vector(nearby_vectors): """ Returns desired vector based off of Separation nearby_vectors : List of vectors representing euclidean distance from origin (bot itself) """ # find opposing vectors from nearby robot's vectors and weight by distance diff_vectors = [vector.invert().normalize().div(euclid_distance((0, 0), (vector.x, vector.y)) ** 2) for vector in nearby_vectors] # find average of opposing vectors to get desired vector avg_diff_vector = average_from_vectors(diff_vectors) return avg_diff_vector.normalize();
def steer_forces(cls, targets, location, velocity, max_force, max_speed=MAX_SPEED): target_vels = [target.sub(location) for target in targets] weighted_target_vels = [ t.mult(euclid_distance(Vector.null().coords(), t.coords())**2) for t in target_vels ] return Vector.average_many(weighted_target_vels).set_mag( max_speed).sub(velocity).limit(max_force)
def calc_line_length(self, results, time): """ Need to know total length of the line for interpolation purposes Have to scale it from data space to visual space """ data_time_points = zip(results, time) point_pairs = zip(data_time_points, data_time_points[1:]) total_dist = 0 for (point_a, point_b) in point_pairs: dist = euclid_distance(self.scale(point_a), self.scale(point_b)) total_dist += dist return total_dist
def right_click_handler(self, event): """ Select existing annotations, offer to edit or delete """ self.selected_annotation = None try: for annotation in WorldState.Instance( ).session_dict['annotations']: dist = 1 if annotation.type == WorldState.Instance( )._TEXT_ARROW or annotation.type == WorldState.Instance( )._ARROW: dist = point_to_line_distance(( annotation.x1 / float(WorldState.Instance().session_dict['max_time']), annotation.y1 / float(WorldState.Instance().session_dict['max_height']) ), ( annotation.x2 / float(WorldState.Instance().session_dict['max_time']), annotation.y2 / float(WorldState.Instance().session_dict['max_height']) ), (event.xdata / float(WorldState.Instance().session_dict['max_time']), event.ydata / float( WorldState.Instance().session_dict['max_height']))) else: dist = euclid_distance(( annotation.x1 / float(WorldState.Instance().session_dict['max_time']), annotation.y1 / float(WorldState.Instance().session_dict['max_height']) ), (event.xdata / float(WorldState.Instance().session_dict['max_time']), event.ydata / float( WorldState.Instance().session_dict['max_height']))) if dist < 0.025: if self.selected_annotation is None: self.selected_annotation = annotation break if self.selected_annotation is not None: self.selected_annotation.colour = 'red' refresh_plot() self.annotation_menu() refresh_plot() self.selected_annotation = None else: print "Missed annotation" except: print "Clicked outside of graph"
def filter_nearby_vectors(range): for bot in nearby_vectors: if euclid_distance(bot.coords(), blank_v.coords()) > range: nearby_vectors.remove(bot)
def __init__(self, x, y): self.x = x self.y = y self.mag = euclid_distance((0, 0), (x, y))