координаты прямоугольника после вращения - PullRequest
2 голосов
/ 09 мая 2011

Я использую SWT GC для рисования изображений. Одним из вариантов моей программы является поворот изображения. Я также рисую прямоугольник в качестве границы. Для поворота я использую следующий код:

Transform oldTransform = new Transform(gc.getDevice());  
    gc.getTransform(oldTransform);

    Transform transform = new Transform(GCController.getCanvas().getDisplay());
    transform.translate(this.x+width/2, this.y+height/2);
    transform.rotate(rotation);
    transform.scale(this.scaleX, this.scaleY);
    transform.getElements(elements);
    transform.translate(-this.x-width/2, -this.y-height/2);

    gc.setTransform(transform);
    gc.drawImage(image, this.x, this.y);            
    gc.setTransform(oldTransform);

    transform.dispose();

После поворота я хотел бы рассчитать положения углов моего прямоугольника. Я пытался что-то вроде этого:

    int tx = (this.x+width/2);
    int ty = (this.y+height/2);

    double rot = rotation * Math.PI/180;

    double newX = tx*Math.cos(rot) - ty*Math.sin(rot);
    double newY = tx*Math.sin(rot) + ty*Math.cos(rot);

Но это не работает, как я ожидал.

Я также пытался использовать матрицу преобразования, которую я получаю в массив элементов после каждого преобразования:

int tx = (this.x+width/2);
    int ty = (this.y+height/2);

    double newX = this.x * elements[0] + this.y * elements[2];
    double newY = this.x * elements[1] + this.y * elements[3];

Но это дает те же результаты, что и использование уравнений для вращения. Есть идеи?

Я решил это:

    int tx = (-width/2);
    int ty = (-height/2);

    double rot = rotation * Math.PI/180;

    double newX = (tx)*Math.cos(rot) - (ty)*Math.sin(rot) + this.x + width/2;
    double newY = (tx)*Math.sin(rot) + (ty)*Math.cos(rot) + this.y + height/2;

Я вернулся к 0,0. Сделайте вращение и после вращения переведите его обратно.

1 Ответ

1 голос
/ 09 мая 2011

Вам просто нужно умножить матрицу преобразования на вектор положения для каждой из точек вашего прямоугольника.

Предположительно, у класса Transform есть метод для этого (будет иметь смысл), но я могу 'я не могу найти читаемую документацию по API "swt gc", поэтому я не могу сказать вам, что это такое.

...