2016-08-01 5 views
2

私は、JavaFXでConwayのGame of Lifeのグリッドベースの単純な変種を作っています。私はStackExchangeで見つけた例を使っています。問題は、その例のスケーリング方法が私にとってうまくいかないように見えるということです。この例では、グリッドの「サイズ」を選択することができます。つまり、グリッド内の各セルのサイズを決定するためにスケールが使用されます。ユーザーがウィンドウのサイズを変更した場合はキャンバスになります。2Dグリッドをキャンバスのサイズにスケールするにはどうすればよいですか?

これは、(0,0)と((xMax - 1)、(yMax - 1))を使って、左上と右下のセルを "塗り潰そう"ことでテストしました。しかし、右下のものは、キャンバスの境界から抜けるように見えます.YMaxから1を引いて表示する必要があります。ここで

private double getScaleFactor() { 
     return (canvas.getWidth() + canvas.getHeight())/(cellsWide + cellsHigh); 
} 

が、この方法に何か問題があります...私が使用している「倍率」の方法とは?私はGUIを構築している方法だろうか?キャンバスはBorderPaneの中心にバインドされ、上部にバインドされたHBoxと左側にバインドされたVBoxがあります。しかし、私はいつものように(幅/ 2)と(高さ/ 2)を使ってキャンバスの中心に物を描くことができたので、スケーリングファクタをどうやって得るのかが間違っています。

誰かが私を助けることができますか?

+0

列と行の比率は常に同じですか?スケール係数は、行数と列数の両方に適用されますか? – Aderis

+0

ディメンションをロックしてお互いが等しいようにするか、個々の値を選択するかの選択肢があります。はい、スケールは両方に適用されます。 –

答えて

2

現在使用している数式は、動作しないように見えます。

は、次の2つのケースを仮定する:

  1. あなたは1行10列で100×20であるキャンバスを有する1行10列
  2. で100×10であるキャンバスを有する

最初のケースでは、倍率は(100 + 10)/(1 + 10) = 10になり、理想的には、セルがキャンバスを完全に埋めるようなサイズになります。しかし、第2の場合、スケールファクタは(100 + 20)/1 + 10) = 10.909091であり、第2の場合のセルが第1の場合のセルよりも大きいことを意味する。幅は変更されず、キャンバス全体が最初のケースで使用されるので、2番目のケースのより大きなセルがキャンバスから外れなければなりません。

私はスケールファクタは、私は本当にあなたが現在持っているものと間違っているかのように、あまりにも多くのより多くの助けを提供することはできません使用されているかについてはあまり知らないので、しかし:

と仮定すると、

private double getScaleFactor() 
{ 
    double hfactor = canvas.getHeight()/cellsHigh; 
    double wfactor = canvas.getWidth()/cellsWide; 

    return (hfactor < wfactor ? hfactor : wfactor); 
} 

これは高さを計算する:スケール係数は(ピクセル単位)セルの辺の長さであり、ウィンドウが異なるアスペクト比にリサイズされたときに細胞が正方形のままであること、ここに動作するはず式でありますセルがスクリーンの全高さを満たす場合はセルの幅、scの幅全体を満たす場合はセルの幅reen。次に、すべてのセルが画面上に収まるように最小サイズを取ります。

+0

それはそれをしたようだ!ありがとうございました! –

+0

デフォルト解像度は1024x576で、サイズ変更が可能です。キャンバスがサイズを変更しないように見えるので、私はまだサイズ変更ビットを修正する必要があります。ウィンドウを水平に縮小するとツールバーのボタンが消えますが、目的はセル(グリッド)が垂直方向にオーバーフローしないようにすることです。水平にソリューションを使用する前に、それが垂直にオーバーフローしていました。私はちょうど列/行の数がキャンバスに収まるようにセルのサイズを決定する必要があります。 –

関連する問題