Java应用程序:绘制大量多边形(path2d)花费的时间太长
我正在尝试编写一个应用程序,使用多边形从Path2D.Double坐标的arraylist绘制地图。 问题是我的样本大小超过26000个多边形,需要花费时间(大约5~6分钟)来绘制整个图形。更不用说当我尝试滚动时它会自动重新绘制。当程序以几千个坐标运行时,大约需要5~10秒 有什么方法可以让程序运行得更快吗?也可以绘制一次并使用它,而不是每次尝试滚动或重新调整窗口大小时都重新绘制整个地图 Thx 代码如下:Java应用程序:绘制大量多边形(path2d)花费的时间太长,java,polygon,graphics2d,Java,Polygon,Graphics2d,我正在尝试编写一个应用程序,使用多边形从Path2D.Double坐标的arraylist绘制地图。 问题是我的样本大小超过26000个多边形,需要花费时间(大约5~6分钟)来绘制整个图形。更不用说当我尝试滚动时它会自动重新绘制。当程序以几千个坐标运行时,大约需要5~10秒 有什么方法可以让程序运行得更快吗?也可以绘制一次并使用它,而不是每次尝试滚动或重新调整窗口大小时都重新绘制整个地图 Thx 代码如下: import java.awt.Color; import java.awt.Dimen
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Path2D;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
public class WholeMap extends JPanel {
ArrayList<PropertyInfo> propertyList;
ArrayList<Path2D.Double> polygonList= new ArrayList<Path2D.Double>();
double mapOffsetX = 4200;
double mapOffsetY = 4000;
public WholeMap(ArrayList<PropertyInfo> pl) {
propertyList = pl;
JFrame frame = new JFrame();
JScrollPane scroll = new JScrollPane(this);
frame.setVisible(true);
frame.setBounds(10,10,400,300); //(10, 10, 1100, 900);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(scroll);
initDraw();
}
public void initDraw() {
Path2D.Double polygon = new Path2D.Double();
for (int i = 0; i < propertyList.size(); i++) {
Point2D[] points = propertyList.get(i).getCoordinate();
polygon.moveTo(((points[0].getX()-mapOffsetX)/20)+2000,((-points[0].getY()+mapOffsetY)/20)+300);
for (int j = 1; j < points.length; j++) {
polygon.lineTo(((points[j].getX()-mapOffsetX)/20)+2000,((-points[j].getY()+mapOffsetY)/20)+300);
}
polygon.closePath();
polygonList.add(polygon);
}
}
@Override
public Dimension getPreferredSize() {
return new Dimension(3000, 3000);
}
public void paintComponent(Graphics g1) {
super.paintComponent(g1);
Graphics2D g = (Graphics2D) g1;
this.setOpaque(true);
this.setBackground(Color.black);
g.setColor(Color.GRAY);
for (int k = 0; k < polygonList.size(); k++) {
g.draw(polygonList.get(k));
System.out.println("Polygon Count: "+ k);
}
}
} //EOF
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.geom.Path2D;
导入java.awt.geom.Point2D;
导入java.util.ArrayList;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
公共类WholeMap扩展了JPanel{
ArrayList propertyList;
ArrayList PolyOnlist=新的ArrayList();
双mapOffsetX=4200;
双mapOffsetY=4000;
公共全局地图(ArrayList pl){
propertyList=pl;
JFrame=新JFrame();
JScrollPane scroll=新的JScrollPane(此);
frame.setVisible(true);
机架立根(10,10400300);/(10,10,1100,900);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(滚动);
initDraw();
}
公共发票{
Path2D.Double polygon=新的Path2D.Double();
对于(int i=0;i
在您的initDraw
函数中,您不想把
Path2D.Double polygon = new Path2D.Double();
是否在for
循环的内部
如前所述,看起来每个多边形也将包括以前所有多边形的所有点
此外,正如您所指出的,如果可能,最好只绘制一次。您应该尝试制作一个buffereImage
并在上面绘制多边形。然后,您的paintComponent函数可以从保存的BuffereImage中重新绘制,这将非常快。非常感谢!如前所述,将Path2D.Double polygon=new Path2D.Double()代码>行解决了问题。现在只需要几秒钟。虽然我不知道如何使用BufferedImage
只绘制一次,但现在就可以了。很高兴它有帮助!要提前绘制,您需要在initDraw
函数中构造一个buffereImage
,然后使用其createGraphics
方法获得一个Graphics2D
对象,您可以使用该对象绘制所有多边形。然后,在paintComponent
函数中,您将使用Graphics
类的drawImage
方法将缓冲区图像绘制到面板中。祝你好运你真好。到时候我会试试的。再次感谢。