Использование градиентной заливки для рисования линий
На кончике trashgod я попытался заполнить форму градиентом с острыми краями, чтобы имитировать рисование линий. Это предотвратит много вычислений и потенциально может быть намного проще. Это работало довольно хорошо для толстых линий, но не для более тонких линий. Использование следующего кода приводит к заполнению первого изображения:
rect.setSpace(spaceBetweenLines);
Color bg = Color.YELLOW;
Color fg = Color.BLUE;
rect.setPaint(new LinearGradientPaint(
(float) startX, (float) startY, (float) (startX + spaceBetweenLines), (float) (startY + spaceBetweenLines),
new float[] {0,.1f,.1001f}, new Color[] {fg,fg,bg}, MultipleGradientPaint.CycleMethod.REPEAT)
);
Рисование линий с использованием графических примитивов
Хотя проще, в моем случае это не сработало. Более сложный, но для меня более естественный способ сделать это - просто нарисовать линии поверх фигуры (прямоугольник, круг, ...). Следующий код был использован при создании второго изображения. Обратите внимание на использование clip(Shape s)
, чтобы ограничить рисунок линии до фигуры внизу. Причина не просто рисования прямоугольника и использования clip()
для ограничения формы заключается в том, что операция clip()
не является псевдонимом, что приводит к появлению неровностей. Поэтому я должен сначала нарисовать фигуру, чтобы получить плавные края, затем установить клип, чтобы предотвратить переполнение в предстоящем рисовании линий, и, наконец, нарисовать линии.
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setPaint(getBackground());
g2.fill(getShape());
g2.setClip(getShape());
// draw diagonal lines
g2.setPaint(getLineColor());
for (int x = (int) this.x, y = (int) (this.y); y - height < (this.y + height + getSpace()); ) {
g2.drawLine(x, y , x + (int) width , y - (int) width);
y += getSpace();
}