Рисование точечной сетки - PullRequest
       9

Рисование точечной сетки

1 голос
/ 06 августа 2009

Я новичок в графическом программировании. Я пытаюсь создать программу, которая позволяет рисовать ориентированные графы. Для начала мне удалось нарисовать набор прямоугольников (представляющих узлы) и сделал возможности панорамирования и масштабирования, переопределив метод рисования в Java.

Кажется, все это работает достаточно хорошо, хотя узлов не так много. Моя проблема в том, что когда я пытаюсь нарисовать точечную сетку. Сначала я использовал простой тестовый код, который перекрывал точечную сетку, используя два вложенных цикла for:

int iPanX = (int) panX;
int iPanY = (int) panY;
int a = this.figure.getWidth() - iPanX;
int b = this.figure.getHeight() - (int) iPanY;

for (int i = -iPanX; i < a; i += 10) {
    for (int j = -iPanY; j < b; j += 10) {
        g.drawLine(i, j, i, j);
    }
}

Это позволяет мне панорамировать сетку, но не масштабировать. Однако производительность при панорамировании ужасна! Я много искал, но чувствую, что, должно быть, упускаю что-то очевидное, потому что ничего не могу найти по этому вопросу.

Любая помощь или указатели будут с благодарностью.

- Стивен

Ответы [ 2 ]

2 голосов
/ 06 августа 2009

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

private init(){
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
    Graphics g = image.getGraphics();
    // then draw your grid into g
}

public void paint(Graphics g) {
    g.drawImage(image, 0, 0, null);
    // then draw the graphs
}

И масштабирование легко достигается с помощью этого:

g.drawImage(image, 0, 0, null); // so you paint the grid at a 1:1 resolution
Graphics2D g2 = (Graphics2D) g;
g2.scale(zoom, zoom);
// then draw the rest into g2 instead of g

Рисование в увеличенной графике приведет к пропорционально большей ширине линии и т. Д.

2 голосов
/ 06 августа 2009

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

...