добавление элементов в список между индексами при итерации по этому списку в python - PullRequest
1 голос
/ 05 мая 2020

Я пытаюсь перебрать список трехмерных точек и создать новую точку между каждой группой из двух точек, расстояние между которыми превышает постоянное значение.

Я безуспешно пытался использовать буфер , моя основная проблема заключается в том, что каждая вновь вставленная точка должна соответствовать порядку в списке и быть вставлена ​​между двумя точками, между которыми она находится геометрически.

import math

#recieve v1 and maxDist from Blender

buffer = v1
offset = 0

for i in range(len(v1) - 1):
    p1 = v1[i] 
    p2 = v1[i+1]

    if (p1 - p2).length > maxDist :
        middleNode = ((p1.x+p2.x)/2,(p1.y+p2.y)/2,(p1.z+p2.z)/2)
        offset = offset + 1 # 
        buffer.insert(i + offset, middleNode)

v2 = buffer

# send back v2 to Blender

вывод, который у меня сейчас есть, соответствует этому, хотя идеально ожидается подразделенный круг enter image description here

1 Ответ

2 голосов
/ 05 мая 2020

Ваше решение может быть проще, если вы используете один список вместо двух. Мой подход был бы следующим:

i = 0
while i < len(v1) - 1: 
    p1 = v1[i]
    p2 = v1[i + 1]

    if (p1 - p2).length > maxDist:
        middleNode = ((p1.x+p2.x)/2,(p1.y+p2.y)/2,(p1.z+p2.z)/2)

        # v1[:i] = v1[0..i] and v1[i:] = v1[i..] 
        v1 = v1[:i] + middleNode + v1[i:] 
        i += 2
    else:
        i += 1

Или, если понимание списка не является вариантом:

i = 0
while i < len(v1) - 1:
    p1 = v1[i]
    p2 = v1[i]

    if (p1 - p2).length > maxDist:
        middleNode = ((p1.x+p2.x)/2,(p1.y+p2.y)/2,(p1.z+p2.z)/2)
        v1.insert(i + 1, middleNode)
        i += 2
    else:
        i += 1
...