コード例 #1
0
ファイル: intersect.py プロジェクト: LBdN/labs
def is_on_line(seg_start, seg_end, point, precision=PRECISION):
    if is_same(seg_start, point, precision=precision) or is_same(seg_end, point, precision=precision):
        return True
    if is_same(seg_start, seg_end, precision=precision):
        return False
    vector_from_start_to_end = points_diff(seg_start, seg_end)
    vector_from_start_to_point = points_diff(seg_start, point)
    angle = math.degrees(
        math.acos(
            min(
                1.0,
                max(
                    -1.0,
                    dot_product(vector_from_start_to_end, vector_from_start_to_point)
                    / (magnitude(vector_from_start_to_end) * magnitude(vector_from_start_to_point)),
                ),
            )
        )
    )
    # ==
    return (
        is_same(angle, 0, precision=precision)
        or is_same(angle, 360.0, precision=precision)
        or is_same(angle, -360.0, precision=precision)
    )
コード例 #2
0
ファイル: intersect.py プロジェクト: LBdN/labs
def actual_intersection(segments, i, j):
    segment = segments[i]
    other_segment = segments[j]
    if is_same(dot_product(points_diff(*segment), points_diff(*other_segment)), 0.0):
        return False

    for index1, p1 in enumerate(segment):
        for index2, p2 in enumerate(other_segment):
            if is_same(p1, p2):
                segment1 = segments[i - 1][index1], segments[(i + 1) % len(segments)][index1]
                segment2 = segments[j - 1][index2], segments[(j + 1) % len(segments)][index2]
                if have_common_point(segment1, segment2):
                    return False
                if not segments_are_intersecting(segment1, segment2):
                    return False
                # ==
                if index1 == 0:
                    connected_segment1 = segments[i - 1]
                else:
                    connected_segment1 = segments[(i + 1) % len(segments)]
                if index2 == 0:
                    connected_segment2 = segments[j - 1]
                else:
                    connected_segment2 = segments[(j + 1) % len(segments)]
                if is_same(
                    cross_product(points_diff(*connected_segment1), points_diff(*other_segment)), 0.0
                ) or is_same(cross_product(points_diff(*connected_segment2), points_diff(*segment)), 0.0):
                    return False
                center = p1
                if _is_in_angle(segment1[0], center, segment1[1], segment2[0]) == _is_in_angle(
                    segment1[0], center, segment1[1], segment2[1]
                ):
                    return False

    for index1, p1 in enumerate(segment):
        if is_on_segment(other_segment[0], other_segment[1], p1):
            full_segment = (segments[i - 1][index1], segments[(i + 1) % len(segments)][index1])
            if have_common_point(other_segment, full_segment):
                return False
            if not segments_are_intersecting(full_segment, other_segment):
                return False

    for index2, p2 in enumerate(other_segment):
        if is_on_segment(segment[0], segment[1], p2):
            full_segment = (segments[j - 1][index2], segments[(j + 1) % len(segments)][index2])
            if have_common_point(segment, full_segment):
                return False
            if not segments_are_intersecting(full_segment, segment):
                return False

    return True