#android #bitmap #geometry #bounding-box
#Android #растровое изображение #геометрия #ограничивающая рамка
Вопрос:
У меня есть растровое изображение, которое задает две переменные centreX, centreY с помощью метода onTouchEvent (). Исходя из этих координат x, y, я рисую круг поверх растрового изображения и могу изменить пиксели круга на другие значения rgb с помощью ползунка. Я ориентируюсь на внутренние пиксели круга с помощью алгоритма, но, к сожалению, в его нынешнем виде мне приходится выполнять поиск по всему растровому изображению пиксель за пикселем, чтобы ориентироваться на пиксели круга. это приводит к огромным накладным расходам на вызов метода, которые я хотел бы уменьшить.
Что я собираюсь сделать, так это создать ограничивающую рамку вокруг круга, чтобы в моем алгоритме было меньше места для поиска, что, надеюсь, ускорит процесс. Как я могу создать прямоугольник вокруг круга, используя координаты центров круга x, y и радиус 50?
Спасибо Мэтту.
public void findCirclePixels(){
for (int i=0; i < bgr.getWidth(); i) {
for (int y=0; y < bgr.getHeight(); y) {
if( Math.sqrt( Math.pow(i - centreX, 2) ( Math.pow(y - centreY, 2) ) ) <= radius ){
bgr.setPixel(i,y,Color.rgb(Progress 50,Progress,Progress 100));
}
}
}
}// end of changePixel()
Комментарии:
1. Я полагаю, было бы намного дешевле нарисовать новый круг. Вам следует рассмотреть возможность введения framestep или просто очистить и воссоздать содержимое экрана
2. @kostja привет, я не уверен, понимаете ли вы мои требования, извините, если понимаете :). я только устанавливаю для пикселей круга другой цвет, чтобы убедиться, что ползунок и алгоритм пикселей помечают правильные пиксели. в конечном итоге приложение применит к кругу эффект «рыбий глаз». (по сути, исказит пиксели круга). Единственный способ, которым я могу найти пиксели круга на растровом изображении, — это выполнить поиск по всему растровому изображению слева направо, сверху вниз, пиксель за пикселем. я бы хотел выполнять поиск только по прямоугольнику по кругу и, таким образом, иметь меньше вызовов.
3. Я думал, что понял ваши требования, но я больше не уверен, особенно в том, почему 🙂 Пожалуйста, не обращайте внимания на мой первый комментарий, если он не соответствует вашему вопросу.
Ответ №1:
Измените границы внешнего цикла с circle.x — radius на circle.x radius, а границы внутреннего цикла — с circle.y — радиус окружности.y радиус. В зависимости от того, какими могут быть ваши x и y, вам может потребоваться проверить, является ли какое-либо из этих значений меньше 0 или больше пределов ширины или высоты ваших изображений.
Комментарии:
1. клей привет, разве мой внешний цикл не ограничен bgr.getWidth()?
2. клэй, я не уверен, что вы имели в виду следующий ответ, но это то, что я сделал, и теперь это намного быстрее, спасибо.
3. @turtleboy, я рад, что у тебя это быстрее, но если я понимаю, что ты сделал, ты должен быть в состоянии сделать это еще быстрее, изменив ограничения на то, что я сказал. Вы должны быть в состоянии сделать что-то вроде «i= circle.x — radius; i <= circle.x radius; i) {» и «y = circle. y — радиус; y<= окружность. y radius; y) {«. Опять же, вам нужно было бы проверить, что при вычитании радиуса он не меньше 0, и что при добавлении радиуса к circle.x он не больше, чем bgr.getWidth(), и что при добавлении радиуса к circle. убедитесь, что результат не больше, чем bgr.getHeight().
4. клей хорошо, я сделаю по-вашему, но если радиус равен 50, то диаметр равен 100, поэтому я зацикливаю воображаемую рамку размером 100×100. края круга будут касаться этой воображаемой рамки, поэтому я не думаю, что это получится намного быстрее. спасибо за совет и я дам вам знать, если это действительно ускорит процесс :). следующая в списке — asynctask.
Ответ №2:
Это сработало нормально.
public void findCirclePixels(){
for (int i=centreX-50; i < centreX 50; i) {
for (int y=centreY-50; y <centreY 50 ; y) {
if( Math.sqrt( Math.pow(i - centreX, 2) ( Math.pow(y - centreY, 2) ) ) <= radius ){
bgr.setPixel(i,y,Color.rgb(Progress 50,Progress,Progress 100));
}
}
}
}// end of changePixel()