Java-заполнение пользовательской формы

Я создал пользовательскую форму, по сути, это коллекция из четырех объектов 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 ответов


всякий раз, когда я создаю фигуру, я всегда создаю Path2D.Двойной объект. Затем я использую 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);

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


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

gp.setWindingRule(GeneralPath.WIND_NON_ZERO);