Постройте круги с центром и радиусом

В настоящее время я использую WritableRaster и его метод setPixed, и мне нужно, чтобы он устанавливал не только один пиксель, а «круг» с радиусом r. Я думаю о чем-то вроде этого:

for(int y = -r; y < r; y++)
{
    for(int x = -r; x < r; x++)
    {
         raster.setPixel(x,y,color);
 }}

Вопрос в том, будет ли это работать, чтобы сделать круг, если да, то как мне заставить его пройти через все пиксели внутри?

Заранее спасибо!

РЕДАКТИРОВАТЬ: извините, я не прояснил это - я делаю резиновый инструмент на прозрачном холсте, поэтому, если я нарисую круг прозрачным цветом, он не удалит то, что было раньше... Вот почему я использую установить пиксель.

РЕДАКТИРОВАТЬ РЕДАКТИРОВАТЬ: вот что выводит код (на g2d, используя drawLine с теми же значениями, поэтому он заполняет только один пиксель, как в методе setPixel): http://i.imgur.com/a5QNMuX.png?1

РЕДАКТИРОВАТЬ РЕДАКТИРОВАТЬ РЕДАКТИРОВАТЬ: Если кто-то хочет использовать этот код по той же причине, я рекомендую использовать BufferedImage.setRGB(), потому что это намного быстрее. Если вы не знаете, что делать с цветом (последний параметр), используйте что-то вроде:

...
buffImg.setRGB(x,y,new Color(r,g,b,a).getRGB());
...

person gedr    schedule 04.02.2014    source источник
comment
Вы пробовали этот код? Что ты получил?   -  person Fred Larson    schedule 04.02.2014
comment
Это базовая компьютерная графика, материалов по ней куча, можно даже начать с Википедии: en.wikipedia. org/wiki/Midpoint_circle_algorithm   -  person Jakub Kotowski    schedule 04.02.2014
comment
Вы ДОЛЖНЫ использовать WritableRaster? Если это часть BufferedImage, вы должны нарисовать круг, используя контекст Graphics BufferedImage. (Если он не является частью BufferedImage (интересно, откуда он берется и что вы там делаете, но) можно было бы даже подумать о том, чтобы обернуть WriteableRaster в BufferedImage, чтобы использовать удобные методы рисования в нем через объект Graphics ).   -  person Marco13    schedule 04.02.2014
comment
Извините, ребята, я случайно удалил вопрос и забыл поставить его обратно ... Вопрос в том, получится ли сделать круг, если да, то как мне заставить его пройти через все пиксели внутри?   -  person gedr    schedule 04.02.2014
comment
@ Marco13 Извините, я не пояснил это - я делаю резиновый инструмент на прозрачном холсте, поэтому, если я нарисую круг прозрачным цветом, он не удалит то, что было раньше ... Вот почему я использую установить пиксель.   -  person gedr    schedule 04.02.2014


Ответы (1)


Вам нужно будет заполнить каждую строку отдельно, как вы это делаете, но обратите внимание, что вам нужно настроить границы x для радиуса. Это чем-то похоже на двумерную (дискретную) интеграцию. Основная идея заключается в том, что x^2 + y^2 = r^2 находится на внешних границах, а y и r фиксированы, поэтому...:

for(int y = -r; y < r; y++)
{
    int bound = (int)(sqrt(r * r - y * y) + 0.5);
    for(int x = -bound; x < bound; x++)
    {
         raster.setPixel(x,y,color);
    }
}

... + 0.5 — это безопасный способ округления до ближайшего целого числа (вместо того, чтобы просто взять floor с приведением), поскольку bound всегда будет положительным.

person Mad Physicist    schedule 04.02.2014
comment
Спасибо! Однако есть одна проблема: вам нужно привязать к int, иначе все будет идеально! Вот результат: imgur.com/c3V99EW - person gedr; 05.02.2014