Похоже, что вы пытаетесь найти, какие фигуры пересекает линия каждой стрелки. Я вижу два недостатка в вашем коде, которые могут вызвать проблему, но я не знаю, являются ли они причиной того, что некоторые стрелки могут быть соединены только с одной формой в соответствии с вашим кодом.
Сначала вы вычисляете наклон и y-пересечение каждой стрелки. Позже для каждой фигуры вы увидите, что для значений x этой фигуры уравнение переходит в диапазон y этой фигуры. Однако, когда вы находите наклон и y-пересечение, вы используете деление, которое может вернуть число с плавающей запятой (нецелое число, такое как 2.5). Проблема в том, что range () находит только целые числа. Поэтому, если, например, наклон стрелки равен 2,143, вполне вероятно, что когда вы найдете значение y этой стрелки, оно будет не целым числом и, следовательно, не попадет в диапазон значений y форма. Решение состоит в том, чтобы заменить
if y in range(Shapes[j][1]-100,Shapes[j][1]+Shapes[j][3]+100):
с
if y > Shapes[j][1]-100 and y < Shapes[j][1]+Shapes[j][3]+100:
Также для бега по каждой фигуре вы используете
for j in range(len(Shapes)-1,0,-1):
Это означает, что если бы Shapes
имел длину 5, цикл for установил бы j в 4, 3, 2 и 1 в этом порядке. Однако при обращении к списку длиной 5 можно ссылаться от 0 до 4, а не от 1 до 4, поскольку первый элемент в списке имеет индекс 0, а не 1. Поэтому цикл for должен читать :
for j in range(len(Shapes)):
Или, если у вас есть какая-то причина для обратного отсчета, что не похоже на то, что у вас есть, но я могу что-то упустить, вы можете использовать:
for j in range(len(Shapes)-1,-1,-1):
Надеюсь, это поможет!
-Theo