Java 多边形在旋转时移动

Java 多边形在旋转时移动,java,polygon,affinetransform,Java,Polygon,Affinetransform,我正在对多边形进行一些测试(旋转多边形),但在旋转多边形时遇到了一个恼人的问题。问题是,多边形在旋转时似乎在移动,最终会飞出屏幕。我一直在使用仿射变换来旋转它们,但我没有平移它们,所以它们不应该移动,对吗? 代码如下: import java.awt.*; import java.awt.geom.AffineTransform; import java.awt.geom.Point2D; public class PhysicsProp { Point2D[] OriginalPoi

我正在对多边形进行一些测试(旋转多边形),但在旋转多边形时遇到了一个恼人的问题。问题是,多边形在旋转时似乎在移动,最终会飞出屏幕。我一直在使用仿射变换来旋转它们,但我没有平移它们,所以它们不应该移动,对吗? 代码如下:

import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.geom.Point2D;

public class PhysicsProp {
    Point2D[] OriginalPoints;
    Point2D[] NewPoints = OriginalPoints;

    int X;
    int Y;

    double rotation = 0.0;

    public PhysicsProp(Point2D[] Points){
        OriginalPoints = Points;
        NewPoints = Points;
    }

    public Polygon PointsToPoly(Point2D[] Points){
        Polygon p = new Polygon();
        for (int i = 0; i < Points.length; i++){
            p.addPoint((int) Points[i].getX(), (int) Points[i].getY());
        }
        return p;
    }

    public void rotateModel(double theta){
        AffineTransform.getRotateInstance(Math.toDegrees(theta), PointsToPoly(NewPoints).getBounds().getCenterX(), PointsToPoly(NewPoints).getBounds().getCenterY()).transform(OriginalPoints, 0, NewPoints, 0, OriginalPoints.length);
    }

    public Polygon getModel(){
        return PointsToPoly(NewPoints);
    }

    public void setModel(Point[] points){
        OriginalPoints = points;
    }

    public Rectangle getBounds(){
        return PointsToPoly(NewPoints).getBounds();
    }
}

谢谢你的帮助

尝试缓存多边形的中心点,并始终使用该缓存点作为旋转点。没有任何东西可以保证在任意旋转中为任意多边形计算相同的精确X/Y中心点,因此请消除风险(和CPU周期),缓存一次,然后从那里重新使用。

尝试缓存多边形的中心点,并始终使用缓存的点作为旋转点。没有任何东西可以保证在任意旋转中为任意多边形计算相同的精确X/Y中心点,因此请消除风险(和CPU周期),并将其缓存一次,然后从那里重新使用。

多边形的中心点是什么?尝试缓存多边形的中心点,并始终使用缓存点作为旋转点。没有任何东西可以保证在任意旋转中为任意多边形计算相同的精确X/Y中心点,因此请消除风险(和CPU周期),并将其缓存一次,然后从那里重新使用。+1@Tim(谁应该将其作为答案发布)。如果不断旋转,然后重新计算质心,舍入/精度误差将导致质心漂移。或者,只需存储当前转换,并在每次旋转时增量更新转换,然后您就可以将完全更新的转换应用于原始模型,而不是一步一步地修改模型。另请参见此相关内容。@andy256-这到底是什么意思?请解释。多边形的中心点是什么?请尝试缓存多边形的中心点,并始终使用该缓存点作为旋转点。没有任何东西可以保证在任意旋转中为任意多边形计算相同的精确X/Y中心点,因此请消除风险(和CPU周期),并将其缓存一次,然后从那里重新使用。+1@Tim(谁应该将其作为答案发布)。如果不断旋转,然后重新计算质心,舍入/精度误差将导致质心漂移。或者,只需存储当前转换,并在每次旋转时增量更新转换,然后您就可以将完全更新的转换应用于原始模型,而不是一步一步地修改模型。另请参见此相关内容。@andy256-这到底是什么意思?请解释。中心点必须与多边形的位置相对?我刚刚试过,非常感谢您的帮助!如果可以的话,我会投票的。很高兴这有帮助!作为OP,你可以接受答案,即使你还不能投票。但是@Jason C关于缓存变换而不是缓存中心点的建议从性能角度来看甚至比我的建议更好,所以我建议您也这样尝试。中心点必须与多边形的位置相对?我刚刚尝试过,非常感谢您的帮助!如果可以的话,我会投票的。很高兴这有帮助!作为OP,你可以接受答案,即使你还不能投票。但是@Jason C关于缓存转换而不是缓存中心点的建议从性能角度来看甚至比我的建议更好,所以我建议您也这样尝试。
g2.setColor(Color.pink);
            for (PhysicsProp p : CurrentLevel.PhysicsObjects){
                g2.drawPolygon(p.PointsToPoly(p.NewPoints));
                p.rotateModel(0.001);
            }