Graphics2D 对象上的命中测试?

发布于 2025-01-04 05:42:38 字数 312 浏览 0 评论 0原文

我有一些 Graphics2D 对象(Line2D、矩形 2D、椭圆形 2D、矩形 2D)和一个 GeneralPath。我知道,如果我想对它们进行测试,我可以使用 .contains(Point) 方法,但是当这些对象未填写时,我需要对它们进行测试。所以我只想测试用户是否单击了它们边缘。我现在不需要担心边框的厚度。假设我只需要担心用户是否在距边框/线 10 像素的范围内单击。

我确实有一个 MouseListener,可以在其中获取鼠标单击的坐标,并且我的 Graphics2D 对象存储在我迭代的数据结构中。我只是不知道如何在线条/边框上进行测试。

任何建议将不胜感激!

I have a few Graphics2D objects (Line2D, Rectangle2D, Ellipse2D, Rectangle2D) and a GeneralPath. I know that if I want to hit test on them I could use the .contains(Point) method, but I need to hit test on these objects when they are not filled in. So I just want to test if the user clicked on their border/line. I don't need to worry about the thickness of the border for now. Let's say that I just need to worry if the user clicked within 10 pixels from the border/line.

I do have a MouseListener where I can get the coordinates of the mouse click, and my Graphics2D objects are stored on a data structure that I iterate over. I just don't know how to hit test on the lines/borders.

Any suggestions will be appreciated!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

一桥轻雨一伞开 2025-01-11 05:42:38

我从来没有理由使用它,但看起来你最好的选择是 Graphics2D.hit() 方法 这里

只需在鼠标位置使用 1px*1px 矩形,并将 onStroke 参数设置为 true,并确保在调用之前正确设置 Clip、Transform 和 Stroke 属性(如 javadoc 中所述)。

I've never had cause to use it, but it looks like your best bet is the Graphics2D.hit() method here.

Just use a 1px*1px rectangle at the mouse position, and set the onStroke parameter to true, and make sure that the Clip, Transform, and Stroke properties are set up correctly (as mentioned in the javadoc) before you do the call.

九厘米的零° 2025-01-11 05:42:38

这就是我要做的:

Ellipse2D 案例:
每次您想查看鼠标是否触及 Ellipse2D 的边缘时,请创建一个比原始稍大的 Ellipse2D 和一个稍小的 Ellipse2D。如果您的鼠标单击点位于较大的 Ellipse2D 内部,但位于较小的 Ellipse2D 外部,则您单击的是“靠近”原始形状的边缘。

矩形二维案例:
解决这个问题的方法与解决 Ellipse2D 的方法相同 - 将一个变大,一个变小,然后确定鼠标是否在较大的鼠标内部但在较小的鼠标外部。

Line2D 案例:
创建一个 Rectangle2D,以某个预定宽度包围 Line2D。然后看看你的鼠标是否在 Rectangle2D 内。

Here's what I'd do:

Ellipse2D case:
Each time you want to see if your mouse has touched the edge of an Ellipse2D, create an Ellipse2D that is slightly bigger than the original, and an Ellipse2D that is slightly smaller. If your mouse click point is inside the larger Ellipse2D but outside the smaller one, then you've clicked "close" to the edge of the original shape.

Rectangle2D case:
Solve this the same way you do the Ellipse2D - make one bigger, one smaller, and determine if your mouse is inside the bigger one but outside the smaller one.

Line2D case:
Create a Rectangle2D that encloses your Line2D by some predetermined width. Then see if your mouse is inside that Rectangle2D.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文