2016-08-01 61 views
2

我正在JavaFX中製作一個簡單的基於網格的康威生命遊戲變體,我使用的是我在StackExchange上找到的示例。問題是這個例子中的縮放方法似乎不適合我。在這個例子中,你可以選擇網格的「大小」,這意味着它由多少行/列組成,然後該比例應該確定該網格中每個單元格的大小,從而允許網格適合如果用戶調整窗口大小,則顯示畫布。我使用(0,0)和((xMax - 1),(yMax - 1))試圖「填充」左上角和右下角的單元格,測試了這一點。但是右下角的人似乎將剪輯畫出邊界,因爲我必須從yMax中減去1以上才能顯示出來。如何將2D網格縮放到畫布的大小?

這裏是「比例因子」的方法我用...

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

這有什麼錯用這種方法?這可能是我構建GUI的方式嗎?畫布綁定到BorderPane的中心,並且HBox綁定到頂部,VBox綁定到左邊。不過,我已經能夠像平常一樣使用(width/2)和(height/2)在畫布的中心繪製東西,所以有些東西告訴我如何得到縮放因子是錯誤的。

有人可以幫我嗎?

+0

行與列的比率是否始終相同?比例因子是否適用於行數和列數? – Aderis

+0

有一個選項可以鎖定尺寸以便它們彼此相等,或者您可以選擇單個值。是的,這個比例適用於兩者。 –

回答

2

您目前使用的公式看起來應該不起作用。

假設有下面兩種情況:

  1. 你有一個畫布是100×10與1列和10列
  2. 你有一個畫布是100×20,1行10列

在第一種情況下,比例因子將爲(100 + 10)/(1 + 10) = 10,理想情況下,這會導致單元格的大小設置爲使其完全填充畫布。但是,在第二種情況下,比例因子將爲(100 + 20)/1 + 10) = 10.909091,這意味着第二種情況下的單元格大於第一種情況下的單元格。由於寬度沒有變化,並且在第一種情況下使用了整個畫布,所以第二種情況下的較大單元必須從畫布上運行。

因爲我不知道太多關於如何換算係數正在使用我真的不能提供太多的更多的幫助在什麼是錯的與你目前擁有的方式,但:

假設比例因子是細胞(像素)的邊長,並且當窗口被調整大小以不同的寬高比的細胞保持正方形,這裏是應該工作的公式:

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

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

此計算高度如果細胞填滿整個屏幕高度,則細胞的寬度和細胞的寬度(如果細胞填滿整個sc的寬度)穎。然後採用最小尺寸來確保所有單元格都適合屏幕。

+0

這似乎已經做到了!謝謝! –

+0

應該說默認分辨率是1024x576,可以調整大小。我仍然需要更正大小調整位,因爲畫布似乎沒有改變大小,並且如果我水平縮小窗口,工具欄中的按鈕消失,但目標是確保單元格(網格)不垂直溢出或水平。在我使用你的解決方案之前,它是垂直溢出的。我只想要列數/行數來確定單元格大小,以便它適合畫布。 –