2017-01-22 100 views
0

如标题所述,我有两个Circle的第一个是可拖动和第二是固定的,我会旋转(与拖动)的第一个中的第二周围而不重叠他们,但我Circle奇怪的反应,我敢肯定,错误来自拖拽状态,但我不知道如何解决它,这就是为什么我需要你的帮助,这里是一个最小的,可测试的代码:防止拖动圆圈重叠

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); 
} 

} 

这里是一个简要的概述:

Overview

注: 为我辩护,我搜索,发现了几个主题接近我的,但它有没有确切或精确的解决方案,其中包括:

-The circle remains blocked at the time of the collision

-Two circle that push each other

-JavaScript, Difficult to understand and convert to java

谢谢你的帮忙!

回答

2

Point2D可以理解为一个二维矢量,并具有从它创建新载体等有用的方法你可以这样做:

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()); 

} 

很明显,你可以做到这一切,而不使用Point2D和只是做计算,但我认为API调用使代码更易于理解。

+0

正是我想要的,谢谢! –