Как вырезать половину Турции в День благодарения?

У меня крутая проблема. Я пытаюсь выделить именно 50% этой массы индейки. На практике это не будет 50%, но если я смогу получить 50%, я смогу понять остальное.

Моя нынешняя идея такова: сканируйте в каждом пикселе, чтобы узнать массу индейки, в пикселях. Затем, когда я хочу 50% индейки, выделите пиксели слева направо, пока я не выделил 50% пикселей.

Есть ли у кого-нибудь лучшие идеи? Это самая медленная идея с грубой силой, которая требует циклирования по каждому пикселю один раз, чтобы подсчитать пиксели и снова выделить 50% из них.

Обратите внимание, что разделение изображения по вертикали не оставит 50% индейки, так как тело индейки намного более мясисто, чем шея.

This is a Turkey

Ответ 1

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

Поэтому вам не нужно дважды зацикливаться. Вам нужно всего лишь сделать это один раз, сопоставить данные в какую-то структуру, которую вы можете ссылаться, а затем ссылаться на нее каждый раз, когда вам нужно выделить, чтобы выяснить, как далеко вы должны идти.

Например, создайте ассоциативный массив <percentage of mass (integer out of a hundred) => vertical column number (int)>

Таким образом, когда вам нужно затенять x процентов, вам нужно всего лишь перебрать столбцы cached_data [percent_to_highlight] пикселей, затенять их все, а затем вырваться из цикла полностью, как только вы достигнете его.


Для еще большей производительности у вас есть два снимка - один полностью затененный плюс ваш обычный. Ассоциативный массив должен отображать percentage => byte_offset

Для каждого изображения, которое вы хотите сгенерировать, просто memcpy или любого другого PHP-эквивалента быстрой, ранжированной копии из 0 -> byte_offset затененного изображения по не затененным и сохранить. Больше нет циклов. Вы не можете получить быстрее, чем это.

Ответ 2

Проблема не в том, чтобы иметь интеллектуальный алгоритм поверх моей головы, чтобы сделать это. Но тогда я не являюсь экспертом в CG, чтобы я мог ошибаться.

И попытка поиска такого решения может значительно увеличить временную сложность (чем O (n)), если вы в конечном итоге используете вложенные петли на n, где n - общее количество пикселей, используемых индейкой.

Вместо этого сделать два прохода очень легко реализовать (очень мало времени/усилий для реализации), а также будет O (n) пренебрегая константой 2, которая не является плохим решением. В зависимости от того, для какой цели аппаратное обеспечение, ограничение пространства и т.д. Вы пишете это решение; переход на два прохода может быть более полезным.