2011-09-02 129 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