本问题是以下问题的延伸:
如何在StackPane(JavaFX)中的节点上实现冲突检测?。
在实现上述问题中给出的答案之后,似乎在本地绑定和在父级中绑定在AnchorPane中是相同的,但它们在StackPane中是不同的。
请让我知道节点边界相对于 AnchorPane 和 StackPane 的实际行为。
可以使用此函数检测两个图像之间的冲突,但可以将其扩展到两个节点
public class CollisionController {
public synchronized static boolean haveCollision(Image i1, Image i2, Bounds b1, Bounds b2) {
if (i2 == null || i1 == null) return false;
if (!b1.intersects(b2)) return false;
PixelReader pr1 = i1.getPixelReader();
PixelReader pr2 = i2.getPixelReader();
for (int x = 1; x < i1.getWidth() - 1; x++) {
for (int y = 1; y < i1.getHeight() - 1; y++) {
Location coordinate1 = new Location(x, y);
Location coordinate2 = calculateSecondPointCoordinate(coordinate1, b1, b2);
if (isSecondImageBoundContainsCurrentPoint(b2, (int) (coordinate1.getX() + b1.getMinX()), (int) (coordinate1.getY() + b1.getMinY())) && isTwoPointsHaveOpacityBiggerThanZero(pr1, pr2, coordinate1, coordinate2))
return true;
}
}
return false;
}
private static Location calculateSecondPointCoordinate(Location currentPoint, Bounds b1, Bounds b2) {
double secondImageX = calculateCurrentCoordinateOfSecondImage((int) (currentPoint.getX() + b1.getMinX()), b2.getMinX());
double secondImageY = calculateCurrentCoordinateOfSecondImage((int) (currentPoint.getY() + b1.getMinY()), b2.getMinY());
return new Location(secondImageX, secondImageY);
}
private static double calculateCurrentCoordinateOfSecondImage(int currentPoint, double i2Bound) {
return (currentPoint - i2Bound);
}
private static boolean isSecondImageBoundContainsCurrentPoint(Bounds bound, int x, int y) {
return bound.contains(x, y);
}
private static boolean isTwoPointsHaveOpacityBiggerThanZero(PixelReader pr1, PixelReader pr2, Location currentPoint, Location secondImageCoordinate) {
return !PixelOpacityIsZero(pr1, currentPoint.getX(), currentPoint.getY()) && !PixelOpacityIsZero(pr2, secondImageCoordinate.getX(), secondImageCoordinate.getY());
}
private static boolean PixelOpacityIsZero(PixelReader imagePixelReader, double x, double y) {
return imagePixelReader.getColor((int) x, (int) y).getOpacity() == 0;
}
在这个函数中,我通过pixelReader获得两个图像像素,然后我迭代第一个图像(i1)像素,然后我检查像素是否包括第二个图像的像素,然后我检查两个图像中两个像素的不透明度是否大于0。不透明度大于零意味着像素有rgb颜色。如果两个条件都为真,这意味着两者相互碰撞。
public class Location {
double x;
double y;
public double getX() {
return x;
}
public double getY() {
return y;
}
public Location(double x, double y) {
this.x = x;
this.y = y;
}
}
这是在碰撞函数中使用的位置类
官方Javadoc(用于JavaFX 8,但逻辑在较新版本中保持不变)说:
定界矩形
[...]每个节点都有一个只读的boundsInLocal变量,它在未转换的本地坐标中指定节点的边框。
每个节点还有一个只读的boundsInParent变量,该变量指定应用所有变换后节点的边框,包括在transforms、scaleX/scaleY、rotate、translateX/translateY和layoutX/layoutY中设置的那些变换。它被称为“boundsInParent ”,因为矩形将相对于父坐标系。
当节点放置在AnchorPane或StackPane中时,方法的行为是相同的。观察到的差异是因为AnchorPane(将子级放置在其左上角)和StackPane(将子级居中)的默认布局。
在这个示例图片中,有三个黑色矩形。所有矩形定义为:<code>[x=0.0,y=0.1,宽度=20.0,高度=30.0,填充=0x000000ff]
对于所有三个矩形,getBoundsInLocal
为[**最小值:0.0,最小值:1.0,**最小值为0.0,**宽度:20.0,高度:30.0**,深度:0.1,最大值:20.2,最大值为30.0,最大值0.0]
左侧父项(黄色)是一个带有默认锚点的AnchorPane。它将矩形放置在其左上角(坐标为0,0)。因为没有其他变换(缩放,旋转,...),因此黄色AnchorPane中矩形的boundsInParent与其boundsInLocal相同:< code > rect 1 . getboundsinparent(anchor pane yellow)= bounding box[minX:0.0,minY:0.0,minZ:0.0,宽度:20.0,高度:30.0,深度:0.0,maxX:20.0,maxY:30.0,maxZ:0.0]
中心父级(绿色)是一个 StackPane,默认情况下,它将其子级居中。因此,包含的矩形边界的 x/y 值与边界不同InLocal: rect2.getBoundsInParent (StackPane green)=BoundingBox [minX:24.0, minY:35.20000076293945, minZ:0.0, width:20.0, height:29.999996185302734, depth:0.0, maxX:44.0, maxY:65.19999694824219, maxZ:0.0]
右边的父项(红色)是另一个锚定窗格,但具有不同的锚定:
AnchorPane.setRightAnchor(rect3, 0d);
AnchorPane.setBottomAnchor(rect3, 0d);
同样,所包含矩形的boundsInParent的x/y值因此不同于BoundsLocal:rect3.GetBoundsInvParent(AnchorPane red)=BoundingBox[minX:47.2000007629345,minY:69.5999984211,minZ:0.0,宽度:19.99996185302734,高度:30.0,深度:0,maxX:67.19999694824219,maxY:99.599999474211,maxZ:0.]
这应该表明AnchorPane和StackPane中边界的行为/计算没有区别——区别只是由于它们的默认布局,并且在所有情况下都是一致的。
为了自己尝试,我在这里是示例代码:
public class LocalAndParentBoundsApp extends Application {
public static void main(String[] args) {
LocalAndParentBoundsApp.launch(args);
}
@Override
public void start(Stage primaryStage) {
final Rectangle rect1 = new Rectangle(20, 30);
final Rectangle rect2 = new Rectangle(20, 30);
final Rectangle rect3 = new Rectangle(20, 30);
final AnchorPane anchorPane = new AnchorPane(rect1);
anchorPane.setPrefWidth(100);
anchorPane.setPrefHeight(100);
anchorPane.setStyle("-fx-background-color: yellow;");
final StackPane stackPane = new StackPane(rect2);
stackPane.setPrefWidth(100);
stackPane.setPrefHeight(100);
stackPane.setStyle("-fx-background-color: green;");
final AnchorPane anchorPane2 = new AnchorPane(rect3);
anchorPane2.setPrefWidth(100);
anchorPane2.setPrefHeight(100);
anchorPane2.setStyle("-fx-background-color: red;");
AnchorPane.setRightAnchor(rect3, 0d);
AnchorPane.setBottomAnchor(rect3, 0d);
primaryStage.setTitle("LocalAndParentBounds");
HBox root = new HBox(anchorPane, stackPane, anchorPane2);
primaryStage.setScene(new Scene(root, 200, 100));
primaryStage.show();
System.out.println("rect1=" + rect1);
System.out.println("rect1.getBoundsInLocal=" + rect1.getBoundsInLocal());
System.out.println("rect1.getBoundsInParent (AnchorPane yellow)=" + rect1.getBoundsInParent());
System.out.println("rect2=" + rect2);
System.out.println("rect2.getBoundsInLocal=" + rect2.getBoundsInLocal());
System.out.println("rect2.getBoundsInParent (StackPane green)=" + rect2.getBoundsInParent());
System.out.println("rect3=" + rect3);
System.out.println("rect3.getBoundsInLocal=" + rect3.getBoundsInLocal());
System.out.println("rect3.getBoundsInParent (AnchorPane red)=" + rect3.getBoundsInParent());
}
}
我试图通过Sonar ut ant JaCoCo runTests示例了解JaCoCo和Sonar是如何协同工作的:https://github.com/SonarSource/sonar-examples/blob/master/projects/code-coverage/ut/ant/ut-ant-jacoco-runTests/build.xml 我在本地机器上安装声纳,默认配置。然后,我
我知道compare and返回一个值。 例如: 方法调用或方法。但是,当compare或返回值时,方法如何排列。在或返回要排序的int值后运行的后台场景是什么?方法如何使用从和返回的int值(或或)
我使用的是jackson 2.10.0(https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core/2.10.0),下面是一个简单的测试用例 Person类定义如下,对于setter,我使用了@JsonSetter注释,而没有使用@JsonGetter作为getter, 然后,我创建一个Person对象,并将
我将用一个例子来问这个问题。假设我有一个这样的项目目录。 首先我想知道我是否把作曲家放在。项目目录中的json文件是否正确,以便在供应商目录中安装库?第二,假设我有以下几行,作曲家。json 那么作曲家将在哪里配置自动加载来查找关于项目根的类samplevendor\包\sampleclass?我问这个问题是在看了symfony2composer.locked文件中的以下几行之后: 更新:我在自动
我正在使用JSP、JSTL和Java servlet创建登录/注册页面,并且在servlet的doPost()方法中使用: 当用户从索引中输入无效的登录凭据时发出警报。jsp。 这是有效的,但我不知道为什么有效;以下是我的问题: > 据我所知,我正在将请求和响应对象转发到索引。但是jsp页面如何处理这些对象呢?它是一堆html,响应对象也会被修改,以便包含索引的所有html代码。jsp? 为什么g