как создать ограничивающую рамку круга Android

#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()