【问题标题】:Coordinate transformation Dilemma, User coordinate to Device coordinate?坐标转换困境,用户坐标到设备坐标?
【发布时间】:2011-11-09 07:22:14
【问题描述】:

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

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

资源我发现这些信息在,

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

但是,我在 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));

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

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

谢谢

【问题讨论】:

    标签: java swing awt java-2d graphics2d


    【解决方案1】:

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

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

    这使得调试更容易:你可以看到之前的坐标值 以及改造后。

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

    【讨论】:

    • 我喜欢这种方法,但可能需要inverse transform
    • 接受您的回答 TrashGod 的历史很好,但这次我喜欢 simon 的方法。感谢您的帮助,不过我会探索更多关于 getNormalizingTransform() 的内容,看起来很有趣。
    【解决方案2】:

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

    您还应该抽象所需的模型 视图转换。这个example 明确地使用了四个*scale* 方法。

    【讨论】:

    • 这个Java Map Editor 可能值得一看。没试过,不过喜欢他的地图投影库。
    • 作为参考,这个example 演示了一个简单的单向线性缩放函数。
    【解决方案3】:

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

    【讨论】:

    • 啊...我实际上必须画出这些线并从中制作路线图。所以我想我会使用正常的像素值作为按钮高度。但是要绘制地图,我必须使用给定的数据来准确地绘制出它们应该在的位置。我希望我说清楚对不起。
    【解决方案4】:

    试试这个

    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-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多