我试图找到一种 JavaFX 方法来检测坐标是否位于闭合路径内。
我创建了以下示例,并研究了各种方法,但是没有任何效果如我所愿,只有在非矩形形状内时才返回 true。
- Node.contains()——仅适用于形状的边缘,不适用于内部
- Node.intersect()——仅适用于矩形边界框
- Shape.intersects()——仅适用于形状的边缘,不适用于内部
我可以只使用 JTS 库,但我忍不住认为必须有一个 JavaFX 本机方法来实现这一点。
public class ShapeContainsTest extends Application {
public static void main(String[] args) {
Application.launch(ShapeContainsTest.class);
}
@Override
public void start(Stage primaryStage) throws Exception {
Path path = new Path();
path.getElements().add(new MoveTo(100, 100));
path.getElements().add(new LineTo(200, 100));
path.getElements().add(new LineTo(150, 200));
path.getElements().add(new ClosePath());
Pane pane = new Pane(path);
pane.setPrefSize(300, 300);
pane.setOnMouseMoved(event -> {
System.out.println("Contains? " + path.contains(event.getX(), event.getY()));
System.out.println("Intersect? " + path.intersects(event.getX(), event.getY(), 1, 1));
Circle point = new Circle(event.getX(), event.getY(), 1);
System.out.println("Intersects() " + Shape.intersect(path, point));
});
primaryStage.setScene(new Scene(pane));
primaryStage.show();
}
}
构造一个带有填充的路径,任何填充值都可以工作,与填充颜色的颜色甚至不透明度无关。
正如 mipa 在评论中指出的:
重要的一点是形状必须有颜色集。否则它会被认为是空心的,当你完全在轮廓内时你不会受到打击。
Shape.intersect(path, point)
仅当形状被填充时,才会像 contains 一样起作用,否则,在计算与形状未填充内部的交集时,它将返回一个空形状。
如果你不想让填充可见,你可以这样写:
path.setFill(Color.TRANSPARENT);
当形状填充透明颜色时,相交仍将在形状内部起作用。
可以使用不同的算法来确定填充。 JavaFX 定义了一些预设规则,可用于调整填充算法(如果需要),使用路径.setFillRule().
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)