我的应用中存在问题。我借助鼠标绘制线条和点,我需要检测我是否与线相交或得到点。并且有点它运作良好,但使用线条它不起作用。我在AnchorPane中添加了一些行。然后我发现,当光标位于3条线(Triange)内部时 - 它总是相交的。这是我的例子:
ArrayList<Line> lines = new ArrayList<Line>();
Line l1 = new Line(10, 150, 50, 10);
Line l2 = new Line(10, 150, 100, 150);
Line l3 = new Line(100, 150, 50, 10);
lines.add(l1);
lines.add(l2);
lines.add(l3);
for (int i=0; i<lines.size();++i) {
if (lines.get(i).intersects(48, 48, 4, 4)) {
System.out.println("found a bug!" + " line #"+i);
}
}
如果有人知道答案 - 那会很棒!
答案 0 :(得分:1)
我想你的问题是:如何通过点击该行的两个像素内的任意位置来选择一条线?
在下面的示例输出中,用户刚刚非常靠近三角形的右边线,导致该线条突出显示。
下面的代码通过测试窗格中的每个形状并查看形状是否与鼠标按下位置两侧的2个像素的矩形框相交来工作。解决方案与解决问题时使用的解决方案非常相似:Checking Collision of Shapes with JavaFX。
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.*;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;
import javafx.scene.shape.*;
import javafx.stage.Stage;
public class LinePicker extends Application {
public static void main(String[] args) { Application.launch(LinePicker.class); }
@Override public void start(final Stage stage) throws Exception {
final Pane pane = new Pane();
pane.getChildren().setAll(
new Line( 10, 150, 50, 10),
new Line( 10, 150, 100, 150),
new Line(100, 150, 50, 10)
);
pane.setPrefSize(
200, 200
);
Scene scene = new Scene(addPickHandler(pane));
stage.setScene(scene);
stage.show();
}
private Pane addPickHandler(final Pane pane) {
pane.setOnMousePressed(new EventHandler<MouseEvent>() {
@Override public void handle(MouseEvent event) {
final Rectangle hotspot = new Rectangle(
event.getX() - 2,
event.getY() - 2,
4,
4
);
for (Node child : pane.getChildren()) {
if (child instanceof Shape) {
final Shape shape = (Shape) child;
Shape intersect = Shape.intersect(shape, hotspot);
if (intersect.getBoundsInLocal().getWidth() != -1) {
shape.setStyle("-fx-stroke: red;");
} else {
shape.setStyle("-fx-stroke: black;");
}
}
}
}
});
return pane;
}
}
注释
为什么shved90无法在他的应用程序中获得上述解决方案,这让我感到有点困惑。
Shev评论&#34; In Line,据我所知,它会检查所有边界,如果线条有某个角度,它的边界就像是矩形,因此我检查是否发现了它(不是只在线和最近的点)。但我需要几何操作。&#34;
然而,此处介绍的解决方案是基于几何的解决方案,因为点击热点必须与实际线相交,而不是包含线的矩形边界。这是因为解决方案中使用的Shape.intersect方法适用于所涉及的实际形状的交集,而不是所涉及形状的边界。
但是请注意,在shved90的原始问题中,他使用Node intersects方法而不是Shape.intersect
方法。 Node的文档与状态相交&#34;这个函数的默认行为只是检查给定的坐标是否与本地边界相交。&#34;,从他的评论来看,这显然不是shved90想要的。
Shev确实注意到&#34;我已经在javaFx中找到了Line2d类,就像在Java2D中一样,我转换为这一行并使用它的交集&#34;。我不建议使用与JavaFX捆绑的Line2D类,因为它是一个私有的com.sun api,不能保证在将来的JavaFX版本中存在或具有二进制向后兼容的API。