Проблема перевода при масштабировании объекта - PullRequest
0 голосов
/ 04 октября 2010

У меня есть QGraphicsPolygonItem, определенный как:

myShape << QPointF(-50, -50) << QPointF(50, -50)
                           << QPointF(50, 50) << QPointF(-50, 50)
                           << QPointF(-50, -50);
mypolygon.setPolygon(myShape);

Его исходная матрица является тождественной:

|---|---|---|
| 1 | 0 | 0 |
| 0 | 1 | 0 |
| 0 | 0 | 1 |
|---|---|---|

Когда я расширяю форму, чтобы удвоить ее размер с TransformationPivotVector = (-50, 0) Я получаю следующую матрицу:

Матрица по шкале:

|----|---|---|
| 2 | 0 | 0 |
| 0 | 1 | 0 |
| 50 | 0 | 1 |
|----|---|---|

Это означает, что центр фигуры был переведен на 50 единиц вдоль оси X.

Теперь, учитывая, что фигура в настоящее время имеет матрицу после масштабирования, когда я намереваюсь сжать фигуру с помощью TransformationPivotVector = (50,0), перевод автоматически становится отрицательным, см., Например, когда я сокращаю только 0,01 фигуры:

|-------|---|---|
| 1.99 | 0 | 0 |
| 0 | 1 | 0 |
| -49.5 | 0 | 1 |
|-------|---|---|

Я использую следующую функцию для получения общей матрицы преобразования:

myShape->setTransform(QTransform().translate(transPivotVector.x(), transPivotVector.y()).rotate(rotation).scale(xFactor, yFactor).translate(-transPivotVector.x(),-transPivotVector.y()));

Функция в основном получает окончательную матрицу из: translate * rotate * scale * -translate.

Я полагаю, что эта функция должна включать любой предыдущий перевод объекта, но я не знаю, как.

Пожалуйста, помогите мне !!

Большое спасибо взаранее,

Карлос.

1 Ответ

0 голосов
/ 16 декабря 2010

Я исправил это, пересчитав точку опоры:

QPointF pivot = PivotPoint-pos ();

Также, вычисляя новую матрицу и многократно повторяя предыдущую * новую.

QTransform tmpTransform = QTransform().translate(pivot.x(), pivot.y())
                .rotate(rotation)
                .scale(xFactor, yFactor)
                .translate(-pivot.x(), -pivot.y());


    tmpPolygon->setTransform(this->transform() * tmpTransform); //Multiplies the previous matrix * the temporary

Carlos

...