Помогите мне понять странность Java Polygon Fill - PullRequest
1 голос
/ 30 июля 2010

Я работаю с рисованием полигонов на основе заданной линии. У меня хорошо работает логика, за исключением случаев, когда кажется, что многоугольник пересекает себя. Тем не менее, он не выглядит на 100% непротиворечивым и не имеет смысла, основываясь на том, что я читаю. Ниже приведены два изображения, созданные с использованием одного и того же кода. Меня интересуют желтые полигоны.

Изображение: http://i31.tinypic.com/24cxxlf.png

Я хочу, чтобы каждый случай работал как первый случай (когда пустая область, «обернутая» многоугольником, не заполнена).

Эти изображения сгенерированы этим кодом:

BufferedImage drawingImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = drawingImage.createGraphics();
Polygon polygon = new Polygon(parsedPoints[0], parsedPoints[1], parsedPoints[0].length);
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
g.setColor(drawingColor);
g.fillPolygon(polygon);
float[] scales = {1f, 1f, 1f, 0.7f};
float[] offsets = new float[4];
RescaleOp rop = new RescaleOp(scales, offsets, null);
graphics.drawImage(drawingImage, rop, 0, 0);
graphics.setStroke(new BasicStroke(2));
graphics.setColor(drawingColor);
graphics.drawPolygon(polygon);

(Я заполняю многоугольник, применяя масштабирование, чтобы придать прозрачности заливку, а затем рисую границу без прозрачности.)

В соответствии с документацией Java для метода Graphics.fillPolygon:

Площадь внутри многоугольника определена используя четно-нечетное правило заполнения, также известный как переменное правило.

Если я правильно понимаю, то в обоих случаях пиксель, содержащийся в области, «обернутой» толстым многоугольником, будет пересекать ровно два пути, поэтому он будет считаться «вне» многоугольника.

Итак, мои вопросы таковы: (а) я понимаю правило четно-нечетного заполнения и (б) есть ли способ в Java заставить второе изображение работать как первое?

Будем весьма благодарны за любые мысли по этому поводу.

Спасибо.

1 Ответ

2 голосов
/ 30 июля 2010
  1. Правило применяется к полигону.Java не заботится о многоугольнике, который вы нарисовали даже одно утверждение назад.
  2. Кажется, вы немного неправильно понимаете четно-нечетное правило.Практическая версия правила выглядит примерно так: для каждой координаты «y», которую пересекает многоугольник, существует упорядоченный список всех координат x, где он пересекается.Внутренняя часть многоугольника - это отрезки от каждого четного индекса (0, 2, 4 ...) до следующего нечетного индекса.
...