2009-08-06 7 views
1

그래픽 프로그래밍을 처음 사용합니다. 당신이 방향 그래프를 그릴 수있는 프로그램을 만들려고합니다. 처음에는 노드를 표현하는 사각형 세트를 그려 냈으며 Java에서 paint 메소드를 오버라이드하여 팬 및 확대/축소 기능을 만들었습니다.도트 그리기

너무 많은 노드가있는 동안이 모든 것이 합리적으로 잘 작동하는 것 같습니다. 제 문제는 도트 그리드를 그릴 때입니다.

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); 
    } 
} 

이 날 그리드를 이동하지만 확대하지 않을 수 있습니다 : 나는 루프 두 개의 중첩을 사용하여 도트 그리드 오버레이가 처음에 테스트 코드의 간단한 비트를 사용했다. 그러나 패닝 할 때의 성능은 끔찍합니다! 나는 많은 검색을했으나 주제에 대해 아무 것도 찾을 수 없기 때문에 명백한 것을 놓치고 있어야한다고 생각합니다.

어떤 도움이나 조언이라도 대단히 감사하겠습니다.

--Stephen

답변

2

도트 격자에 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 

등에 비례하여 더 큰 선폭을 초래할 것이다 확대 된 그래픽으로 도면

+0

덕분 성능이 대규모 증가! 철저히 단련해야 할 몇 가지 단점이 있지만 전반적으로 개선되었습니다. 확대 축소를 위해 제공되는 솔루션은 그리드 크기를 증가시켜 단일 픽셀로 유지하려는 경우 이상적이지 않습니다. 조정할 수있는 눈금 img을 업데이트합니까? – SRoe

+0

예, 나중에 저에게 일어났습니다. 확대/축소가 얼마나 자주 변경 될지에 따라 다릅니다. 모든 확대/축소 변경으로 그리드 이미지를 업데이트해야한다고 생각합니다. 그리고 페인트 (g)에서 그리드를 1 : 1 줌으로 그릴 수 있고 그리기 위해 나머지 오브젝트의 배율을 설정할 수 있습니다. 나는 내 대답에서 그것을 업데이트 할 것이라고 생각한다. – Stroboskop

2

내가 마우스를 이동하면 성능 문제를 주려고 할 때마다 모든 점을 다시 그리기 생각합니다. 뷰의 스냅 샷을 비트 맵으로 가져 와서 주위를 패닝하고, 사용자가 마우스 버튼을 놓을 때 뷰를 '제대로'다시 그립니다.