2012-06-01 72 views
1

我不得不操縱的圓弧形狀在JavaFX的與鼠標拖動事件操縱與小鼠弧(JavaFX的2)

我具有弧形具有以下paramters定義一個問題:

  • 半徑X和半徑Y:其全部橢圓的水平和垂直半徑,此弧是一個局部截面
  • 的centerX,centerY:弧光
  • 由startAngle的中心點:開始的圓弧的角度(相對於水平軸)
  • 長度:以度

弧的角度範圍所以我需要的是使電弧的開始角度「跟隨」鼠標移動的同時拖動:

當用戶按下開始弧的點(位於startAngle),同時拖動鼠標我需要計算由水平軸和從中心到鼠標位置的線形成的新起始角度

基本上問題是計算開始給定點(鼠標位置)和其他給定參數(中心,主軸和短軸)的弧的角度

我在做什麼actuyally的計算與Math.atan2功能的角度

newStartAngle = ATAN2(xMouse,yMouse)(假定中心X,Y在0,0)

,但它的工作原理只有當圓弧是圓形的(radiusX = radiusY)

另一種說法是:我需要弧的起始點總是在從中心到鼠標位置的線上(所以我需要不斷更新起始角度以便使其跟隨鼠標旋轉運動)。 (我希望我將它一點點清晰)

下面是一個示例的完整源

import javafx.stage.Stage; 
... 

public class Main extends Application { 

@Override 
public void start(Stage primaryStage) { 
    Pane pane = new Pane(); 

    Group designer = createDesigner(); 
    designer.setLayoutX(100); 
    designer.setLayoutY(200); 
    pane.getChildren().add(designer); 

    Scene sc = new Scene(pane, 600, 600); 
    primaryStage.setScene(sc); 
    primaryStage.show(); 
} 

public static final double RX = 100; 
public static final double RY = 50; 
public static final double S_ANGLE = 45; 
public static final double ARC_LENGTH = 90; 

private Arc arc; 
private Circle handle; 
private Line connection; 
double xMouse,yMouse; 

public Group createDesigner() { 

    arc = new Arc();   
    arc.setRadiusX(RX); 
    arc.setRadiusY(RY); 
    arc.setStartAngle(S_ANGLE); 
    arc.setLength(ARC_LENGTH); 
    arc.setFill(Color.LIGHTBLUE); 
    arc.setType(ArcType.ROUND); 

    handle = new Circle(); 
    handle.setRadius(5);  
    handle.setStroke(Color.BLACK); 
    handle.setFill(Color.TRANSPARENT); 

    handle.setCenterX(
      RX * Math.cos(Math.toRadians(S_ANGLE)) 
     ); 
    handle.setCenterY(
      -RY * Math.cos(Math.toRadians(S_ANGLE)) 
     ); 

    connection = new Line(); 
    connection.startXProperty().bind(arc.centerXProperty()); 
    connection.startYProperty().bind(arc.centerYProperty()); 
    connection.endXProperty().bind(handle.centerXProperty()); 
    connection.endYProperty().bind(handle.centerYProperty()); 

    handle.setOnMouseDragged(new EventHandler<MouseEvent>() { 

     @Override 
     public void handle(MouseEvent event) { 

      xMouse = event.getX(); 
      yMouse = event.getY(); 

      handle.setCenterX(xMouse); 
      handle.setCenterY(yMouse); 


      double angleInRadians = Math.atan2(-yMouse, xMouse); 

      arc.setStartAngle(Math.toDegrees(angleInRadians)); 

     } 

    }); 

    return new Group(arc, connection, handle); 

} 

public static void main(String[] args) { 
    launch(args); 
} 

} 

預先感謝您

回答

1

嗯,我解決了這個問題,足以分裂xMouse和yMouse由主要和次要斧頭使其工作

newStartAngle = Math.atan2(-yMouse/radiusY, xMouse/radiusX) 
//assume center x, y at 0,0