因此,我正在进行以下工作:
创建一个圆圈并将其放入窗格中,当用户单击窗格内时,显示以下消息之一:如果用户在圆圈内的某个地方单击,则打印“在圆圈内”,否则打印“圈子外”。
问题是,无论我在哪里点击,我都会得到“在圆圈内”。
我知道解决这个问题的其他方法,但我想知道为什么我的方法行不通。
public class Exercise15_12 extends Application {
@Override
public void start(Stage primaryStage) {
Text text = new Text(30,10,"");
Circle circle = new Circle(50);
circle.setCenterX(100);
circle.setCenterY(60);
Pane pane = new Pane();
pane.getChildren().add(text);
pane.getChildren().add(circle);
pane.setOnMouseClicked(e -> {
double x = e.getX();
double y = e.getY();
if ((x <= 150 || x >=50) && (y >= 10 || y <= 110)) {
text.setText("inside the circle!");
}
else {
text.setText("outside the circle");
}
});
Scene scene = new Scene(pane,400,400);
primaryStage.setScene(scene);
primaryStage.show();
pane.requestFocus();
}
public static void main(String[] args) {
Application.launch(args);
}
}发布于 2015-08-26 00:03:16
看看你的逻辑:
if ((x <= 150 || x >=50) && (y >= 10 || y <= 110)) {这将永远是正确的:
X总是小于150或大于50并且
Y总是大于10或小于110。
第一个解决方案:使用&&代替||
但是第二个问题:请注意,这将定义一个矩形,而不是一个圆,为此,您需要使用一个小的几何学,使用一个圆的方程。
发布于 2015-08-26 00:04:30
问题在于您的if语句。
if ((x <= 150 || x >=50) && (y >= 10 || y <= 110))如果|| (或)操作符的任一操作数或两个操作数都为真,则返回true。现在,考虑一下您作为操作数使用的表达式:如果x <= 150是false,那么x必须至少为150,但这始终意味着x >= 50将是true,因为x> 150 > 50。类似地,对于y表达式,任何数字都不能同时小于10和大于110,因此(y >= 10 || y <= 110)始终是true。因此,if块中的代码总是被执行,而不是else代码。你可能打算这么做:
if ((x <= 150 && x >=50) && (y >= 10 && y <= 110))通过在两个表达式中将|| (或)替换为&& (和),整个((x <= 150 && x >=50) && (y >= 10 && y <= 110))只能在x大于或等于50和小于或等于150且y在10至110之间时才计算为true。
但是,即使是该代码也不能正确地解决这个问题:注意,当单击"inside the circle!"时,圆圈外的一些点,但圆圈周围的矩形内的一些点,将导致"inside the circle!"。为了更准确地捕捉一个圆的形状,您需要从它的方程式中开发一个更好的不等式,来确定何时点在圆圈内。例如,您可以尝试下面的语句(在查找之前尝试自己找出它):
if (((x - 100) * (x - 100) + (y - 60) * (y - 60)) <= 50 * 50)
https://stackoverflow.com/questions/32215936
复制相似问题