Как заполнить цвет снаружи формы (овал) - PullRequest
4 голосов
/ 10 апреля 2019

Я хочу иметь возможность рисовать на BufferedImage, используя экземпляр Graphics2D, и заполнить Цвет за пределами Shape.Если бы это была фигура типа Прямоугольник, это было бы легко, но фигура, с которой мне нужно работать, это Круг.

Легко заполнить круг Цветом, просто написав:

Graphics2D g2d = <my_image>.createGraphics();
...
g2d.fillOval(x, y, width, height);

Однако то, что я хочу, является противоположностью этого.Вместо заполнения внутренней части овала, определяемого числами (x, y, ширина, высота) Я хочу заполнить все, что находится за его пределами.

У меня был очень небольшой успех с этим,Единственное, что приходит на ум, это рисовать ОГРОМНЫЕ арки вокруг пространства, которое я хочу, чтобы круг занимал, потому что мне трудно разобраться в математике, чтобы вычислить это.

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

Ответы [ 3 ]

1 голос
/ 10 апреля 2019

Вот пример, основанный на ответе Java anti fillRect (заполнить все за пределами указанного прямоугольника) .

Используется метод substract из java.awt.geom.Area.

        Area outter = new Area(new Rectangle(0, 0, img.getWidth(), img.getHeight()));
        int x = (img.getWidth() / 4) ;
        int y = (img.getHeight() / 4);
        Ellipse2D.Double inner = new Ellipse2D.Double(x,y, img.getWidth()/2, img.getHeight()/2);
        outter.subtract(new Area(inner));// remove the ellipse from the original area

        g2d.setColor(Color.BLACK);
        g2d.fill(outter);

Без обрезки (то есть без части g2d.fill(outter)):

enter image description here

С обрезкой (заполнена внешняя часть)с черным):

enter image description here

0 голосов
/ 10 апреля 2019

Математика такая:

, если вы знаете, что круг находится в точке (x, y) и имеет радиус r

for(i=0; i<width; i++)
for(j=0; j<height; j++)
  if((i-x)*(i-x)+(j-y)*(j-y))>r*r)
    b.setRGB(i, j, 0xff0000);

Это закрасит BufferedImage b красным цветом вне круга.

0 голосов
/ 10 апреля 2019

Что если вы сделаете фон сплошным цветом и оставите внутреннюю часть овального белого цвета?

 JPanel.setBackgroundColor(Color.black);

затем нарисуйте и заполните овал

g2d.setColor(Color.white);
g2d.drawOval(x, y, width, height);
g2d.fillOval(x, y, width, height);

это должно сработать, чтобы сравнить их для примера

...