【问题标题】:Rotating a point around a center point围绕中心点旋转一个点
【发布时间】:2013-05-20 12:45:53
【问题描述】:

我知道这里有一些关于积分和轮换的问题,我觉得我快到了。我需要一点推动力。

我有一个像这样有 6 个点的形状。

我想围绕点C

旋转点P

而且我需要手动执行此操作,因此我对使用 AffineTransform 不感兴趣

提前致谢


Thread thread = new Thread() {

    public void run() {

        //THE RADIUS OF THE SHAPE IS 100

        //GET THE POINT P
        PointClass point_class = points.get(0);

        //GET THE CENTER POINT C
        Point center = new Point(point_class.point.x - 100, point_class.point.y);

        int deg = 0;

        while(deg < 360) {

            //GET THE ANGLE IN RADIANS
            double angle = Math.toRadians(deg);

            //FIRST TRANSLATE THE DIFFERENCE
            int x1 = point_class.point.x - center.x;
            int y1 = point_class.point.y - center.y;

            //APPLY ROTATION
            x1 = (int) ((double) x1 * Math.cos(angle) - y1 * Math.sin(angle));
            y1 = (int) ((double) x1 * Math.sin(angle) + y1 * Math.cos(angle));

            //TRANSLATE BACK
            point_class.point.x = x1 + center.x;
            point_class.point.y = y1 + center.y;

            //ROTATE + 1 DEEGRE NEXT TIME
            deg++;

            try {

                //SLEEP TO SEE THE DIFFERENCE
                sleep(100);

            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }
};

thread.start();

这段代码的结果是点 P 像这样在中心结束

【问题讨论】:

    标签: java rotation center point


    【解决方案1】:

    我认为由于将双精度数转换为整数,您的半径每次通过 while 循环都会缩小。这可能效果更好:

    double x1 = point_class.point.x - center.x;
    double y1 = point_class.point.y - center.y;
    
    //APPLY ROTATION
    x1 = x1 * Math.cos(angle) - y1 * Math.sin(angle));
    y1 = x1 * Math.sin(angle) + y1 * Math.cos(angle));
    
    //TRANSLATE BACK
    point_class.point.x = (int)Math.ceil(x1) + center.x;
    point_class.point.y = (int)Math.ceil(y1) + center.y;
    

    【讨论】:

    • 这段代码的旋转部分不正确。 y1 值是根据新的 x1 值而不是初始值更新的。
    【解决方案2】:

    所以我知道出了什么问题。

    两点的翻译,

    //FIRST TRANSLATE THE DIFFERENCE
    double x1 = point_class.point.x - center.x;
    double y1 = point_class.point.y - center.y;
    

    必须跳出循环,因为在应用旋转矩阵时我需要在那个位置取基。而且在循环中,我应该将 deegre 固定为 1,这样它就只是增量 1 而不是 81+82+83...不知道我为什么这样做。

    希望这对某人有帮助 =)

    【讨论】:

    • 你上面的公式帮助了一些完全不相关的事情:)
    猜你喜欢
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    • 2023-04-03
    相关资源
    最近更新 更多