Пример #1
0
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
def get_collision_between_lines_with_points(line1, line2, precision=PRECISION):  # get_line_collision_point
    """ returns collision between 2 lines defined by 2 points """
    point_d1, point_d2 = line1
    point_l1, point_l2 = line2
    # ==
    return get_collision_between_lines(
        (point_d1, points_diff(point_d1, point_d2)), (point_l1, points_diff(point_l1, point_l2)), precision=precision
    )
Пример #3
0
def get_collision_between_lines(line1, line2, precision=PRECISION):  # get_line_vector_collision_point
    """ returns collision between 2 lines defined by a point and the direction vector """
    point_1, director_1 = line1
    point_2, director_2 = line2
    # ==
    if not is_same(det(director_1, director_2), 0, precision=precision):
        return tuple_sum(
            point_1,
            tuple_float_mult(
                director_1, det(points_diff(point_1, point_2), director_2) / float(det(director_1, director_2))
            ),
        )
    if is_same(det(points_diff(point_1, point_2), director_1), 0, precision=precision):
        return point_1  # ou point_2, c'est la meme chose : les droites sont confondues
    return None
Пример #4
0
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
Пример #5
0
def _is_in_angle(p1, center, p2, point_to_check):
    v1 = normalize(points_diff(center, p1))
    v2 = normalize(points_diff(center, p2))
    v = normalize(points_diff(center, point_to_check))
    return cross_product(v1, v) <= PRECISION and cross_product(v2, v) >= PRECISION