Ejemplo n.º 1
0
def _split_arcs_at_point(angle):
    segments = deepcopy(sk2_const.STUB_ARCS)
    index = _get_arc_index(angle)
    if angle in EXTREME_ANGLES:
        index += 1
        if angle in START_ANGLES: index = 0
        points = segments[index:] + segments[:index]
        start = bezier_base_point(points[-1])
        return [
            [start, points, sk2_const.CURVE_CLOSED],
        ]
    else:
        points = segments[index + 1:] + segments[:index]
        seg_start = bezier_base_point(points[-1])
        seg_end = segments[index]
        t = 2.0 * (angle - EXTREME_ANGLES[index]) / math.pi
        new_point, new_end_point = split_bezier_curve(seg_start, seg_end, t)
        new_point[3] = sk2_const.NODE_SMOOTH
        new_end_point[3] = sk2_const.NODE_SMOOTH
        points[-1][3] = sk2_const.NODE_SMOOTH
        start = bezier_base_point(new_point)
        return [
            [
                start, [
                    new_end_point,
                ] + points + [
                    new_point,
                ], sk2_const.CURVE_CLOSED
            ],
        ]
Ejemplo n.º 2
0
Archivo: objs.py Proyecto: Scrik/sk1-wx
def _split_arcs_at_point(angle):
	segments = deepcopy(sk2_const.STUB_ARCS)
	index = _get_arc_index(angle)
	if angle in EXTREME_ANGLES:
		if angle in START_ANGLES:index = 0
		points = segments[index:] + segments[:index]
		start = bezier_base_point(points[-1])
		return [[start, points, sk2_const.CURVE_CLOSED], ]
	else:
		points = segments[index + 1:] + segments[:index]
		seg_start = bezier_base_point(points[-1])
		seg_end = segments[index]
		t = 2.0 * (angle - EXTREME_ANGLES[index]) / math.pi
		new_point, new_end_point = split_bezier_curve(seg_start, seg_end, t)
		new_point[3] = sk2_const.NODE_SMOOTH
		new_end_point[3] = sk2_const.NODE_SMOOTH
		points[-1][3] = sk2_const.NODE_SMOOTH
		start = bezier_base_point(new_point)
		return [[start, [new_end_point, ] + points + [new_point, ],
				sk2_const.CURVE_CLOSED], ]
Ejemplo n.º 3
0
def _exclude_segment_from_arcs(angle1, angle2):
    segments = deepcopy(sk2_const.STUB_ARCS)
    points = []
    start_index = 0
    end_index = 0
    start_point = None

    if angle1 in EXTREME_ANGLES:
        start_index = _get_arc_index(angle1) + 1
        if angle1 in START_ANGLES: start_index = 0
        start_point = bezier_base_point(segments[start_index - 1])
        points = segments[start_index:] + segments[:start_index]
    else:
        start_index = _get_arc_index(angle1)
        seg_start = bezier_base_point(segments[start_index - 1])
        seg_end = segments[start_index]
        t = 2.0 * (angle1 - EXTREME_ANGLES[start_index]) / math.pi
        new_point, new_end_point = split_bezier_curve(seg_start, seg_end, t)
        new_end_point[3] = sk2_const.NODE_SMOOTH
        points = segments[start_index + 1:] + segments[:start_index]
        points = [
            new_end_point,
        ] + points + [
            new_point,
        ]
        start_point = bezier_base_point(new_point)

    if angle2 in EXTREME_ANGLES and angle1 in EXTREME_ANGLES:
        end_index = _get_arc_index(angle2) + 1
        if angle2 in START_ANGLES: end_index = 0
        index = points.index(segments[end_index])
        points = points[:index]
    elif angle2 in EXTREME_ANGLES and not angle1 in EXTREME_ANGLES:
        end_index = _get_arc_index(angle2) + 1
        if angle2 in START_ANGLES: end_index = 0
        if segments[end_index] in points:
            index = points.index(segments[end_index])
        else:
            index = -1
        points = points[:index]
    elif not angle2 in EXTREME_ANGLES and angle1 in EXTREME_ANGLES:
        end_index = _get_arc_index(angle2)
        seg_start = bezier_base_point(segments[end_index - 1])
        seg_end = segments[end_index]
        t = 2.0 * (angle2 - EXTREME_ANGLES[end_index]) / math.pi
        new_point = split_bezier_curve(seg_start, seg_end, t)[0]
        index = points.index(segments[end_index])
        points = points[:index]
        points += [
            new_point,
        ]
    else:
        end_index = _get_arc_index(angle2)
        if not start_index == end_index:
            seg_start = bezier_base_point(segments[end_index - 1])
            seg_end = segments[end_index]
            t = 2.0 * (angle2 - EXTREME_ANGLES[end_index]) / math.pi
            new_point = split_bezier_curve(seg_start, seg_end, t)[0]
            if segments[end_index] in points:
                index = points.index(segments[end_index])
            else:
                index = -1
            points = points[:index]
            points += [
                new_point,
            ]
        elif angle2 > angle1:
            da = angle2 - angle1
            t = da / (math.pi / 2.0 - (angle1 - EXTREME_ANGLES[end_index]))
            seg_start = start_point
            seg_end = points[0]
            new_point = split_bezier_curve(seg_start, seg_end, t)[0]
            points = [
                new_point,
            ]
        else:
            da = angle1 - angle2
            t = 1.0 - da / (angle1 - EXTREME_ANGLES[end_index])
            seg_start = bezier_base_point(points[-2])
            seg_end = points[-1]
            points[-1] = split_bezier_curve(seg_start, seg_end, t)[0]
    return [
        [start_point, points, sk2_const.CURVE_CLOSED],
    ]
