坐标转换困境,用户坐标到设备坐标?

时间:2011-09-02 15:54:31

标签: java swing awt java-2d graphics2d

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

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

资源我发现这些信息在,

  

Core Java 2,第II卷 - 高级功能,作者 - Cay S. Horstmann&加里康奈尔

然而,我搜索了一些没有运气的实际例子。

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

  

到目前为止的研究:到目前为止,我知道我们需要假设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 个答案:

答案 0 :(得分:2)

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

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

这使调试更容易:您可以在之前看到坐标值 并在转型之后。

Java Tutorial中的高级主题部分介绍了如何操作 使用Graphics2D进行转换,并举例说明: http://download.oracle.com/javase/tutorial/2d/index.html

答案 1 :(得分:2)

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

您还应抽象出所需的模型< - >查看转换。此example明确使用了四种*scale*方法。

答案 2 :(得分:1)

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

答案 3 :(得分: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