【问题标题】:Polygon moves while being rotated多边形在旋转时移动
【发布时间】:2013-08-15 23:28:33
【问题描述】:

我正在使用多边形(旋转它们)进行一些测试,并且在旋转它们时遇到了一个烦人的问题。问题是,多边形在旋转时似乎在移动,最终它们飞出屏幕。我一直在使用 AffineTransform 来旋转它们,但我没有翻译它们,所以它们不应该移动,对吧? 代码如下:

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

我想知道这段代码到底出了什么问题,以及是否有更好的方法来解决我想要实现的目标(旋转多边形)。这是我渲染和旋转多边形的地方:

g2.setColor(Color.pink);
            for (PhysicsProp p : CurrentLevel.PhysicsObjects){
                g2.drawPolygon(p.PointsToPoly(p.NewPoints));
                p.rotateModel(0.001);
            }

感谢您的帮助!

【问题讨论】:

  • 多边形的中心点是什么?
  • 尝试缓存多边形的中心点,并始终使用该缓存点作为旋转点。没有什么能保证您在任意旋转中为任意多边形计算相同的精确 X/Y 中心点,因此请消除风险(和 CPU 周期)并将其缓存一次,然后从那里重复使用。
  • +1 @Tim(谁应该将其发布为答案)。如果您不断旋转然后重新计算质心,则舍入/精度误差将导致质心漂移。或者,只需存储当前转换,并在每次旋转时增量更新转换,然后您可以将完全更新的转换应用于原始模型,而不是一次修改模型。
  • 另见相关example
  • @andy256 - 你到底是什么意思?请解释一下。

标签: java polygon affinetransform


【解决方案1】:

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

【讨论】:

  • 中心点必须相对于多边形的位置?
  • 刚刚试了一下,非常感谢您的帮助!如果可以的话,我会投票。
  • 很高兴它有帮助!作为 OP,即使您还不能投票,您也可以接受答案。但是从性能的角度来看,@Jason C 建议缓存转换而不是缓存中心点甚至比我的要好,所以我建议你也尝试一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
  • 1970-01-01
  • 2013-03-21
相关资源
最近更新 更多