def _get_pixels_near_line(pixels, line, eps): """ This can be replaced with shorter, more inefficient code. Written to boost up the speed. :param pixels: :param line: :param eps: :return: """ #return set(pixel for pixel in pixels if distance_between_line_and_point(line, pixel) <= eps) p = midpoint(line.a, line.b) u = line_unit_vector(line) n = line_normal_vector(line) half_length = line_length(line) / 2.0 eps_squared = eps**2 near_pixels = set() for point in pixels: vector = point.x - p.x, point.y - p.y perpendicular_distance = abs(np.dot(vector, n)) if perpendicular_distance > eps: continue parallel_distance = abs(np.dot(vector, u)) if parallel_distance <= half_length: near_pixels.add(point) else: if distance_between_points_squared(point, line.a) <= eps_squared or \ distance_between_points_squared(point, line.b) <= eps_squared: near_pixels.add(point) return near_pixels
def _get_pixels_near_line(pixels, line, eps): """ This can be replaced with shorter, more inefficient code. Written to boost up the speed. :param pixels: :param line: :param eps: :return: """ #return set(pixel for pixel in pixels if distance_between_line_and_point(line, pixel) <= eps) p = midpoint(line.a, line.b) u = line_unit_vector(line) n = line_normal_vector(line) half_length = line_length(line)/2.0 eps_squared = eps**2 near_pixels = set() for point in pixels: vector = point.x - p.x, point.y - p.y perpendicular_distance = abs(np.dot(vector, n)) if perpendicular_distance > eps: continue parallel_distance = abs(np.dot(vector, u)) if parallel_distance <= half_length: near_pixels.add(point) else: if distance_between_points_squared(point, line.a) <= eps_squared or \ distance_between_points_squared(point, line.b) <= eps_squared: near_pixels.add(point) return near_pixels
def label_distance_to_line(label_point, line, is_length): """ minimum distance among: end points, mid point. :param point: :param line: :return: """ mp = midpoint(line.a, line.b) distance = distance_between_points(label_point, mp) if is_length: return distance l = 1.0/line_length(line) # To favor longer line if matching near the points return min(distance, distance_between_points(label_point, line.a) + l, distance_between_points(label_point, line.b) + l)
def label_distance_to_line(label_point, line, is_length): """ minimum distance among: end points, mid point. :param point: :param line: :return: """ mp = midpoint(line.a, line.b) distance = distance_between_points(label_point, mp) if is_length: return distance l = 1.0 / line_length( line) # To favor longer line if matching near the points return min(distance, distance_between_points(label_point, line.a) + l, distance_between_points(label_point, line.b) + l)