JavaFX多边形翻译,旋转,缩放及其要点

时间:2016-11-16 20:13:19

标签: java javafx javafx-2 javafx-8

我遇到了javafx(java 8)中的polygon类的一个奇怪问题。 当我在多边形实例上应用一组平移,旋转或缩放时,它正确地在我的形状上移动多边形。问题是,getPoints()方法中的点保持不变。 我现在开始创建自己的方法并移动点并重置它们,方法按照它们应该做的,但这是正确的方法吗?

这是一个例子:

private void translatePoints(double translateX, double translateY) {
    List<Double> newPoints = new ArrayList<>();
    for (int i = 0; i < getPoints().size(); i += 2) {
        newPoints.add(getPoints().get(i) + translateX);
        newPoints.add(getPoints().get(i + 1) + translateY);
    }
    getPoints().clear();
    getPoints().addAll(newPoints);
}

有没有办法在几次操作后获得平移,旋转和缩放的点?

或者我必须分开实施它们吗?

1 个答案:

答案 0 :(得分:2)

查看TransformAffineRotateScaleShearTranslate)的子类。它们允许您使用double[]方法转换存储在transform2DPoints数组中的点。

double[] points = new double[] {
    0, 0,
    0, 1,
    1, 1,
    1, 0
};
Rotate rot = new Rotate(45, 0.5, 0.5);
Translate t = new Translate(5, 7);
Scale sc = new Scale(3, 3);

for (Transform transform : Arrays.asList(rot, t, sc)) {
    transform.transform2DPoints(points, 0, points, 0, 4);
}

System.out.println(Arrays.toString(points));

通过这种方式,你需要注意确定变换的支点,而这与你自己的相关。

您还可以使用Node.getLocalToParentTransform获得节点的结果转换。

double[] points = polygon.getPoints().stream().mapToDouble(Number::doubleValue).toArray();
polygon.getLocalToParentTransform().transform2DPoints(points, 0, points, 0, points.length/2);
System.out.println(Arrays.toString(points));