Вращение плоскости на точке - PullRequest
0 голосов
/ 23 декабря 2018

У меня есть класс Java, который создает виртуальный экран (назовем его картой), который можно переводить, изменять размер и поворачивать.Однако, когда я поворачиваю его, он вращается только вокруг (0, 0).Чтобы преобразовать точку в экран, сначала поверните ее, затем измените ее размер, а затем переведите.

private double dx; //offset in x and y
private double dy;
private double t; //rotation (radians)
private double sx; //scale of x and y
private double sy;
public double[] toScreen(double x, double y) //takes (x, y) on the map and gives (x1, y1) for the screen 
{
    double[] xy = {x, y};
    if(t != 0)
    {
        double distance = Math.hypot(xy[0], xy[1]);
        double theta = Math.atan2(xy[1], xy[0]) + t;
        xy[0] = Math.cos(theta)*distance;
        xy[1] = Math.sin(theta)*distance;
    }
    xy[0] *= sx;
    xy[1] *= sy;

    xy[0] += dx;
    xy[1] += dy;
    return xy;
}

, чтобы установить или изменить вращение, вы манипулируете переменной t, но она вращается на (0, 0).Если я сделаю метод, который принимает (x, y), чтобы вращаться как public void changeRotation(double t, double x, double y).Я хочу (х, у) быть координатами карты.Как бы выглядел этот метод и можете ли вы объяснить, что он делает?

1 Ответ

0 голосов
/ 24 декабря 2018

Если я правильно понял, это то, что вам нужно:

/**
 * @param point  point (x,y) of the coordinates to be rotated
 * @param center point (x,y) of the center (pivot) coordinates
 * @param angle in radians
 * @return point (x,y) of the new (translated) coordinates 
 */
static Point2D.Double rotateAPoint(Point2D.Double point, Point2D.Double center, double angle){

    double newX = center.x + Math.cos(angle) * (point.x - center.x) -
                                        Math.sin(angle) * (point.y-center.y) ;
    double newY = center.y + Math.sin(angle) * (point.x - center.x) +
                                        Math.cos(angle) * (point.y - center.y) ;
    return new Point2D.Double(newX, newY);
}

Попробуйте с

Point2D.Double  point = new Point2D.Double(200,100);
Point2D.Double center = new Point2D.Double(100,100);
double angle = Math.PI/2 ; //90 degress
System.out.println(rotateAPoint(point, center, angle) );
System.out.println(rotateAPoint(point, center, -angle));

Если вы предпочитаете использовать double[]:

/**
 * @param point  (x,y) of the coordinates to be rotated
 * @param center (x,y) of the center (pivot) coordinates
 * @param angle in radians
 * @return (x,y) of the new (translated) coordinates 
 */
static double[] rotateAPoint(double[] point, double[] center, double angle){

    double newX = center[0] + Math.cos(angle) * (point[0] - center[0]) -
                                        Math.sin(angle) * (point[0]-center[0]) ;
    double newY = center[1] + Math.sin(angle) * (point[1] - center[1]) +
                                        Math.cos(angle) * (point[1] - center[1]) ;
    return new double[]{newX, newY};
}

Объяснение по математике здесь

...