def set_new_node(self, win_point): path = self.is_path_clicked(win_point) if not path is None: hit_surface = self.canvas.hit_surface segments = path.get_segments() segment = None for item in segments: start = item[0].point end = item[1].point if hit_surface.is_point_on_segment(win_point, start, end): segment = item break if segment and len(segment[1].point) > 2: before = segment[0] after = segment[1] t = hit_surface.get_t_parameter(win_point, start, end) new_p, new_end_p = libgeom.split_bezier_curve(start, end, t) self.new_node = NewPoint(self.canvas, new_p, new_end_p, before, after) self.set_selected_nodes() elif segment and len(segment[1].point) == 2: before = segment[0] after = segment[1] point = self.canvas.win_to_doc(win_point) new_p = libgeom.split_bezier_line(start, end, point) new_end_p = [] + after.point self.new_node = NewPoint(self.canvas, new_p, new_end_p, before, after) self.set_selected_nodes()
def get_t_parameter(self, win_point, start, end, t=0.5, dt=0.5): dt /= 2.0 new, new_end = libgeom.split_bezier_curve(start, end, t) ret1 = self.is_point_on_segment(win_point, start, new) ret2 = self.is_point_on_segment(win_point, new, new_end) if ret1 and ret2: return t elif ret1: return self.get_t_parameter(win_point, start, end, t - dt, dt) elif ret2: return self.get_t_parameter(win_point, start, end, t + dt, dt)
def get_vector(path, trafo): p0 = p1 = path[0] is_cp = libgeom.is_curve_point t = 0.001 for point in path[1]: p0 = point[0] if is_cp(point) else point if not p0 == p1: break elif is_cp(point) and p1 != point[2]: p0 = libgeom.split_bezier_curve(p1, point, t)[0][2] break return [libgeom.apply_trafo_to_point(p, trafo) for p in (p0, p1)]