1

我正在从事一项任务,其中包括“毫米”中道路的“长度”等数据。根据规范,我的 JFrame 应该是 4meter * 3meter (如何将其转换为设备坐标...?)。

现在,我至少知道这些数据是真实世界的数据,而不是设备的像素数据。然而,在找到一些来源之后,您实际上可以通过 Graphics2D 类将这些数据转换为像素。

资源我发现这些信息在,

核心 Java 2,第 II 卷 - 高级特性,作者 - Cay S. Horstmann 和 Gary Cornell

但是,我用谷歌搜索了没有运气的实际例子。

有谁知道我可以阅读更多相关信息的任何来源。如果你有任何例子表明有人实际上做了这样的事情,那将提供更多信息。

迄今为止的研究:到目前为止,我知道我们需要假设 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));

我尝试了上面的代码,但真的很难在我真正想要的地方画线。

任何理解的帮助都会非常有帮助。

谢谢

4

4 回答 4

2

我发现自己创建 java.awt.geom.AffineTransform 对象并将坐标从米转换为像素更容易。在您的情况下,使用AffineTransform.getScaleInstance(sx, sy).

然后我调用Graphics2D函数来使用像素坐标绘制我的线条和多边形。

这使调试更容易:您可以看到转换前后的坐标值。

Java 教程中的高级主题部分描述了如何使用 进行转换Graphics2D,并附有示例:http: //download.oracle.com/javase/tutorial/2d/index.html

于 2011-09-02T16:10:10.833 回答
2

GraphicsDevice您可以通过该getNormalizingTransform()方法获得任何特定的隐式几何。

您还应该抽象所需的模型 <-> 视图转换。此示例使用四种*scale*方法显式执行此操作。

于 2011-09-02T16:10:14.500 回答
1

我认为将它留给 UI 工具包来为您完成所有缩放并不是一个好主意。您可能找不到能够实际显示 4×3 米窗口的硬件,因此如何将真实世界坐标缩放或裁剪为您实际显示给用户的东西的决定在逻辑上属于您的代码,而不是通用 UI层。例如,如果您想在项目后期重用一些通用 UI 元素,可能很难说服他们应该尝试绘制一个 1 米高、上面有 40 厘米字母的按钮。

于 2011-09-02T16:10:06.573 回答
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
于 2012-09-03T22:17:52.570 回答