gpt4 book ai didi

java - 以图形方式显示图中两个顶点之间的最短路径

转载 作者:行者123 更新时间:2023-11-30 03:26:38 24 4
gpt4 key购买 nike

我编写了一个程序,该程序收集至少 500 个维基百科页面以及从这些页面到其他维基百科页面的链接。它从每个网页收集词频,以确定图中两个顶点(网页)之间的成本。

我现在正在尝试创建第二个程序。我正在使用 Swing 在 NeatBeans 中创建一个 GUI,用户可以选择两个网页,然后以图形方式查看它们之间的最短路径。我不确定如何直观地显示图表。我一直在考虑使用 JFreeChart JUNG 但似乎都无法创建我想要的那种图表。

这是我尝试创建的示例:

enter image description here

最佳答案

我只使用自定义绘画制作了一些东西。如果您不知道如何使用自定义绘画,教程是一个很好的起点,请参阅 Performing Custom Painting2D Graphics .

enter image description here

public class Example extends JPanel {

final static int GRID_SIZE = 4;
final static int CELL_SIZE = 150;
final static int CIRCLE_RAD = 20;
final static int HALF_CIRCLE_WIDTH = 4;

final static Color BACKGROUND = Color.WHITE;
final static Color CIRCLE_FILL = new Color(185, 42, 42);
final static Color CIRCLE_EDGE = Color.BLACK;
final static Color LINK_FILL = Color.BLUE;
final static Color NOLINK_FILL = new Color(150, 75, 0);

final static BasicStroke LINK_STROKE = new BasicStroke(10);
final static BasicStroke NOLINK_STROKE = new BasicStroke(2);
final static BasicStroke CIRCLE_STROKE = new BasicStroke(HALF_CIRCLE_WIDTH);


boolean[][][] links = new boolean[GRID_SIZE][GRID_SIZE][2];

Example() {

setBackground(BACKGROUND);

Random rand = new Random();
for (int i = 0; i < GRID_SIZE; i++) {
for (int j = 0; j < GRID_SIZE; j++) {
links[i][j][0] = rand.nextBoolean(); // isLinkingtoRight
links[i][j][1] = rand.nextBoolean(); // isLinkingtoDown
}
}
}

@Override
public Dimension getPreferredSize() {

int dim = CIRCLE_RAD * 2 + CELL_SIZE * (GRID_SIZE - 1) + HALF_CIRCLE_WIDTH * 2;
return new Dimension(dim, dim);
}

@Override
protected void paintComponent(Graphics g) {

super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;

for (int i = 0; i < GRID_SIZE; i++) {
for (int j = 0; j < GRID_SIZE; j++) {

if (j != GRID_SIZE - 1) {
if (links[i][j][0]) {
g2d.setColor(LINK_FILL);
g2d.setStroke(LINK_STROKE);
}
else {
g2d.setColor(NOLINK_FILL);
g2d.setStroke(NOLINK_STROKE);
}
g2d.drawLine(i * CELL_SIZE + CIRCLE_RAD + HALF_CIRCLE_WIDTH, j * CELL_SIZE + CIRCLE_RAD + HALF_CIRCLE_WIDTH,
i * CELL_SIZE + CIRCLE_RAD + HALF_CIRCLE_WIDTH, (j + 1) * CELL_SIZE + CIRCLE_RAD + HALF_CIRCLE_WIDTH);
}
if (i != GRID_SIZE - 1) {
if (links[i][j][1]) {
g2d.setColor(LINK_FILL);
g2d.setStroke(LINK_STROKE);
}
else {
g2d.setColor(NOLINK_FILL);
g2d.setStroke(NOLINK_STROKE);
}
g2d.drawLine(i * CELL_SIZE + CIRCLE_RAD + HALF_CIRCLE_WIDTH, j * CELL_SIZE + CIRCLE_RAD + HALF_CIRCLE_WIDTH,
(i + 1) * CELL_SIZE + CIRCLE_RAD + HALF_CIRCLE_WIDTH, j * CELL_SIZE + CIRCLE_RAD + HALF_CIRCLE_WIDTH);
}
}
}

g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setStroke(CIRCLE_STROKE);
for (int i = 0; i < GRID_SIZE; i++) {
for (int j = 0; j < GRID_SIZE; j++) {
g2d.setColor(CIRCLE_FILL);
g2d.fillOval(i * CELL_SIZE + HALF_CIRCLE_WIDTH, j * CELL_SIZE + HALF_CIRCLE_WIDTH, CIRCLE_RAD * 2, CIRCLE_RAD * 2);
g2d.setColor(CIRCLE_EDGE);
g2d.drawOval(i * CELL_SIZE + HALF_CIRCLE_WIDTH, j * CELL_SIZE + HALF_CIRCLE_WIDTH, CIRCLE_RAD * 2, CIRCLE_RAD * 2);
}
}
}

public static void main(String[] args) {

JFrame frame = new JFrame();
frame.add(new Example());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}

注释:

  • 这绝不是一种高效(性能方面)的绘画方法。循环运行两次,我打开了抗锯齿等。
  • 像素计算可能会出错(位置、大小......)。
  • 样式(颜色、尺寸...)由您自行决定。
  • 链接网格是一个简单但愚蠢的实现。

关于java - 以图形方式显示图中两个顶点之间的最短路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30040539/

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