예제 #1
0
파일: contour.py 프로젝트: sahwar/sk1-wx
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]
예제 #2
0
파일: contour.py 프로젝트: Scrik/sk1-wx
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]
예제 #3
0
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
예제 #4
0
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
예제 #5
0
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]
예제 #6
0
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]
예제 #7
0
 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)
예제 #8
0
파일: shaping.py 프로젝트: Scrik/sk1-wx
	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)