2011-09-02 128 views
1

我正在處理包含「毫米」中道路「長度」等數據的任務。並根據規範我的JFrame應該是4米×3米(如何將其轉換爲設備座標...?)。座標轉換困境,用戶座標到設備座標?

現在,我知道至少這個數據是真實世界的數據而不是設備的像素數據。但是,在找到幾個源之後,您可以通過Graphics2D類將這些數據實際轉換爲像素。

資源,我發現這些信息是,

核心的Java 2,第二卷 - 高級特性,作者 - 卡·S·霍斯特曼&加里·康奈爾

不過,我GOOGLE了實際的例子沒有運氣。

有沒有人知道任何來源,我可以閱讀更多關於此。如果你有任何例子說明某人實際上做了這樣的事情,那將會提供更多信息。

迄今爲止的研究:到目前爲止,我知道我們需要對以米爲單位的Graphics2D類像素數進行假設。在Graphics2D中有一種方法可以幫助你設定這個假設。方法是,

g2D.scale(pixelsPerMeter, pixelsPerMeter); 
//And than I can draw a line with meter or millimetre coordinates 
g2D.draw(new Line2D.Double(coordinates in meter)); 

我想上面的代碼,但真的很難畫線,我真的想。

任何理解的幫助將是非常有幫助的。

感謝

回答

2

我發現它更容易創建一個對象,並將座標從米轉換爲像素,我自己更容易創建 java.awt.geom.AffineTransform 對象。 在你的情況下,使用AffineTransform.getScaleInstance(sx, sy)

然後我打電話Graphics2D函數使用像素座標繪製我的線和多邊形 。

這使調試更容易:您可以在 之前和轉換後看到座標值。

在Java教程的高級主題部分介紹如何 做轉換與Graphics2D,舉例: http://download.oracle.com/javase/tutorial/2d/index.html

+0

我喜歡這種方法,但可能需要[inverse transform](http://stackoverflow.com/questions/2244157/reverse-java-graphics2d-scaled-and-rotated-coordinates/2244285#2244285)。 – trashgod

+0

這是接受你的回答TrashGod的好歷史,但我這次喜歡西蒙的方法。感謝您的幫助,但是我會更多地瞭解getNormalizingTransform(),看起來很有趣。 – doNotCheckMyBlog

1

我不認爲這是一個好主意,它留給UI工具包來完成所有的縮放的爲您服務。您可能找不到可實際顯示4×3米窗口的硬件,因此如何根據實際顯示給用戶的實際座標縮放或裁剪實際座標的決定屬於您的代碼,而不是通用的UI層。例如,如果在項目後期想要重新使用某些通用UI元素,可能很難說服他們嘗試繪製一米高的按鈕,並且上面有40釐米的字母。

+0

唉唉......其實,我畫這些線,並進行路線圖出來。所以我想我會使用正常的像素值按鈕高度。但要繪製地圖,我必須使用給定的數據準確地確定它們應該在的位置。我希望我明確表示歉意。 – doNotCheckMyBlog

2

您可以通過getNormalizingTransform()方法獲得的任何特定GraphicsDevice的隱式幾何體。

您還應該抽象所需模型< - >視圖轉換。這example明確使用四個*scale*方法。

+0

這[Java Map Editor](http://www.jhlabs.com/maps/index.html)可能值得一看。我沒有嘗試過,但我喜歡他的地圖投影庫。 – trashgod

+0

作爲參考,本[示例](http://stackoverflow.com/questions/2901472)演示了一個簡單的單向線性縮放函數。 – trashgod

1

試試這個

Dimension d = getSize(); 
    int maxX = d.width - 1, maxY = d.height - 1; 
    pixelSize = Math.max(rWidth/maxX, rHeight/maxY); 
    centerX = maxX/2; centerY = maxY/2; 


    int iX(float x){return Math.round(centerX + x/pixelSize);}//convert to device coordinate 
    int iY(float y){return Math.round(centerY - y/pixelSize);} 
    float fx(int x){return (x - centerX) * pixelSize;}//convert to logical coordinate 
    float fy(int y){return (centerY - y) * pixelSize;} 

    where rWidth and rHeight are real numbers 
+0

已經完成,但謝謝隊友! – doNotCheckMyBlog