Получить окружающие пиксели в массиве - PullRequest
2 голосов
/ 07 декабря 2010

Эй.Моя математика не очень хорошая, поэтому я надеюсь, что кто-нибудь может мне помочь с этим.У меня есть 1D массив пикселей (представляющий 2d изображение).Чтобы получить доступ к определенному пикселю, я использую эту формулу:

image.Pixels[row * imageWidth + col] = pixelColor;

Это работает, но я также хотел бы включить пиксели вокруг выбранного пикселя.Какой самый быстрый способ, без непосредственного использования указателей, получить группу пикселей вокруг выбранного пикселя с радиусом r и установить их значения в pixelColor?Я пытаюсь создать приложение для рисования и хотел бы варьировать размеры кисти, которые будут зависеть от размера радиуса.Спасибо за любую помощь.

Ответы [ 2 ]

6 голосов
/ 07 декабря 2010

Я не знаю C # конкретно, но что-то из-за этого должно сделать вас

for (i=-r ; i< r ; i++) {
    for (j=-(r - i); j<(r - i); j++) {
       image.Pixels[(row+i)*imageWidth + (col+j)]=pixelColour;
    }
}

Редактировать вышесказанное на самом деле рисует алмаз, я дал свою первую идею взломатьсделать правильный круг ниже

for (i=-r ; i<r ; i++) {
    for (j=-r; j<r; j++) {
       if((i*i + j*j)<(r*r)){
           image.Pixels[(row+i)*imageWidth + (col+j)]=pixelColour;
       }
    }
}
3 голосов
/ 07 декабря 2010

Простой медленный способ состоит в том, чтобы пройти через диапазон пикселей в строках + - r и col + - r, и вычислить расстояние от ряда и столбца, не превышающее r. Расстояние от столбца, ряд - квадратный корень (разница в квадрате х + разница в квадрате у).

Немного более быстрый способ - сравнить квадрат радиуса с разницей в квадрате х + разница в квадрате у, поскольку они сравнимы.

Еще быстрее алгоритм круга Брезенхема ,

Другая статья: Алгоритмы Брезенхема для линий и окружностей

Как только у вас есть расстояние от col для любой строки, вы можете заполнить пиксели от col - расстояние до col + расстояние, нет необходимости вычислять оба. Таким образом, вы можете избежать вычисления только половины круга.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...