0

楕円のあるグループがあります。Group は任意の点を中心に回転します (Rotate インスタンスを Groups 変換に追加することにより)。楕円 (中心) が変化した距離 (x と y) を調べるにはどうすればよいですか? 変換がグループに適用されるため、楕円の中心のプロパティは変更されません。

これは数学的に、またはグループ/楕円の変換インスタンスをいじることで解決できると思いますが、どちらの分野でも専門知識があまりなく、正しい結果に到達していないようです。

import javafx.animation.Transition;
import javafx.application.Application;
import javafx.beans.property.DoubleProperty;
import javafx.scene.Group;
import javafx.scene.GroupBuilder;
import javafx.scene.Scene;
import javafx.scene.SceneBuilder;
import javafx.scene.layout.Pane;
import javafx.scene.layout.PaneBuilder;
import javafx.scene.shape.Ellipse;
import javafx.scene.shape.EllipseBuilder;
import javafx.scene.shape.Rectangle;
import javafx.scene.shape.RectangleBuilder;
import javafx.scene.transform.Rotate;
import javafx.scene.transform.RotateBuilder;
import javafx.stage.Stage;
import javafx.util.Duration;

public class Main extends Application {

@Override
public void start(Stage stage) throws Exception {
    Ellipse e = EllipseBuilder.create().centerX(110).centerY(110).radiusX(5).radiusY(5).style("-fx-fill: green;").build();
    Rectangle r = RectangleBuilder.create().x(100).y(100).width(30).height(30).style("-fx-fill: red;").build();
    Group group = GroupBuilder.create().children(r, e).build();

    Ellipse pivot = EllipseBuilder.create().centerX(60).centerY(100).radiusX(2).radiusY(2).style("-fx-fill: purple;").build();

    Pane p = PaneBuilder.create().children(group, pivot).build();

    Scene scene = SceneBuilder.create().root(p).width(200).height(200).build();
    stage.setScene(scene);
    stage.show();

    final Rotate rotate = RotateBuilder.create().pivotX(pivot.getCenterX()).pivotY(pivot.getCenterY()).build();
    group.getTransforms().add(rotate);

    RotationTransition trans = new RotationTransition(rotate.angleProperty());
    trans.playFromStart();
}

class RotationTransition extends Transition {
    private final DoubleProperty angle;

    public RotationTransition(DoubleProperty angle) {
        this.angle = angle;
        setCycleDuration(Duration.seconds(5));
    }

    @Override
    protected void interpolate(double frac) {
        angle.setValue(frac * 60);
    }
}

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

上記のコードは、回転のアニメーションを示しています。回転後に緑色の楕円が変化した x と y の距離を調べるにはどうすればよいですか? または、同様に、楕円の新しい座標を見つけるにはどうすればよいでしょうか?

4

1 に答える 1

1

複雑なシナリオ(異なる変換を持つ複数のネストされたグループ)のさまざまなlocalToParent、parentToLocalなどのメソッドを理解するのにまだ問題がありますが、いくつかの実験を通じて、投稿されたコード例でそれを見つけました

group.localToParent(e.getCenterX(), e.getCenterY())

うまくいくようです。私の実際のアプリケーションでは、実際の場所ではなく、移動した距離にのみ関心があるため、同じ方法がそこで機能します。(ただし、グループの複雑な階層を考慮すると、意味のある絶対数は得られない可能性があります)。

于 2013-02-24T18:33:22.957 に答える