JavaFX中八角形内圆的碰撞检测
Collision detection for a circle inside an octagon in JavaFX
我是 JavaFX 的新手,在碰撞检测方面遇到了问题。我在八角形内有一个圆圈,我希望通过从墙上弹跳来留在八角形内。目前,如果我在尝试移动圆圈时检查按键事件内的碰撞,它往往会跳来跳去,但是如果我将碰撞检查放在按键事件之外,则什么也不会发生。此时我的代码只检查左右墙的碰撞。这是我的代码:
import java.util.Vector;
import com.sun.javafx.geom.Vec2f;
import javafx.animation.AnimationTimer;
import javafx.animation.Timeline;
import javafx.animation.TranslateTransition;
import javafx.application.Application;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.LongProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleLongProperty;
import javafx.geometry.Bounds;
import javafx.scene.Scene;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Polygon;
import javafx.scene.shape.Shape;
import javafx.scene.transform.Rotate;
import javafx.stage.Stage;
import javafx.util.Duration;
public class Craft extends Application {
double getX; // I later declare this as circ1.getTranslateX()
double getY; // I later declare this as circ1.getTranslateY()
@Override
public void start(Stage primaryStage) {
Pane pane = new Pane();
Polygon octagon = new Polygon(500,50, 1200,50, 1600,300, 1600,800, 1200,1000, 500,1000, 100,800, 100,300 );
octagon.setStroke(Color.BLACK);
octagon.setFill(Color.TRANSPARENT);
Circle circ1 = new Circle(500.0f, 500.0f, 25.0f);
circ1.setFill(Color.BLUE);
Polygon tri1 = new Polygon(530, 495, 530, 505, 540, 500);
tri1.setFill(Color.BLUE);
tri1.translateXProperty().bind(circ1.translateXProperty());
tri1.translateYProperty().bind(circ1.translateYProperty());
Rotate rotate = new Rotate();
rotate.pivotXProperty().bind(circ1.centerXProperty());
rotate.pivotYProperty().bind(circ1.centerYProperty());
rotate.angleProperty().bind(circ1.rotateProperty());
tri1.getTransforms().add(rotate);
pane.getChildren().addAll(octagon, circ1, tri1);
getX = circ1.getTranslateX();
getY = circ1.getTranslateY();
Bounds bounds = octagon.getBoundsInLocal();
boolean leftWall = circ1.getTranslateX() <= (bounds.getMinX() + circ1.getRadius());
boolean topWall = circ1.getLayoutY() <= (bounds.getMinY() + circ1.getRadius());
boolean rightWall = circ1.getTranslateX() >= (bounds.getMaxX() + circ1.getRadius());
boolean bottomWall = circ1.getLayoutY() >= (bounds.getMaxY() + circ1.getRadius());
circ1.setOnKeyPressed((e) -> {
if(e.getCode() == KeyCode.UP) {
DoubleProperty circ1VelX = new SimpleDoubleProperty();
DoubleProperty circ1VelY = new SimpleDoubleProperty();
LongProperty lastUpdateTime = new SimpleLongProperty();
AnimationTimer circ1Animation = new AnimationTimer() {
@Override
public void handle(long timestamp) {
if (lastUpdateTime.get() > 0) {
double elapsedSeconds = (timestamp - lastUpdateTime.get()) / 1_000_000_000.0 ;
double deltaX = elapsedSeconds * circ1VelX.get();
double deltaY = elapsedSeconds * circ1VelY.get();
double oldX = circ1.getTranslateX();
double oldY = circ1.getTranslateY();
double newX = oldX + deltaX;
double newY = oldY + deltaY;
circ1.setTranslateX(newX += 1 * Math.cos(Math.toRadians(circ1.getRotate())) * 0.1);
circ1.setTranslateY(newY += 1 * Math.sin(Math.toRadians(circ1.getRotate())) * 0.1);
}
lastUpdateTime.set(timestamp);
}
};circ1Animation.start();
}
else if(e.getCode() == KeyCode.LEFT) {
circ1.setRotate(circ1.getRotate() - 5);
}
else if(e.getCode() == KeyCode.RIGHT) {
circ1.setRotate(circ1.getRotate() + 5);
}
else if(e.getCode() == KeyCode.DOWN) {
DoubleProperty circ1VelX = new SimpleDoubleProperty();
DoubleProperty circ1VelY = new SimpleDoubleProperty();
LongProperty lastUpdateTime = new SimpleLongProperty();
AnimationTimer circ1Animation = new AnimationTimer() {
@Override
public void handle(long timestamp) {
if (lastUpdateTime.get() > 0) {
double elapsedSeconds = (timestamp - lastUpdateTime.get()) / 1_000_000_000.0 ;
double deltaX = elapsedSeconds * circ1VelX.get();
double deltaY = elapsedSeconds * circ1VelY.get();
double oldX = circ1.getTranslateX();
double oldY = circ1.getTranslateY();
double newX = oldX + deltaX;
double newY = oldY + deltaY;
circ1.setTranslateX(newX -= 1 * Math.cos(Math.toRadians(circ1.getRotate())) * 0.1);
circ1.setTranslateY(newY -= 1 * Math.sin(Math.toRadians(circ1.getRotate())) * 0.1);
}
lastUpdateTime.set(timestamp);
}
};circ1Animation.start();
}
});
circ1.setOnKeyReleased((e) -> {
if(e.getCode() == KeyCode.UP) {
DoubleProperty circ1VelX = new SimpleDoubleProperty();
DoubleProperty circ1VelY = new SimpleDoubleProperty();
LongProperty lastUpdateTime = new SimpleLongProperty();
AnimationTimer circ1Animation = new AnimationTimer() {
@Override
public void handle(long timestamp) {
if (lastUpdateTime.get() > 0) {
double elapsedSeconds = (timestamp - lastUpdateTime.get()) / 1_000_000_000.0 ;
double deltaX = elapsedSeconds * circ1VelX.get();
double deltaY = elapsedSeconds * circ1VelY.get();
double oldX = circ1.getTranslateX();
double oldY = circ1.getTranslateY();
double newX = oldX + deltaX;
double newY = oldY + deltaY;
circ1.setTranslateX(newX += 0.5 * Math.cos(Math.toRadians(circ1.getRotate())));
circ1.setTranslateY(newY += 0.5 * Math.sin(Math.toRadians(circ1.getRotate())));
}
lastUpdateTime.set(timestamp);
}
};circ1Animation.start();
}
else if(e.getCode() == KeyCode.DOWN) {
DoubleProperty circ1VelX = new SimpleDoubleProperty();
DoubleProperty circ1VelY = new SimpleDoubleProperty();
LongProperty lastUpdateTime = new SimpleLongProperty();
AnimationTimer circ1Animation = new AnimationTimer() {
@Override
public void handle(long timestamp) {
if (lastUpdateTime.get() > 0) {
double elapsedSeconds = (timestamp - lastUpdateTime.get()) / 1_000_000_000.0 ;
double deltaX = elapsedSeconds * circ1VelX.get();
double deltaY = elapsedSeconds * circ1VelY.get();
double oldX = circ1.getTranslateX();
double oldY = circ1.getTranslateY();
double newX = oldX + deltaX;
double newY = oldY + deltaY;
circ1.setTranslateX(newX -= 0.5 * Math.cos(Math.toRadians(circ1.getRotate())));
circ1.setTranslateY(newY -= 0.5 * Math.sin(Math.toRadians(circ1.getRotate())));
}
lastUpdateTime.set(timestamp);
}
};circ1Animation.start();
}
});
if(leftWall || rightWall) {
circ1.setTranslateX(getX *= -1);
}
Scene scene = new Scene(pane, 1700, 1050);
scene.getStylesheets().add("custom_craft.css");
primaryStage.setScene(scene);
primaryStage.setTitle("Craft");
primaryStage.show();
circ1.requestFocus();
}
public static void main(String[] args) {
launch(args);
}
}
我当然知道 awt 答案...将多边形投射到区域并使用相交方法。
http://docs.oracle.com/javase/7/docs/api/java/awt/geom/Area.html
您可能必须在八边形和(区域)新多边形框架(...)周围定义一些厚度不为零的新多边形
frame.intersect((Area)circ1).isEmpty()!=true
圆圈和框架碰撞了。
编辑:
Collision detector in javafx (2d maze) 提供了一些关于使用 javafxCanvas
处理对象冲突的说明
您要搜索的是几个问题的答案,例如。 G。我想你的球应该连续移动而不是在移动时停顿。此外,球应该一直移动,而不仅仅是按键。而且你对 AnimationTimer 的使用是错误的。
关于交叉点:如果你只有一个矩形,那么答案很简单。但你没有。所以你只能检查八边形或单独的线。这本身就是非常数学的。 SO 上已经有几个关于线 <-> 圆交点的问题和答案。然后还有关于从对角线墙壁弹起的角度等问题
这是一个简单粗暴的例子:
- 我把你的多边形转换成单独的线
- 我用圆和每条线创建了一个新形状,这样可以检查它们是否相交
您可以拖动圆圈,通过改变颜色查看交点。
import java.util.ArrayList;
import java.util.List;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Line;
import javafx.scene.shape.Polygon;
import javafx.scene.shape.Shape;
import javafx.stage.Stage;
public class CircleLineIntersection extends Application {
Circle circle;
List<Line> lines = new ArrayList<>();
Color defaultStroke = Color.GREEN;
Color defaultFill = defaultStroke.deriveColor(1, 1, 1, 0.3);
Color hitStroke = Color.RED;
Color hitFill = hitStroke.deriveColor(1, 1, 1, 0.3);
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
Group root = new Group();
circle = new Circle(100, 100, 50);
circle.setStroke( defaultStroke);
circle.setFill( defaultFill);
Polygon octagon = new Polygon(500, 50, 1200, 50, 1600, 300, 1600, 800, 1200, 1000, 500, 1000, 100, 800, 100, 300);
// create lines out of the octagon
int size = octagon.getPoints().size();
for (int i = 0; i < size; i += 2) {
double startX = octagon.getPoints().get(i);
double startY = octagon.getPoints().get(i + 1);
double endX = octagon.getPoints().get((i + 2) % size);
double endY = octagon.getPoints().get((i + 3) % size);
Line line = new Line(startX, startY, endX, endY);
lines.add(line);
}
MouseGestures mg = new MouseGestures();
mg.makeDraggable(circle);
root.getChildren().addAll(lines);
root.getChildren().addAll(circle);
primaryStage.setScene(new Scene(root, 1920, 1080));
primaryStage.show();
}
public class MouseGestures {
class DragContext {
double x;
double y;
}
DragContext dragContext = new DragContext();
public void makeDraggable(Node node) {
node.setOnMousePressed(onMousePressedEventHandler);
node.setOnMouseDragged(onMouseDraggedEventHandler);
node.setOnMouseReleased(onMouseReleasedEventHandler);
}
EventHandler<MouseEvent> onMousePressedEventHandler = new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
Circle circle = ((Circle) (event.getSource()));
dragContext.x = circle.getCenterX() - event.getSceneX();
dragContext.y = circle.getCenterY() - event.getSceneY();
}
};
EventHandler<MouseEvent> onMouseDraggedEventHandler = new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
Circle circle = ((Circle) (event.getSource()));
circle.setCenterX(dragContext.x + event.getSceneX());
circle.setCenterY(dragContext.y + event.getSceneY());
// check intersection of lines vs circle
boolean intersects = false;
for (Line line : lines) {
// TODO: this is heavy on performance, better implement your own line <-> circle intersection algorithm
Shape shape = Shape.intersect( line, circle);
intersects = shape.getBoundsInLocal().getWidth() >= 0 || shape.getBoundsInLocal().getHeight() >= 0;
if( intersects) {
break;
}
}
// set color depending on intersection
if( intersects) {
circle.setStroke( hitStroke);
circle.setFill( hitFill);
} else {
circle.setStroke( defaultStroke);
circle.setFill( defaultFill);
}
}
};
EventHandler<MouseEvent> onMouseReleasedEventHandler = new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
}
};
}
}
我是 JavaFX 的新手,在碰撞检测方面遇到了问题。我在八角形内有一个圆圈,我希望通过从墙上弹跳来留在八角形内。目前,如果我在尝试移动圆圈时检查按键事件内的碰撞,它往往会跳来跳去,但是如果我将碰撞检查放在按键事件之外,则什么也不会发生。此时我的代码只检查左右墙的碰撞。这是我的代码:
import java.util.Vector;
import com.sun.javafx.geom.Vec2f;
import javafx.animation.AnimationTimer;
import javafx.animation.Timeline;
import javafx.animation.TranslateTransition;
import javafx.application.Application;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.LongProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleLongProperty;
import javafx.geometry.Bounds;
import javafx.scene.Scene;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Polygon;
import javafx.scene.shape.Shape;
import javafx.scene.transform.Rotate;
import javafx.stage.Stage;
import javafx.util.Duration;
public class Craft extends Application {
double getX; // I later declare this as circ1.getTranslateX()
double getY; // I later declare this as circ1.getTranslateY()
@Override
public void start(Stage primaryStage) {
Pane pane = new Pane();
Polygon octagon = new Polygon(500,50, 1200,50, 1600,300, 1600,800, 1200,1000, 500,1000, 100,800, 100,300 );
octagon.setStroke(Color.BLACK);
octagon.setFill(Color.TRANSPARENT);
Circle circ1 = new Circle(500.0f, 500.0f, 25.0f);
circ1.setFill(Color.BLUE);
Polygon tri1 = new Polygon(530, 495, 530, 505, 540, 500);
tri1.setFill(Color.BLUE);
tri1.translateXProperty().bind(circ1.translateXProperty());
tri1.translateYProperty().bind(circ1.translateYProperty());
Rotate rotate = new Rotate();
rotate.pivotXProperty().bind(circ1.centerXProperty());
rotate.pivotYProperty().bind(circ1.centerYProperty());
rotate.angleProperty().bind(circ1.rotateProperty());
tri1.getTransforms().add(rotate);
pane.getChildren().addAll(octagon, circ1, tri1);
getX = circ1.getTranslateX();
getY = circ1.getTranslateY();
Bounds bounds = octagon.getBoundsInLocal();
boolean leftWall = circ1.getTranslateX() <= (bounds.getMinX() + circ1.getRadius());
boolean topWall = circ1.getLayoutY() <= (bounds.getMinY() + circ1.getRadius());
boolean rightWall = circ1.getTranslateX() >= (bounds.getMaxX() + circ1.getRadius());
boolean bottomWall = circ1.getLayoutY() >= (bounds.getMaxY() + circ1.getRadius());
circ1.setOnKeyPressed((e) -> {
if(e.getCode() == KeyCode.UP) {
DoubleProperty circ1VelX = new SimpleDoubleProperty();
DoubleProperty circ1VelY = new SimpleDoubleProperty();
LongProperty lastUpdateTime = new SimpleLongProperty();
AnimationTimer circ1Animation = new AnimationTimer() {
@Override
public void handle(long timestamp) {
if (lastUpdateTime.get() > 0) {
double elapsedSeconds = (timestamp - lastUpdateTime.get()) / 1_000_000_000.0 ;
double deltaX = elapsedSeconds * circ1VelX.get();
double deltaY = elapsedSeconds * circ1VelY.get();
double oldX = circ1.getTranslateX();
double oldY = circ1.getTranslateY();
double newX = oldX + deltaX;
double newY = oldY + deltaY;
circ1.setTranslateX(newX += 1 * Math.cos(Math.toRadians(circ1.getRotate())) * 0.1);
circ1.setTranslateY(newY += 1 * Math.sin(Math.toRadians(circ1.getRotate())) * 0.1);
}
lastUpdateTime.set(timestamp);
}
};circ1Animation.start();
}
else if(e.getCode() == KeyCode.LEFT) {
circ1.setRotate(circ1.getRotate() - 5);
}
else if(e.getCode() == KeyCode.RIGHT) {
circ1.setRotate(circ1.getRotate() + 5);
}
else if(e.getCode() == KeyCode.DOWN) {
DoubleProperty circ1VelX = new SimpleDoubleProperty();
DoubleProperty circ1VelY = new SimpleDoubleProperty();
LongProperty lastUpdateTime = new SimpleLongProperty();
AnimationTimer circ1Animation = new AnimationTimer() {
@Override
public void handle(long timestamp) {
if (lastUpdateTime.get() > 0) {
double elapsedSeconds = (timestamp - lastUpdateTime.get()) / 1_000_000_000.0 ;
double deltaX = elapsedSeconds * circ1VelX.get();
double deltaY = elapsedSeconds * circ1VelY.get();
double oldX = circ1.getTranslateX();
double oldY = circ1.getTranslateY();
double newX = oldX + deltaX;
double newY = oldY + deltaY;
circ1.setTranslateX(newX -= 1 * Math.cos(Math.toRadians(circ1.getRotate())) * 0.1);
circ1.setTranslateY(newY -= 1 * Math.sin(Math.toRadians(circ1.getRotate())) * 0.1);
}
lastUpdateTime.set(timestamp);
}
};circ1Animation.start();
}
});
circ1.setOnKeyReleased((e) -> {
if(e.getCode() == KeyCode.UP) {
DoubleProperty circ1VelX = new SimpleDoubleProperty();
DoubleProperty circ1VelY = new SimpleDoubleProperty();
LongProperty lastUpdateTime = new SimpleLongProperty();
AnimationTimer circ1Animation = new AnimationTimer() {
@Override
public void handle(long timestamp) {
if (lastUpdateTime.get() > 0) {
double elapsedSeconds = (timestamp - lastUpdateTime.get()) / 1_000_000_000.0 ;
double deltaX = elapsedSeconds * circ1VelX.get();
double deltaY = elapsedSeconds * circ1VelY.get();
double oldX = circ1.getTranslateX();
double oldY = circ1.getTranslateY();
double newX = oldX + deltaX;
double newY = oldY + deltaY;
circ1.setTranslateX(newX += 0.5 * Math.cos(Math.toRadians(circ1.getRotate())));
circ1.setTranslateY(newY += 0.5 * Math.sin(Math.toRadians(circ1.getRotate())));
}
lastUpdateTime.set(timestamp);
}
};circ1Animation.start();
}
else if(e.getCode() == KeyCode.DOWN) {
DoubleProperty circ1VelX = new SimpleDoubleProperty();
DoubleProperty circ1VelY = new SimpleDoubleProperty();
LongProperty lastUpdateTime = new SimpleLongProperty();
AnimationTimer circ1Animation = new AnimationTimer() {
@Override
public void handle(long timestamp) {
if (lastUpdateTime.get() > 0) {
double elapsedSeconds = (timestamp - lastUpdateTime.get()) / 1_000_000_000.0 ;
double deltaX = elapsedSeconds * circ1VelX.get();
double deltaY = elapsedSeconds * circ1VelY.get();
double oldX = circ1.getTranslateX();
double oldY = circ1.getTranslateY();
double newX = oldX + deltaX;
double newY = oldY + deltaY;
circ1.setTranslateX(newX -= 0.5 * Math.cos(Math.toRadians(circ1.getRotate())));
circ1.setTranslateY(newY -= 0.5 * Math.sin(Math.toRadians(circ1.getRotate())));
}
lastUpdateTime.set(timestamp);
}
};circ1Animation.start();
}
});
if(leftWall || rightWall) {
circ1.setTranslateX(getX *= -1);
}
Scene scene = new Scene(pane, 1700, 1050);
scene.getStylesheets().add("custom_craft.css");
primaryStage.setScene(scene);
primaryStage.setTitle("Craft");
primaryStage.show();
circ1.requestFocus();
}
public static void main(String[] args) {
launch(args);
}
}
我当然知道 awt 答案...将多边形投射到区域并使用相交方法。
http://docs.oracle.com/javase/7/docs/api/java/awt/geom/Area.html
您可能必须在八边形和(区域)新多边形框架(...)周围定义一些厚度不为零的新多边形
frame.intersect((Area)circ1).isEmpty()!=true
圆圈和框架碰撞了。
编辑: Collision detector in javafx (2d maze) 提供了一些关于使用 javafxCanvas
处理对象冲突的说明您要搜索的是几个问题的答案,例如。 G。我想你的球应该连续移动而不是在移动时停顿。此外,球应该一直移动,而不仅仅是按键。而且你对 AnimationTimer 的使用是错误的。
关于交叉点:如果你只有一个矩形,那么答案很简单。但你没有。所以你只能检查八边形或单独的线。这本身就是非常数学的。 SO 上已经有几个关于线 <-> 圆交点的问题和答案。然后还有关于从对角线墙壁弹起的角度等问题
这是一个简单粗暴的例子:
- 我把你的多边形转换成单独的线
- 我用圆和每条线创建了一个新形状,这样可以检查它们是否相交
您可以拖动圆圈,通过改变颜色查看交点。
import java.util.ArrayList;
import java.util.List;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Line;
import javafx.scene.shape.Polygon;
import javafx.scene.shape.Shape;
import javafx.stage.Stage;
public class CircleLineIntersection extends Application {
Circle circle;
List<Line> lines = new ArrayList<>();
Color defaultStroke = Color.GREEN;
Color defaultFill = defaultStroke.deriveColor(1, 1, 1, 0.3);
Color hitStroke = Color.RED;
Color hitFill = hitStroke.deriveColor(1, 1, 1, 0.3);
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
Group root = new Group();
circle = new Circle(100, 100, 50);
circle.setStroke( defaultStroke);
circle.setFill( defaultFill);
Polygon octagon = new Polygon(500, 50, 1200, 50, 1600, 300, 1600, 800, 1200, 1000, 500, 1000, 100, 800, 100, 300);
// create lines out of the octagon
int size = octagon.getPoints().size();
for (int i = 0; i < size; i += 2) {
double startX = octagon.getPoints().get(i);
double startY = octagon.getPoints().get(i + 1);
double endX = octagon.getPoints().get((i + 2) % size);
double endY = octagon.getPoints().get((i + 3) % size);
Line line = new Line(startX, startY, endX, endY);
lines.add(line);
}
MouseGestures mg = new MouseGestures();
mg.makeDraggable(circle);
root.getChildren().addAll(lines);
root.getChildren().addAll(circle);
primaryStage.setScene(new Scene(root, 1920, 1080));
primaryStage.show();
}
public class MouseGestures {
class DragContext {
double x;
double y;
}
DragContext dragContext = new DragContext();
public void makeDraggable(Node node) {
node.setOnMousePressed(onMousePressedEventHandler);
node.setOnMouseDragged(onMouseDraggedEventHandler);
node.setOnMouseReleased(onMouseReleasedEventHandler);
}
EventHandler<MouseEvent> onMousePressedEventHandler = new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
Circle circle = ((Circle) (event.getSource()));
dragContext.x = circle.getCenterX() - event.getSceneX();
dragContext.y = circle.getCenterY() - event.getSceneY();
}
};
EventHandler<MouseEvent> onMouseDraggedEventHandler = new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
Circle circle = ((Circle) (event.getSource()));
circle.setCenterX(dragContext.x + event.getSceneX());
circle.setCenterY(dragContext.y + event.getSceneY());
// check intersection of lines vs circle
boolean intersects = false;
for (Line line : lines) {
// TODO: this is heavy on performance, better implement your own line <-> circle intersection algorithm
Shape shape = Shape.intersect( line, circle);
intersects = shape.getBoundsInLocal().getWidth() >= 0 || shape.getBoundsInLocal().getHeight() >= 0;
if( intersects) {
break;
}
}
// set color depending on intersection
if( intersects) {
circle.setStroke( hitStroke);
circle.setFill( hitFill);
} else {
circle.setStroke( defaultStroke);
circle.setFill( defaultFill);
}
}
};
EventHandler<MouseEvent> onMouseReleasedEventHandler = new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
}
};
}
}