У меня есть приложение для рисования в Android, которое позволяет пользователю рисовать пальцем, а затем сохраняет полученные фигуры как Android Path
s. Чтобы разрешить пользователю удалять отдельные Path
s, которые они нарисовали, я применил this solution, который использует ограничивающий Rect
для каждого Path
, а затем использует внутренний многомерный двоичный массив для представления пикселей внутри ограничивающего Rect
. Затем я заполняю массив, беря контрольные точки Пути и отслеживая его по математическому уравнению для квадратичной кривой Безье, устанавливая каждый элемент в массиве, который должен иметь пиксель под ним до 1.Проблемы столкновения/решения Android Path
Используя приведенную выше настройку, когда в режиме стирания я сначала проверяю на столкновение между пальцем пользователя и ограничивающим Rect
, и если это происходит, я затем проверяю, установлен ли пиксель, затронутый пользователем, в массиве 1.
Теперь, когда пользователь загружает заметку, я загружаю все фигуры в объекты «stroke» ArrayList
, чтобы затем я мог легко их отображать и прокручивать их, проверяя на столкновение в режиме стирания. Я также храню Rect
и двоичный массив с штрихами в пользовательском объекте. Все работает так, как ожидалось, но объем памяти для хранения всех этих данных, в частности двоичного массива для ограничивающего ограничителя Rect
пути, становится дорогим, и когда пользователь имеет большое количество штрихов, я получаю java.lang.OutOfMemoryError
на части мой код, который создает массив для каждого штриха.
Любые предложения по лучшему способу выполнить это? По сути, я пытаюсь определить столкновение между двумя путями Android (путь рисования, а затем путь, который пользователь создает в режиме стирания), и, хотя вышеописанное работает теоретически, на практике это невозможно.
Спасибо,
Пол
Представление - это растровое изображение, поэтому массив имеет тип int и имеет размеры rect_width, rect_height. Хм, подумал о вычислении растрового изображения на лету, но думал, что это может быть слишком дорогостоящим с точки зрения производительности (хотя у меня может не быть выбора, очевидно). RLE тоже может работать, поэтому в основном я бы сохранил инструкции RLE для Path, и, пытаясь обнаружить, если точка X, Y попадает в Путь, я прослежу вдоль RLE? –
@Paul - У вас есть несколько вариантов для RLE; один для каждого y в ограничивающей коробке хранит пересечение пути и что y как объекты (x, run_length) (это кривая Безье, поэтому для каждого y будет максимум два, я думаю ...) – antlersoft