def set_slants(self, start_slant, end_slant): if start_slant is not None: start_slant = Heading(start_slant) if end_slant is not None: end_slant = Heading(end_slant) self.start_slant = start_slant self.end_slant = end_slant # Intersect the slant lines with the left and right offset circles # to find the corners. center_left, radius_left = self.offset_circle_left() center_right, radius_right = self.offset_circle_right() # Start corners. if start_slant is None: v_slant = vec.vfrom(self.center, self.a) else: v_slant = vec.from_heading(start_slant.rad) a = self.a b = vec.add(self.a, v_slant) points_left = intersect_circle_line(center_left, radius_left, a, b) points_right = intersect_circle_line(center_right, radius_right, a, b) if len(points_left) == 0 or len(points_right) == 0: self.start_joint_illegal = True return self.a_left = Point(*closest_point_to(self.a, points_left)) self.a_right = Point(*closest_point_to(self.a, points_right)) # End corners. if end_slant is None: v_slant = vec.vfrom(self.center, self.b) else: v_slant = vec.from_heading(end_slant.rad) a = self.b b = vec.add(self.b, v_slant) points_left = intersect_circle_line(center_left, radius_left, a, b) points_right = intersect_circle_line(center_right, radius_right, a, b) if len(points_left) == 0 or len(points_right) == 0: self.end_joint_illegal = True return self.b_left = Point(*closest_point_to(self.b, points_left)) self.b_right = Point(*closest_point_to(self.b, points_right)) self.check_degenerate_segment()
def set_slants(self, start_slant, end_slant): if start_slant is not None: start_slant = Heading(start_slant) if end_slant is not None: end_slant = Heading(end_slant) self.start_slant = start_slant self.end_slant = end_slant # Intersect the slant lines with the left and right offset lines # to find the corners. line_left = self.offset_line_left() line_right = self.offset_line_right() # Start corners. if start_slant is None: v_slant = vec.perp(self._vector()) else: v_slant = vec.from_heading(start_slant.rad) a = self.a b = vec.add(self.a, v_slant) left = intersect_lines(a, b, line_left[0], line_left[1]) right = intersect_lines(a, b, line_right[0], line_right[1]) if left is None or right is None: self.start_joint_illegal = True else: self.a_left = Point(*left) self.a_right = Point(*right) # End corners. if end_slant is None: v_slant = vec.perp(self._vector()) else: v_slant = vec.from_heading(end_slant.rad) a = self.b b = vec.add(self.b, v_slant) left = intersect_lines(a, b, line_left[0], line_left[1]) right = intersect_lines(a, b, line_right[0], line_right[1]) if left is None or right is None: self.end_joint_illegal = True else: self.b_left = Point(*left) self.b_right = Point(*right) # Done, make sure we didn't cross self.check_degenerate_segment()
def _vector(self, length=1): """ Create a vector pointing in the same direction as the pen, with the specified length. """ return vec.from_heading(self._heading.rad, length)