Java - заполнение пользовательской фигуры - PullRequest
6 голосов
/ 26 июля 2010

Я создал собственную фигуру, по сути, это набор из четырех объектов Arc2D.

Когда эти дуги нарисованы, они образуют то, что можно считать четырехточечной округлой звездной формой, похожей на клевер.Там, где заканчивается одна дуга, начинается другая.Они образуют квадрат в центре.Итак, представьте, что вы берете квадрат и рисуете полукруги на каждой стороне.

Я могу нарисовать эту форму для объекта Graphics2D, но когда я заполняю его, он будет заполнять только дуги, а не центральный квадрат.Заполнение этого внутреннего квадрата - моя проблема.

Я реализовал метод getPathIterator() ниже.Я также реализовал contains() методы.Но он все равно будет заполнять только дуги.

Я пытался добавить Rectangle.При заполнении фигуры прямоугольник / квадрат будет заполнен правильно, однако он также рисует прямоугольник, что, очевидно, следует ожидать, но определенно не желаемого результата.

Итак, у кого-нибудь есть идеи о том, как«заполнить» такую ​​форму?

public PathIterator getPathIterator(AffineTransform at) {
    GeneralPath gp = new GeneralPath

    for (Arc2D arcs : this.arcs) {
        gp.append(arc, false);
    }

    return gp.getPathIterator(at);
}

Ответы [ 3 ]

4 голосов
/ 26 июля 2010

Всякий раз, когда я создаю фигуру, я всегда создаю объект Path2D.Double. Затем я использую moveTo, чтобы добраться до начальной точки, и комбинацию lineTo () и curveTo (), чтобы перемещаться по пути. Затем, когда я закончу, я вызываю closePath (). Он всегда заполнен правильно.

У меня нет опыта в реализации getPathIterator, но я замечаю, что вы не делаете closePath (). Я не знаю, требуется ли это или нет, но я чувствую, что мой подход сработает.

Вот пример, который заполняет скругленный прямоугольник:

double width = 300;
double height = 400;
Path2D.Double path = new Path2D.Double();
path.moveTo(0.0, 8.0);
path.curveTo(0.0, 0.0, 8.0, 0.0, 8.0, 0.0);
path.lineTo(width - 8.0, 0.0);
path.curveTo(width, 0.0, width, 8.0, width, 8.0);
path.lineTo(width, height - 8.0);
path.curveTo(width, height, width - 8.0, height, width - 8.0, height);
path.lineTo(8.0, height);
path.curveTo(0.0, .height, 0.0, height - 8.0, 0, height - 8.0);
path.closePath();
g2.fill(path);
2 голосов
/ 27 июля 2010

Я не очень разбираюсь в графике. Но я видел эти примеры на сайте Sun. Я просто публикую ссылку на тот случай, если она вам понадобится.http://java.sun.com/products/java-media/2D/samples/suite/index.html

0 голосов
/ 27 июля 2010

Изменить правило намотки для GeneralPath

gp.setWindingRule(GeneralPath.WIND_NON_ZERO);
...