def draw_angle2(image, angle, offset=(0, 0), color=(0, 0, 255), thickness=1, color2=(255, 0, 0), thickness2=1): line0 = instantiators['line'](angle.b, angle.a) line1 = instantiators['line'](angle.b, angle.c) # draw_line(image, line0, offset=offset, color=color, thickness=thickness) # draw_line(image, line1, offset=offset, color=color, thickness=thickness) # radius = 0.3 * min(line_length(line0), line_length(line1)) radius = 12 circle = instantiators['circle'](angle.b, radius) # FIXME : this arc definition is broken. Okay for now, but needs to fix. arc = instantiators['arc'](circle, angle.a, angle.c) caa = cartesian_angle(arc.circle.center, arc.a) * 180 / np.pi cab = cartesian_angle(arc.circle.center, arc.b) * 180 / np.pi if caa > cab: caa -= 360 if cab - caa > 95: return image center = tuple(round_vector(np.array(arc.circle.center) + offset)) radius = int(round(arc.circle.radius)) return cv2.ellipse(image, center, (radius, radius), 0, caa, cab, color2, thickness2)
def draw_arc(image, arc, offset=(0, 0), color=(0, 0, 255), thickness=1): caa = cartesian_angle(arc.circle.center, arc.a) * 180/np.pi cab = cartesian_angle(arc.circle.center, arc.b) * 180/np.pi if caa > cab: caa -= 360 center = tuple(round_vector(np.array(arc.circle.center) + offset)) radius = int(round(arc.circle.radius)) cv2.ellipse(image, center, (radius, radius), 0, caa, cab, color, thickness)
def label_distance_to_angle(label_point, angle): """ If outside of the convex area, then distance is very high. :param point: :param angle: :return: """ caa = cartesian_angle(angle.b, angle.a) cam = cartesian_angle(angle.b, label_point) cac = cartesian_angle(angle.b, angle.c) dm = signed_distance_between_cartesian_angles(cam, caa) dc = signed_distance_between_cartesian_angles(cac, caa) cav = caa + dc/2.0 if cav > 2*np.pi: cav -= 2*np.pi cad = min(signed_distance_between_cartesian_angles(cam, cav), signed_distance_between_cartesian_angles(cav, cam)) dist = distance_between_points(label_point, angle.b) if dc > dm: return dist*(1+cad+dc) else: return 100*dist # effectively infinite
def label_distance_to_angle(label_point, angle): """ If outside of the convex area, then distance is very high. :param point: :param angle: :return: """ caa = cartesian_angle(angle.b, angle.a) cam = cartesian_angle(angle.b, label_point) cac = cartesian_angle(angle.b, angle.c) dm = signed_distance_between_cartesian_angles(cam, caa) dc = signed_distance_between_cartesian_angles(cac, caa) cav = caa + dc / 2.0 if cav > 2 * np.pi: cav -= 2 * np.pi cad = min(signed_distance_between_cartesian_angles(cam, cav), signed_distance_between_cartesian_angles(cav, cam)) dist = distance_between_points(label_point, angle.b) if dc > dm: return dist * (1 + cad + dc) else: return 100 * dist # effectively infinite
def Parallel(line_0, line_1): a0 = cartesian_angle(*line_0) a1 = cartesian_angle(*line_1) + np.pi / 2 da = horizontal_angle(signed_distance_between_cartesian_angles(a0, a1)) return Equals(da, np.pi / 2)
def Perpendicular(l0, l1): # return Equals((l0.b.y-l0.a.y)*(l1.b.y-l1.a.y), (l0.a.x-l0.b.x)*(l1.b.x-l1.a.x)) a0 = cartesian_angle(*l0) a1 = cartesian_angle(*l1) da = horizontal_angle(signed_distance_between_cartesian_angles(a0, a1)) return Equals(da, np.pi / 2)