2009-08-06 7 views
1

私はグラフィックスプログラミングが初めてです。あなたは有向グラフを描くことができるプログラムを作成しようとしています。私は最初に(ノードを表す)矩形のセットを描画し、Javaのペイントメソッドをオーバーライドすることによってパンとズームの機能を作成しました。ドットグリッドを描く

これはすべて、あまりにも多くのノードが存在しない間にはうまくいくと思われます。私の問題は、ドット・グリッドを描画しようとするときです。私は、forループのネストされた2を用いたドットのグリッドをオーバーレイその最初のテストコードの単純なビットを使用:

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

など、比例大きな線幅につながるおかげで、パフォーマンスが大規模に増加しています!アイロンをかけなければならないいくつかの欠点がありますが、全体的に改善されています。 ズーム用のソリューションは理想的ではありません。これは、グリッドのサイズを拡大して、1つのピクセルとして保持したいと考えているためです。調整するためにグリッドimgを更新しますか? – SRoe

+0

ええ、その後私に起こった。ズームの変化の頻度によって異なります。私はすべてのズームの変更でグリッドイメージを更新する必要がありますと思います。ペイント(g)では、グリッドを1:1のズームで描画し、塗りつぶす残りのオブジェクトのスケーリング係数を設定することができます。私は私の答えでそれを更新するつもりだと思う。 – Stroboskop

2

私は、マウスの移動はあなたにパフォーマンスの問題を与えるために起こっているたびに、すべてのドットを再描画すると思います。おそらく、ビューのスナップショットをビットマップとして撮り、それをパンして、ユーザーがマウスボタンを離したときに「適切に」ビューを再描画してみるべきでしょうか?