def unpack_seg(seg, startpoint=None): """ Converts path pont into expected sequence. Also fixes null size control points. """ if len(seg) > 2: ctrl0 = seg[0] ctrl1 = seg[1] if startpoint: if not distance(startpoint, ctrl0): ctrl0 = midpoint(startpoint, seg[2], 0.0001) if not distance(seg[2], ctrl1): ctrl1 = midpoint(startpoint, seg[2], 0.9999) return [True, [ctrl0, ctrl1], seg[2], seg[3]] return [False, None, seg, None]
def unpack_seg(seg, startpoint=None): """ Converts path pont into expected sequence. Also fixes null size control points. """ if len(seg) > 2: ctrl0 = seg[0] ctrl1 = seg[1] if startpoint: if not distance(startpoint, ctrl0): ctrl0 = midpoint(startpoint, seg[2], 0.0001) if not distance(seg[2], ctrl1): ctrl1 = midpoint(startpoint, seg[2], 0.9999) return [True, [ctrl0, ctrl1] , seg[2], seg[3]] return [False, None, seg, None]
def _get_point_on_path(flatpath, pos): start = flatpath[0] end = flatpath[0] point = None lenght = 0 for item in flatpath[1]: start, end = end, item lenght += distance(start, end) if lenght >= pos: coef = 1.0 - (lenght - pos) / distance(start, end) point = midpoint(start, end, coef) break if not point: last = distance(start, end) coef = (pos - lenght + last) / last point = midpoint(start, end, coef) angle = get_point_angle(end, start) return point, angle
def _get_point_on_path(flat_path, pos): start = flat_path[0] end = flat_path[0] point = None l = 0 for item in flat_path[1]: start, end = end, item l += distance(start, end) if l >= pos: coef = 1.0 - (l - pos) / distance(start, end) point = midpoint(start, end, coef) break if not point: last = distance(start, end) coef = (pos - l + last) / last point = midpoint(start, end, coef) angle = get_point_angle(end, start) return point, angle
def _flat_segment(p0, p1, p2, p3, tlr): p4 = midpoint(p0, p1) p5 = midpoint(p1, p2) p6 = midpoint(p2, p3) p7 = midpoint(p4, p5) p8 = midpoint(p5, p6) p9 = midpoint(p7, p8) b = sub_points(p3, p0) s = sub_points(p9, p0) c1 = sub_points(p1, p0) c2 = sub_points(p2, p3) if abs_point(c1) > abs_point(b) or abs_point(c2) > abs_point(b): return _flat_segment(p0, p4, p7, p9, tlr) + _flat_segment( p9, p8, p6, p3, tlr) elif abs_point(b) < tlr / 2.0: return [p9, p3] else: N = normalize_point(b) if ((mult_points(c1, N)) < -tlr or (mult_points(c2, N)) > tlr or cr_points(c1, b) * cr_points(c2, b) < 0 or abs(cr_points(N, s)) > tlr): return _flat_segment(p0, p4, p7, p9, tlr) + _flat_segment( p9, p8, p6, p3, tlr) else: return [p9, p3]
def _flat_segment(p0, p1, p2, p3, tlr): p4 = midpoint(p0, p1) p5 = midpoint(p1, p2) p6 = midpoint(p2, p3) p7 = midpoint(p4, p5) p8 = midpoint(p5, p6) p9 = midpoint(p7, p8) b = sub_points(p3, p0) s = sub_points(p9, p0) c1 = sub_points(p1, p0) c2 = sub_points(p2, p3) if abs_point(c1) > abs_point(b) or abs_point(c2) > abs_point(b): return _flat_segment(p0, p4, p7, p9, tlr) + _flat_segment(p9, p8, p6, p3, tlr) elif abs_point(b) < tlr / 2.0: return [p9, p3] else: N = normalize_point(b) if ( (mult_points(c1, N)) < -tlr or (mult_points(c2, N)) > tlr or cr_points(c1, b) * cr_points(c2, b) < 0 or abs(cr_points(N, s)) > tlr ): return _flat_segment(p0, p4, p7, p9, tlr) + _flat_segment(p9, p8, p6, p3, tlr) else: return [p9, p3]
def convert_to_dashes(self, dash_size, dash_list): self.cp_indexes = [] self.cp_dict = {} approximations = get_approx_paths([ self, ])[0] cross_point_id = 0 local_length = 0.0 dash_index = 0 local_length += float(dash_list[dash_index]) * dash_size for approximation in approximations: approx_path = approximation[1] p = 1 break_flag = False while not break_flag: (p0, t0), (p1, t1) = approx_path[p - 1:p + 1] size = distance(p0, p1) if local_length > size: local_length -= size p += 1 if p >= len(approx_path): break_flag = True elif local_length == size: at = t1 self.cp_indexes.append(at) self.cp_dict[at] = cross_point_id cross_point_id += 1 dash_index += 1 if dash_index >= len(dash_list): dash_index = 0 local_length = float(dash_list[dash_index]) * dash_size p += 1 if p >= len(approx_path): break_flag = True else: cp = midpoint(p0, p1, local_length / size) at = index(cp, p0, t0, p1, t1) self.cp_indexes.append(at) self.cp_dict[at] = cross_point_id cross_point_id += 1 dash_index += 1 if dash_index >= len(dash_list): dash_index = 0 local_length += float(dash_list[dash_index]) * dash_size return self.split(False)
def convert_to_dashes(self, dash_size, dash_list): self.cp_indexes = [] self.cp_dict = {} approximations = get_approx_paths([self, ])[0] cross_point_id = 0 local_length = 0.0 dash_index = 0 local_length += float(dash_list[dash_index]) * dash_size for approximation in approximations: approx_path = approximation[1] p = 1 break_flag = False while not break_flag: (p0, t0), (p1, t1) = approx_path[p - 1:p + 1] size = distance(p0, p1) if local_length > size: local_length -= size p += 1 if p >= len(approx_path): break_flag = True elif local_length == size: at = t1 self.cp_indexes.append(at) self.cp_dict[at] = cross_point_id cross_point_id += 1 dash_index += 1 if dash_index >= len(dash_list):dash_index = 0 local_length = float(dash_list[dash_index]) * dash_size p += 1 if p >= len(approx_path): break_flag = True else: cp = midpoint(p0, p1, local_length / size) at = index(cp, p0, t0, p1, t1) self.cp_indexes.append(at) self.cp_dict[at] = cross_point_id cross_point_id += 1 dash_index += 1 if dash_index >= len(dash_list):dash_index = 0 local_length += float(dash_list[dash_index]) * dash_size return self.split(False)