def test_simple(self): """ Test distance using easy geometry """ a = (0, 0) b = (1, 0) # Move the point along another line segment at 1 unit away for e in ((0, 1), (0.5, 1), (1, 1), (0.5, -1)): dist = perpendicular_distance(a, b, e) self.assertAlmostEqual(dist, 1) # Move the point along the original segment itself => dist == 0 for e in ((0, 0), (0.5, 0), (1, 0)): dist = perpendicular_distance(a, b, e) self.assertAlmostEqual(dist, 0)
def get_hover(self, vpos): """ Check if the given position is on/near a selection edge or inside the selection :return: (bool) Return False if not hovering, or the type of hover """ if self.v_edges: vx, vy = vpos # If position outside outer box if (not self.v_edges["o_l"] < vx < self.v_edges["o_r"] or not self.v_edges["o_t"] < vy < self.v_edges["o_b"]): return gui.HOVER_NONE if self.edit_mode == EDIT_MODE_BOX: # If position inside inner box if (self.v_edges["i_l"] < vx < self.v_edges["i_r"] and self.v_edges["i_t"] < vy < self.v_edges["i_b"]): # logging.debug("Selection hover") return gui.HOVER_SELECTION else: hover = gui.HOVER_NONE if vx < self.v_edges["i_l"]: # logging.debug("Left edge hover") hover |= gui.HOVER_LEFT_EDGE elif vx > self.v_edges["i_r"]: # logging.debug("Right edge hover") hover |= gui.HOVER_RIGHT_EDGE if vy < self.v_edges["i_t"]: logging.debug("Top edge hover") hover |= gui.HOVER_TOP_EDGE elif vy > self.v_edges["i_b"]: logging.debug("Bottom edge hover") hover |= gui.HOVER_BOTTOM_EDGE return hover elif self.edit_mode == EDIT_MODE_POINT: if (self.v_edges["s_l"] < vx < self.v_edges["s_r"] and self.v_edges["s_t"] < vy < self.v_edges["s_b"]): return gui.HOVER_START elif (self.v_edges["e_l"] < vx < self.v_edges["e_r"] and self.v_edges["e_t"] < vy < self.v_edges["e_b"]): return gui.HOVER_END elif ( # If position inside inner box self.v_edges["i_l"] < vx < self.v_edges["i_r"] and self.v_edges["i_t"] < vy < self.v_edges["i_b"]): dist = util.perpendicular_distance(self.select_v_start_pos, self.select_v_end_pos, vpos) if dist < self.hover_margin: return gui.HOVER_LINE return gui.HOVER_NONE
def test_null_line(self): """ Test distance when the line is just a single point""" a = (1, 0) b = (1, 0) e = (0, 0) # Follow a segment at 1 unit away dist = perpendicular_distance(a, b, e) self.assertAlmostEqual(dist, 1)
def get_hover(self, vpos): """ Check if the given position is on/near a selection edge or inside the selection :return: (bool) Return False if not hovering, or the type of hover """ if self.v_edges: vx, vy = vpos # If position outside outer box if ( not self.v_edges["o_l"] < vx < self.v_edges["o_r"] or not self.v_edges["o_t"] < vy < self.v_edges["o_b"] ): return gui.HOVER_NONE if self.edit_mode == EDIT_MODE_BOX: # If position inside inner box if ( self.v_edges["i_l"] < vx < self.v_edges["i_r"] and self.v_edges["i_t"] < vy < self.v_edges["i_b"] ): # logging.debug("Selection hover") return gui.HOVER_SELECTION else: hover = gui.HOVER_NONE if vx < self.v_edges["i_l"]: # logging.debug("Left edge hover") hover |= gui.HOVER_LEFT_EDGE elif vx > self.v_edges["i_r"]: # logging.debug("Right edge hover") hover |= gui.HOVER_RIGHT_EDGE if vy < self.v_edges["i_t"]: logging.debug("Top edge hover") hover |= gui.HOVER_TOP_EDGE elif vy > self.v_edges["i_b"]: logging.debug("Bottom edge hover") hover |= gui.HOVER_BOTTOM_EDGE return hover elif self.edit_mode == EDIT_MODE_POINT: if ( self.v_edges["s_l"] < vx < self.v_edges["s_r"] and self.v_edges["s_t"] < vy < self.v_edges["s_b"] ): return gui.HOVER_START elif ( self.v_edges["e_l"] < vx < self.v_edges["e_r"] and self.v_edges["e_t"] < vy < self.v_edges["e_b"] ): return gui.HOVER_END elif ( # If position inside inner box self.v_edges["i_l"] < vx < self.v_edges["i_r"] and self.v_edges["i_t"] < vy < self.v_edges["i_b"] ): dist = util.perpendicular_distance(self.select_v_start_pos, self.select_v_end_pos, vpos) if dist < self.hover_margin: return gui.HOVER_LINE return gui.HOVER_NONE