Javafx 防止拖动的圆重叠
正如标题中提到的,我有两个Javafx 防止拖动的圆重叠,javafx,Javafx,正如标题中提到的,我有两个圆,第一个是可拖动的,第二个是固定的,我会用拖动旋转(),第一个圆绕第二个,没有重叠,但我的圆反应异常,我确信错误来自拖动条件,但我不知道如何解决它,这就是为什么我需要您的帮助,下面是一个最小的可测试代码: import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.layout.Pane; import javafx.scene.paint.Color; i
圆
,第一个是可拖动的,第二个是固定的,我会用拖动旋转(),第一个圆绕第二个,没有重叠,但我的圆
反应异常,我确信错误来自拖动条件,但我不知道如何解决它,这就是为什么我需要您的帮助,下面是一个最小的可测试代码:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
public class Collision extends Application{
private Pane root = new Pane();
private Scene scene;
private Circle CA = new Circle(20);
private Circle CB = new Circle(20);
private double xOffset = 0;
private double yOffset = 0;
@Override
public void start(Stage stage) throws Exception{
initCircles();
scene = new Scene(root,500,500);
stage.setScene(scene);
stage.show();
}
private void initCircles(){
CA.setCenterX(100);
CA.setCenterY(100);
CA.setFill(Color.rgb(255, 0, 0,0.2));
CA.setStroke(Color.BLACK);
CB.setCenterX(250);
CB.setCenterY(200);
CB.setFill(Color.rgb(255, 0, 0,0.2));
CB.setStroke(Color.BLACK);
CA.setOnMousePressed(evt->{
xOffset = CA.getCenterX() - evt.getSceneX();
yOffset = CA.getCenterY() - evt.getSceneY();
});
CA.setOnMouseDragged(evt->{
//get Scene coordinate from MouseEvent
drag(evt.getSceneX(),evt.getSceneY());
});
root.getChildren().addAll(CA,CB);
}
private void drag(double x, double y){
/* calculate the distance between
* the center of the first and the second circle
*/
double distance = Math.sqrt (Math.pow(CA.getCenterX() - CB.getCenterX(),2) + Math.pow(CA.getCenterY() - CB.getCenterY(),2));
if (!(distance < (CA.getRadius() + CB.getRadius()))){
CA.setCenterX(x + xOffset);
CA.setCenterY(y + yOffset);
}else{
/**************THE PROBLEM :Condition to drag************/
CA.setCenterX(CA.getCenterX() - (CB.getCenterX()-CA.getCenterX()));
CA.setCenterY(CA.getCenterY() - (CB.getCenterY()-CA.getCenterY()));
/*What condition must be established for the
* circle to behave correctly
*/
/********************************************************/
}
}
public static void main(String[] args) {
launch(args);
}
}
导入javafx.application.application;
导入javafx.scene.scene;
导入javafx.scene.layout.Pane;
导入javafx.scene.paint.Color;
导入javafx.scene.shape.Circle;
导入javafx.stage.stage;
公共类冲突扩展应用程序{
私有窗格根=新窗格();
私密场景;
私人圈子CA=新圈子(20);
私人圈子CB=新圈子(20);
专用双xOffset=0;
专用双yOffset=0;
@凌驾
public void start(Stage)引发异常{
初始化圆();
场景=新场景(根,500500);
舞台场景;
stage.show();
}
私有void init循环(){
约100;
约100;
CA.setFill(Color.rgb(255,0,0,0.2));
约设定行程(颜色为黑色);
CB.setCenterX(250);
CB.setCenterY(200);
CB.setFill(Color.rgb(255,0,0,0.2));
CB.设定行程(颜色为黑色);
CA.setOnMousePressed(evt->{
xOffset=CA.getCenterX()-evt.getSceneX();
yOffset=CA.getCenterY()-evt.getSceneY();
});
CA.setonMouseDrawed(evt->{
//从MouseEvent获取场景坐标
拖动(evt.getSceneX(),evt.getSceneY());
});
root.getChildren().addAll(CA,CB);
}
专用空心拖曳(双x,双y){
/*计算两者之间的距离
*第一个和第二个圆的中心
*/
双距离=Math.sqrt(Math.pow(CA.getCenterX()-CB.getCenterX(),2)+Math.pow(CA.getCenterY()-CB.getCenterY(),2));
如果(!(距离<(CA.getRadius()+CB.getRadius())){
CA.setCenterX(x+xOffset);
约为setCenterY(y+yOffset);
}否则{
/**************问题是:拖动的条件************/
CA.setCenterX(CA.getCenterX()-(CB.getCenterX()-CA.getCenterX());
CA.setCenterY(CA.getCenterY()-(CB.getCenterY()-CA.getCenterY());
/*必须为该项目建立什么条件
*圈出一个圆圈,使其行为正确
*/
/********************************************************/
}
}
公共静态void main(字符串[]args){
发射(args);
}
}
以下是简要概述:
注意:
为了进行辩护,我搜索并发现了几个与我的主题相近但没有精确或准确答案的主题,其中:
谢谢你的帮助 可以解释为2D向量,并且有从中创建新向量的有用方法等。您可以执行以下操作:
private void drag(double x, double y){
// place drag wants to move circle to:
Point2D newCenter = new Point2D(x + xOffset, y+yOffset);
// center of fixed circle:
Point2D fixedCenter = new Point2D(CB.getCenterX(), CB.getCenterY());
// minimum distance between circles:
double minDistance = CA.getRadius() + CB.getRadius() ;
// if they overlap, adjust newCenter:
if (newCenter.distance(fixedCenter) < minDistance) {
// vector between fixedCenter and newCenter:
Point2D newDelta = newCenter.subtract(fixedCenter);
// adjust so that length of delta is distance between two centers:
Point2D adjustedDelta = newDelta.normalize().multiply(minDistance);
// move newCenter to match adjusted delta:
newCenter = fixedCenter.add(adjustedDelta);
}
CA.setCenterX(newCenter.getX());
CA.setCenterY(newCenter.getY());
}
private void拖动(双x,双y){
//放置要将圆移动到的拖动对象:
点2D新中心=新点2D(x+xOffset,y+yOffset);
//固定圆中心:
Point2D fixedCenter=新的Point2D(CB.getCenterX(),CB.getCenterY());
//圆之间的最小距离:
double minDistance=CA.getRadius()+CB.getRadius();
//如果它们重叠,请调整新中心:
if(新中心距离(固定中心)
显然,您不需要使用Point2D
就可以完成所有这一切,只需进行计算,但我认为API调用使代码更容易理解。可以解释为2D向量,并且有有用的方法从中创建新向量,等等。您可以执行以下操作:
private void drag(double x, double y){
// place drag wants to move circle to:
Point2D newCenter = new Point2D(x + xOffset, y+yOffset);
// center of fixed circle:
Point2D fixedCenter = new Point2D(CB.getCenterX(), CB.getCenterY());
// minimum distance between circles:
double minDistance = CA.getRadius() + CB.getRadius() ;
// if they overlap, adjust newCenter:
if (newCenter.distance(fixedCenter) < minDistance) {
// vector between fixedCenter and newCenter:
Point2D newDelta = newCenter.subtract(fixedCenter);
// adjust so that length of delta is distance between two centers:
Point2D adjustedDelta = newDelta.normalize().multiply(minDistance);
// move newCenter to match adjusted delta:
newCenter = fixedCenter.add(adjustedDelta);
}
CA.setCenterX(newCenter.getX());
CA.setCenterY(newCenter.getY());
}
private void拖动(双x,双y){
//放置要将圆移动到的拖动对象:
点2D新中心=新点2D(x+xOffset,y+yOffset);
//固定圆中心:
Point2D fixedCenter=新的Point2D(CB.getCenterX(),CB.getCenterY());
//圆之间的最小距离:
double minDistance=CA.getRadius()+CB.getRadius();
//如果它们重叠,请调整新中心:
if(新中心距离(固定中心)
显然,您不需要使用Point2D
就可以完成所有这些,只需进行计算,但我认为API调用使代码更容易理解