Java Применение: рисование большого количества полигонов (path2d) занимает слишком много времени - PullRequest
1 голос
/ 16 января 2020

Я пытаюсь написать приложение, которое использует aws карту, используя полигон, из массива Path2D. Двойные координаты. Проблема в том, что размер моей выборки составляет более 26 000 полигонов, и на ее прорисовку уходит целая вечность (около 5 ~ 6 минут). Не говоря уже о том, что он перерисовывает себя, когда я пытаюсь прокрутить. Когда программа запускается с несколькими тысячами координат, это занимает около 5 ~ 10 секунд.

Могу ли я в любом случае заставить программу работать быстрее? также можно нарисовать его один раз и использовать его? Вместо того, чтобы перерисовывать всю карту каждый раз, когда я пытаюсь прокрутить или изменить размер окна.

Thx.

код:

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



1 Ответ

1 голос
/ 16 января 2020

В вашей функции initDraw вы не хотите поместить строку

         Path2D.Double polygon = new Path2D.Double();

внутри for l oop?

Как написано, похоже, что каждый многоугольник будет включать в себя все точки всех предыдущих многоугольников.

Также, как вы указали, было бы лучше сделать рисование один раз если возможно. Вы должны попытаться сделать BufferedImage и нарисовать на нем многоугольники. Тогда ваша функция paintComponent может просто перерисовать сохраненный BufferedImage, что будет очень быстро.

...