def get_obstacle_tangent_field(self, mytank, obj, r, s, b): d_edges, a_edges = self.__get_line_distances(mytank, obj) d_points = self.__get_point_distances(mytank, obj) d_close_edge = min(d_edges[0], d_edges[1], d_edges[2], d_edges[3]) d_close_point = min(d_points[0], d_points[1], d_points[2], d_points[3]) theta = a_edges[d_edges.index( d_close_edge )] #distance b/w line and point is perpendicular unless distance is to a corner if d_close_point == d_close_edge: corner = d_points.index(d_close_point) #theta = get_angle(mytank, Point(obj[corner])) #theta = theta pi/2.0 #to make tangential dx = 0 dy = 0 if d_close_edge < r: dx = -sign(cos(theta)) * float('inf') dy = -sign(sin(theta)) * float('inf') elif d_close_edge >= r and d_close_edge <= s + r: dx = -b * (s + r - d_close_edge) * cos(theta) dy = -b * (s + r - d_close_edge) * sin(theta) vector = Vector() vector.set_x_and_y(dx, dy) return vector
def get_obstacle_tangent_field(self, mytank, obj, r, s, b): d_edges, a_edges = self.__get_line_distances(mytank, obj) d_points = self.__get_point_distances(mytank, obj) d_close_edge = min(d_edges[0], d_edges[1], d_edges[2], d_edges[3]) d_close_point = min(d_points[0], d_points[1], d_points[2], d_points[3]) theta = a_edges[d_edges.index(d_close_edge)] #distance b/w line and point is perpendicular unless distance is to a corner if d_close_point == d_close_edge: corner = d_points.index(d_close_point) #theta = get_angle(mytank, Point(obj[corner])) #theta = theta pi/2.0 #to make tangential dx = 0 dy = 0 if d_close_edge < r: dx = -sign(cos(theta))*float('inf') dy = -sign(sin(theta))*float('inf') elif d_close_edge >= r and d_close_edge <= s+r: dx = -b * (s + r - d_close_edge) * cos(theta) dy = -b * (s + r - d_close_edge) * sin(theta) vector = Vector() vector.set_x_and_y(dx, dy) return vector
def get_attract_field(self, mytank, obj, r, s, a): d = get_center_distance(mytank, obj) theta = get_angle(mytank, obj) dx = 0 dy = 0 if d > (s + r): dx = a * s * cos(theta) dy = a * s * sin(theta) elif d >= r: #and d<=s+r dx = a * (d - r) * cos(theta) dy = a * (d - r) * sin(theta) #else dx = 0 dy = 0 vector = Vector() vector.set_x_and_y(dx, dy) return vector
def get_attract_field(self, mytank, obj, r, s, a): d = get_center_distance(mytank, obj) theta = get_angle(mytank, obj) dx = 0; dy = 0 if d > (s+r): dx = a * s * cos(theta) dy = a * s * sin(theta) elif d >= r: #and d<=s+r dx = a * (d-r) * cos(theta) dy = a * (d-r) * sin(theta) #else dx = 0 dy = 0 vector = Vector() vector.set_x_and_y(dx, dy) return vector
def get_repulse_field(self, mytank, obj, r, s, b): d = get_center_distance(mytank, obj) theta = get_angle(mytank, obj) dx = 0 dy = 0 if d < r: dx = -sign(cos(theta)) * float('inf') dy = -sign(sin(theta)) * float('inf') elif d >= r and d <= s + r: dx = -b * (s + r - d) * cos(theta) dy = -b * (s + r - d) * sin(theta) #else dx, dy = 0 vector = Vector() vector.set_x_and_y(dx, dy) return vector
def get_repulse_field(self, mytank, obj, r, s, b): d = get_center_distance(mytank, obj) theta = get_angle(mytank, obj) dx = 0 dy = 0 if d < r: dx = -sign(cos(theta))*float('inf') dy = -sign(sin(theta))*float('inf') elif d >= r and d <= s+r: dx = -b * (s + r - d) * cos(theta) dy = -b * (s + r - d) * sin(theta) #else dx, dy = 0 vector = Vector() vector.set_x_and_y(dx, dy) return vector