Как проверить, пересекаются ли два отрезка в autocad с использованием python? - PullRequest
0 голосов
/ 18 июня 2019

Если было два отрезка (не линия), как я могу узнать, пересекаются ли они с помощью python?Уравнение линии определяет, что эти сегменты пересекаются, даже если они не соприкасаются друг с другом, поскольку уравнение бесконечно расширяет линию.

пример

Достигли ли сегменты друг друга,код ниже возвращает «пересечено».

def intersection(s1, s2):
    segment_endpoints = []
    left = max(min(s1[0], s1[2]), min(s2[0], s2[2]))
    right = min(max(s1[0], s1[2]), max(s2[0], s2[2]))
    top = max(min(s1[1], s1[3]), min(s2[1], s2[3]))
    bottom = min(max(s1[1], s1[3]), max(s2[1], s2[3]))
    if top > bottom or left > right:
        segment_endpoints = []
    elif top == bottom and left == right:
        segment_endpoints.append(left)
        segment_endpoints.append(top)
    else:
        segment_endpoints.append(left)
        segment_endpoints.append(bottom)
        segment_endpoints.append(right)
        segment_endpoints.append(top)
    return segment_endpoints


def intersectLines(pt1, pt2, ptA, ptB):
    DET_TOLERANCE = 0.00000001

    # the first line is pt1 + r*(pt2-pt1)
    # in component form:
    x1, y1 = pt1;
    x2, y2 = pt2
    dx1 = x2 - x1;
    dy1 = y2 - y1

    # the second line is ptA + s*(ptB-ptA)
    x, y = ptA;
    xB, yB = ptB;
    dx = xB - x;
    dy = yB - y;

    DET = (-dx1 * dy + dy1 * dx)

    if math.fabs(DET) < DET_TOLERANCE: return (0, 0, 0, 0, 0)

    # now, the determinant should be OK
    DETinv = 1.0 / DET

    # find the scalar amount along the "self" segment
    r = DETinv * (-dy * (x - x1) + dx * (y - y1))

    # find the scalar amount along the input line
    s = DETinv * (-dy1 * (x - x1) + dx1 * (y - y1))

    # return the average of the two descriptions
    xi = (x1 + r * dx1 + x + s * dx) / 2.0
    yi = (y1 + r * dy1 + y + s * dy) / 2.0
    return (xi, yi, 1, r, s)



line_list = [object for object in acad.iter_objects() if(object.objectName == "AcDbLine")]
print("Line_list:", len(line_list))


c = 0
for x in range(len(line_list)):
    for y in range(len(line_list)):
        if x == y: continue
        c += 1
        s1 = line_list[x].startpoint[:2] + line_list[x].endpoint[:2]
        s2 = line_list[y].startpoint[:2] + line_list[y].endpoint[:2]

        print(c, "x:", x, "y:", y, "s1:", s1, "s2:", s2)
        print(intersectLines(line_list[x].startpoint[:2] , line_list[x].endpoint[:2], line_list[y].startpoint[:2] , line_list[y].endpoint[:2] ))

1 Ответ

1 голос
/ 18 июля 2019

Я думаю, что вы просто пропускаете проверку, чтобы увидеть, находится ли пересечение pt в ограничительной рамке двух сечений, то есть xi должно быть между x1 и x2.То же самое для y - для обоих сегментов.Рассмотрим две прямые x = y и y = 1. Они пересекаются в 1,1.Но если ваш сегмент определен из (0,0), (0,5,0,5), он не пересекается.

...