0

我正在构建一个 Java 应用程序,该应用程序将具有两个需要用户单击的随机大小的圆圈。将测量单击第一个和第二个圆圈之间的时间。不幸的是,由于我是 Java 新手,所以事情对我来说很慢。目前,我的应用程序使用 System.nanoTime() 绘制圆圈并测量点击之间的时间,但现在我遇到了问题。

因为圆圈需要彼此相距固定距离,所以我想使用圆圈的中心作为原点。所以基本上我希望能够为圆提供坐标,以便圆的中心应该在这些坐标处。然后圆之间的距离描述了中心之间的距离。我的圈子目前嵌入到 JPanel 中,但如果我设置 JPanel 的位置,它会将左上角移动到该位置。

当然,我已经做了一些搜索阅读,我可能需要使用我在paintComponent() 中尝试过的 AffineTransform 或 Graphics2D.translate() 但这有点令人困惑,所以我尝试覆盖 setlocation 并从中减去半径位置。它有点工作,但它不是最干净的解决方案。谁能给我一些关于如何做到这一点的指示?

提前致谢。

4

2 回答 2

2

如果我理解问题陈述,那么所有这些圆对都将位于以封闭面板为中心的圆的相对两侧,如此处所示。只需选择一个随机的 0 ≤ θ < π 并在 π - θ 处找到它的对立面。请注意示例的渲染如何随着面板大小的调整而缩放。

图片

顺便说一句,该示例用于setPreferredSize()建立绘图面板的尺寸,但您可能想要覆盖getPreferredSize()

附录:该示例用于fillOval()渲染圆圈,但您可以使用draw()任何所需的Shape;后者提供了几种contains()适合命中测试的方法,如此所述。

于 2013-08-12T14:39:48.777 回答
0

你有两个圆心的坐标 (x1, y1) 和 (x2, y2)。半径的大小是随机的。一旦你有了两个半径,r1 和 r2,只需将它们定位在 (x1-r1, y1-r1) 和 (x2-r2, y2-r2)。

您可以使用 java.awt.Point 来表示中心,并使用

center.translate(-radius, -radius)

并使用新的翻译值作为绘图的位置。

也许您认为这不是一个干净的解决方案,但为什么不呢?Java中的所有内容都是通过为位置提供左上角来绘制的,因此使用不干净的中心也是如此:)。通过执行 -radius 计算左上角是干净的:)

于 2013-08-12T18:44:36.780 回答