【问题标题】:Hit test on Graphics2D object?对 Graphics2D 对象进行命中测试?
【发布时间】:2012-02-09 17:08:58
【问题描述】:

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

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

任何建议将不胜感激!

【问题讨论】:

    标签: java graphics graphics2d


    【解决方案1】:

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

    只需在鼠标位置使用 1px*1px 矩形,并将 onStroke 参数设置为 true,并确保正确设置 Clip、Transform 和 Stroke 属性(如 javadoc 中所述),然后再执行打电话。

    【讨论】:

    • 如果我不关心笔画,但与边框/笔画的特定距离(例如 10 像素),就好像它是 1 像素宽一样?比如一个Ellipse2D的笔画是20px,但我只需要知道用户是否在10px之内点击了?
    • 我最终调用了 Graphics2D.setStroke(10) 并且效果很好!谢谢巴克塔和本
    【解决方案2】:

    这是我要做的:

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

    Rectangle2D 案例: 以与 Ellipse2D 相同的方式解决此问题 - 放大一个,缩小一个,并确定您的鼠标是否在较大的内部但在较小的外部。

    Line2D 案例: 创建一个 Rectangle2D,将 Line2D 包含一些预定的宽度。然后看看你的鼠标是否在那个 Rectangle2D 里面。

    【讨论】:

    • 我认为 Baqueta 的解决方案基本上是做同样的事情,但比这更优雅。我不知道 G2d.hit() 方法 - 这很酷:)
    • 由于我的奇怪要求,您的建议可能会更好,我必须试一试:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 2011-01-27
    • 2013-03-06
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多