Ejemplo n.º 4
0
def _exclude_segment_from_arcs(angle1, angle2):
	segments = deepcopy(sk2_const.STUB_ARCS)
	points = []
	start_index = 0
	end_index = 0
	start_point = None

	if angle1 in EXTREME_ANGLES:
		start_index = _get_arc_index(angle1) + 1
		if angle1 in START_ANGLES:start_index = 0
		start_point = bezier_base_point(segments[start_index - 1])
		points = segments[start_index:] + segments[:start_index]
	else:
		start_index = _get_arc_index(angle1)
		seg_start = bezier_base_point(segments[start_index - 1])
		seg_end = segments[start_index]
		t = 2.0 * (angle1 - EXTREME_ANGLES[start_index]) / math.pi
		new_point, new_end_point = split_bezier_curve(seg_start, seg_end, t)
		new_end_point[3] = sk2_const.NODE_SMOOTH
		points = segments[start_index + 1:] + segments[:start_index]
		points = [new_end_point, ] + points + [new_point, ]
		start_point = bezier_base_point(new_point)

	if angle2 in EXTREME_ANGLES and angle1 in EXTREME_ANGLES:
		end_index = _get_arc_index(angle2) + 1
		if angle2 in START_ANGLES:end_index = 0
		index = points.index(segments[end_index])
		points = points[:index]
	elif angle2 in EXTREME_ANGLES and not angle1 in EXTREME_ANGLES:
		end_index = _get_arc_index(angle2) + 1
		if angle2 in START_ANGLES:end_index = 0
		if segments[end_index] in points:
			index = points.index(segments[end_index])
		else:
			index = -1
		points = points[:index]
	elif not angle2 in EXTREME_ANGLES and angle1 in EXTREME_ANGLES:
		end_index = _get_arc_index(angle2)
		seg_start = bezier_base_point(segments[end_index - 1])
		seg_end = segments[end_index]
		t = 2.0 * (angle2 - EXTREME_ANGLES[end_index]) / math.pi
		new_point = split_bezier_curve(seg_start, seg_end, t)[0]
		index = points.index(segments[end_index])
		points = points[:index]
		points += [new_point, ]
	else:
		end_index = _get_arc_index(angle2)
		if not start_index == end_index:
			seg_start = bezier_base_point(segments[end_index - 1])
			seg_end = segments[end_index]
			t = 2.0 * (angle2 - EXTREME_ANGLES[end_index]) / math.pi
			new_point = split_bezier_curve(seg_start, seg_end, t)[0]
			if segments[end_index] in points:
				index = points.index(segments[end_index])
			else:
				index = -1
			points = points[:index]
			points += [new_point, ]
		elif angle2 > angle1:
			da = angle2 - angle1
			t = da / (math.pi / 2.0 - (angle1 - EXTREME_ANGLES[end_index]))
			seg_start = start_point
			seg_end = points[0]
			new_point = split_bezier_curve(seg_start, seg_end, t)[0]
			points = [new_point, ]
		else:
			da = angle1 - angle2
			t = 1.0 - da / (angle1 - EXTREME_ANGLES[end_index])
			seg_start = bezier_base_point(points[-2])
			seg_end = points[-1]
			points[-1] = split_bezier_curve(seg_start, seg_end, t)[0]
	return [[start_point, points, sk2_const.CURVE_CLOSED], ]