Пример #1
0
    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)
Пример #2
0
    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)
Пример #3
0
 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"
Пример #4
0
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();
Пример #5
0
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();
Пример #6
0
 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)
Пример #7
0
    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
Пример #8
0
 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"
Пример #9
0
    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
Пример #10
0
 def filter_nearby_vectors(range):
     for bot in nearby_vectors:
         if euclid_distance(bot.coords(), blank_v.coords()) > range:
             nearby_vectors.remove(bot)
Пример #11
0
 def __init__(self, x, y):
     self.x = x
     self.y = y
     self.mag = euclid_distance((0, 0), (x, y))