Я работаю над рисованием фигур на младшем устройстве.Я заметил, что после аффинного преобразования масштаба многие тонкие линии (например, ширина 1px
) становятся некрасивыми.Особенно в случае диагональных линий (например, линии, которая наклонена на 45 градусов).
Я подготовил демонстрационную программу с наиболее наглядными примерами (я включил шаблонный графический код, чтобы вы могли запустить пример):
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.geom.GeneralPath;
import java.awt.geom.Path2D;
public class DiagonalLinesDemo extends JPanel
{
public void paintComponent(Graphics g)
{
Graphics2D graphics = (Graphics2D) g;
graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
drawRemark(graphics, 1F, 20);
drawDiagonalLine(graphics, 1F, 0);
drawRemark(graphics, 1.1070F, 80);
drawDiagonalLine(graphics, 1.1070F, 60);
drawRemark(graphics, 1.0162F, 160);
drawDiagonalLine(graphics, 1.0162F, 140);
drawRemark(graphics, 1.3300F, 250);
drawDiagonalLine(graphics, 1.3300F, 160);
drawRemark(graphics, 1.5555F, 330);
drawDiagonalLine(graphics, 1.5555F, 180);
}
private static void drawDiagonalLine(Graphics2D graphics, float scale, int anchor)
{
GeneralPath path = new GeneralPath(Path2D.WIND_EVEN_ODD);
path.moveTo(anchor + 10, 100);
path.lineTo(anchor + 60, 50);
AffineTransform upScaleTransform = new AffineTransform(
scale,
0F,
0F,
scale,
0F,
0F);
graphics.setTransform(upScaleTransform);
graphics.setColor(Color.BLACK);
graphics.draw(path);
}
private static void drawRemark(Graphics2D graphics, float scale, int anchor)
{
graphics.setTransform(new AffineTransform());
graphics.setColor(Color.BLUE);
String remark = String.format("%1.4f", scale);
graphics.drawString(remark, anchor, 50);
}
public static void main(String args[])
{
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("Diagonal Lines Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBackground(Color.white);
frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);
DiagonalLinesDemo panel = new DiagonalLinesDemo();
frame.add(panel);
frame.setVisible(true);
}
private static final int PANEL_WIDTH = 400;
private static final int PANEL_HEIGHT = 200;
private static final int FRAME_WIDTH = PANEL_WIDTH + 50;
private static final int FRAME_HEIGHT = PANEL_HEIGHT + 50;
}
Результат:
Как видно из скриншота, после трансформации (значения шкалы отмечены над линиями для наглядности) появились уродливые переломы.Я знаю, что переломы неизбежны из-за отсутствия сглаживания ( Я не могу включить сглаживание из-за ограничений клиента).Но я ожидаю более или менее симпатичный результат, как показано на рисунке ниже (я выделил нужные фигуры красным цветом):
Я попытался настроить обмоткуПравило, рендеринг подсказок.Но без удачи.Также мне известно о интерполяции .Но такой подход слишком ресурсоемкий (как я уже говорил ранее, аппаратные ресурсы заказчика очень ограничены).Есть ли другие варианты?