gpt4 book ai didi

java - 可视化自定义网格

转载 作者:行者123 更新时间:2023-12-01 17:16:39 24 4
gpt4 key购买 nike

我是 Java 中的 Swing 新手,正在尝试制作一个可视化网格。我有一些关于如何执行以下操作的简单问题。以下是网格的一些特征:

  1. 对于网格的每个方 block ,我应该有一个等效的索引(i,j),使用它我可以识别方 block 并放置文本。编辑 - (i,j) 是行/列值 - 网格中正方形的索引。

  2. 应绘制正方形的对角线,并且正方形的四个部分应具有不同的颜色。

有关如何执行此操作的任何建议。

最佳答案

给定,您需要知道每行的数。有了这些信息,您可以简单地执行(row * columns) + column,这将返回正方形的索引。

例如,每行 8 列,请求

  • 行 = 0列 = 4,将返回 4
  • 行 = 1列 = 4,将返回 12
  • 行= 0列= 0,将返回0

渲染正方形的各个部分更为复杂,至少可以通过两种方式实现。您可以使用Polygon为每个部分或Shape生成一个三角形,然后简单地使用Graphics2D#fill来填充它。

这将取决于你如何物理渲染每个方 block ......

查看 2D Graphics 了解更多详细信息,查看 this 了解两者的示例。

Shape 会更容易旋转和定位,并且只需要您有一个实例(或根据您的需要为每个正方形有一个实例),正如您所需要的至少 4 个多边形或进行一些有趣的旋转...

更新了简单的示例

所有这些都是通过旋转三角形完成的...

Example

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.awt.geom.Path2D;
import java.awt.geom.Point2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class DividedSquare {

public static void main(String[] args) {
new DividedSquare();
}

public DividedSquare() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}

JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}

public class TestPane extends JPanel {

private TriangleShape baseTriangle;
private Color[] colors;

public TestPane() {
colors = new Color[]{Color.RED, Color.GREEN, Color.BLUE, Color.MAGENTA};
}

@Override
public void invalidate() {
super.invalidate();

baseTriangle = new TriangleShape(
new Point(0, 0),
new Point(getWidth(), 0),
new Point(getWidth() / 2, getHeight() / 2));

}

@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();

String text[] = new String[]{
"123.123",
"456.789",
"012.315",
"678.921"
};

FontMetrics fm = g2d.getFontMetrics();

double angel = 0;
for (int index = 0; index < 4; index++) {
g2d.setColor(colors[index]);
Path2D rotated = rotate(baseTriangle, angel);
g2d.fill(rotated);
Rectangle bounds = rotated.getBounds();
int x = bounds.x + ((bounds.width - fm.stringWidth(text[0])) / 2);
int y = bounds.y + (((bounds.height - fm.getHeight()) / 2) + fm.getAscent());
g2d.setColor(Color.WHITE);
g2d.drawString(text[index], x, y);
angel += 90;
}
g2d.setColor(Color.BLACK);
g2d.drawLine(0, 0, getWidth(), getHeight());
g2d.drawLine(getWidth(), 0, 0, getHeight());
g2d.dispose();
}

public Path2D rotate(TriangleShape shape, double angel) {

Rectangle bounds = shape.getBounds();
int x = bounds.width / 2;
int y = bounds.width / 2;

return new Path2D.Float(shape, AffineTransform.getRotateInstance(
Math.toRadians(angel),
x,
y));

}

}

public class TriangleShape extends Path2D.Double {

public TriangleShape(Point2D... points) {
moveTo(points[0].getX(), points[0].getY());
lineTo(points[1].getX(), points[1].getY());
lineTo(points[2].getX(), points[2].getY());
closePath();
}

}
}

关于java - 可视化自定义网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21618715/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com