Посещение точек в треугольнике в произвольном порядке

То, что у вас есть, правильно:

cart = carts.filter(Q(status='completed') | Q(status='paid') | Q(status='started'))

Вы можете просто использовать in:

cart = carts.filter(status__in=['completed', 'paid', 'started'])

<час>

Когда вы говорите, что это не работает, я предполагаю, что вы не получаете никаких результатов. Вам следует: * проверить фактические status значения, которые у вас есть в БД, и те, что находятся в предварительно отфильтрованном списке carts:

set(Cart.objects.values_list('status', flat=True))    # full list of statuses
set(carts.values_list('status', flat=True))    # statuses for your pre-filter

Также рассмотрите возможность использования констант для ваших состояний (вместо строки).

5
задан Procedural Throwback 2 October 2008 в 06:35
поделиться

5 ответов

Так как Вы хотите гарантировать посещение каждого пикселя однажды и только однажды, вероятно, лучше думать с точки зрения пикселей, а не реальных треугольников. Можно нарезать треугольники горизонтально и получить набор горизонтальных строк развертки. Соедините строки развертки вместе, и Вы преобразовали свой "треугольник" в длинную линию. Примените свой алгоритм посещения точки к Вашей длинной цепочке строк развертки.

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

Править: Для преобразования двух точек в линейный сегмент можно искать сканирующее преобразование Bresenham. После того как Вы преобразовали эти 3 линейных сегмента в серию точек, можно поместить все точки в блок и группу все точки y. В том же y-значении вид указывает x. Самый маленький x в y-значении является начать точкой строки развертки, и самый большой x в y-значении является конечной точкой строки развертки. Это называют "треугольником преобразования сканирования". Можно найти больше информации если Вы Google.

3
ответ дан 14 December 2019 в 19:30
поделиться

Один метод должен поместить все пиксели в массив и затем переставить массив (это - O (n)), затем посетите пиксели в порядке в переставленном массиве. Это могло потребовать довольно большой памяти все же.

0
ответ дан 14 December 2019 в 19:30
поделиться

Вот решение для Треугольного Выбора Точки.

То, что необходимо сделать, выбирают два вектора (стороны) треугольника, умножают каждого со случайным числом в [0,1] и складывают их. Это обеспечит равномерное распределение в четырехугольнике, определенном векторами. Необходимо будет проверить, находится ли результат в исходном треугольнике; если это или не преобразовывает его, въезжают задним ходом или просто отбрасывают его и попробовали еще раз.

2
ответ дан 14 December 2019 в 19:30
поделиться

Я рассмотрел бы строки треугольника как одна строка, которая сокращается в сегменты. Сегменты были бы сохранены в массиве где длина сегмента, также сохраненного, а также смещение в общей длине строк. Затем в зависимости от значения O, можно выбрать, какой элемент массива содержит пиксель, который Вы хотите потянуть в тот момент на основе этой информации и нарисовать пиксель на основе значений в элементе.

0
ответ дан 14 December 2019 в 19:30
поделиться

Вот метод, который тратит впустую некоторое процессорное время, но вероятно не пропадает впустую так, как более сложный метод сделал бы.

Вычислите прямоугольник, который ограничивает треугольник. Будет легко "линеаризовать" тот прямоугольник, каждая строка развертки, сопровождаемая следующим. Используйте алгоритм, который Вы уже знаете для пересечения пикселей прямоугольника. При ударе каждого пикселя проверьте, находится ли пиксель в треугольнике, и если не затем пропускают его.

0
ответ дан 14 December 2019 в 19:30
поделиться
Другие вопросы по тегам:

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