Помогите мне понять нечетность Заливки Полигона Java

Я работаю с рисованием полигонов на основе данной строки. У меня есть логика, удающаяся хорошо кроме случаев, где кажется, что полигон пересекает себя. Однако это, кажется, не на 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:

Область в полигоне определяется с помощью ровно-нечетного правила заливки, также известного как переменное правило.

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

Таким образом, мои вопросы: (a) я понимающий, что ровно-нечетная заливка управляет и (b) там путь в Java, чтобы заставить второе изображение работать больше как первое?

Любые мысли об этом значительно ценились бы.

Спасибо.

1
задан MikeTheReader 30 July 2010 в 16:50
поделиться

1 ответ

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

Похожие вопросы: