Невозможно повернуть объект из другого места, которое не является исходной точкой

Вот ответ Counter для простейшего случая.

Это короче, чем выше, чем двухсторонний, потому что он точно выполняет именно то, что задает вопрос: сгенерируйте список того, что находится в первый список, но не второй.

from collections import Counter

lst1 = ['One', 'Two', 'Three', 'Four']
lst2 = ['One', 'Two']

c1 = Counter(lst1)
c2 = Counter(lst2)
diff = list((c1 - c2).elements())

В качестве альтернативы, в зависимости от ваших предпочтений читаемости, он делает достойный однострочный:

diff = list((Counter(lst1) - Counter(lst2)).elements())

Выход:

['Three', 'Four']

Обратите внимание, что вы можете удалить вызов list(...), если вы просто выполняете итерацию по нему.

Поскольку это решение использует счетчики, оно обрабатывает величины должным образом vs многие ответы на основе набора. Например, на этом входе:

lst1 = ['One', 'Two', 'Two', 'Two', 'Three', 'Three', 'Four']
lst2 = ['One', 'Two']

Выход:

['Two', 'Two', 'Three', 'Three', 'Four']
0
задан Nicol Bolas 21 March 2019 в 01:54
поделиться

1 ответ

Добавление элементов матрицы перевода не эквивалентно умножению на соответствующую матрицу перевода, последняя является правильным способом применения перевода.


Объяснение

[Матрица вращения R, сдвиг переноса t - матрица T, точка модели p.]

Непосредственное добавление матрицы перевода T эквивалентно предварительному умножению на нее , что означает, что смещение добавляется к выходной точке:

p --> R*p + t
  ( = T*R*p )

Таким образом, конечная точка: [ 1121]

p' = R*p - t + t = R*p
 ( = T*inv(T)*R )

Матрица перевода и ее обратная (смещенная на -t) компенсируют друг друга, и вы получаете эффективный поворот относительно начала координат.

С другой стороны, постмножение на матрицу перевода эквивалентно предварительному применению перевода:

p --> R*(p - t)
  ( = R*inv(T)*p )

Таким образом, правильная конечная точка:

[ 113]

Обратите внимание, что эффективное смещение не отменяется, потому что T и inv(T) не находятся рядом друг с другом в выражении.


Правильный код

model_final = tempModel1 * model * tempModel2;
            //    T      *   R   *   inv(T)

(Или используя любую из функций вашей библиотеки, которая умножает матрицы «традиционным» способом, как указано выше)

0
ответ дан meowgoesthedog 21 March 2019 в 01:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: