Матричное зеркало и шкала

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

На первом кадре:

  • Я случайным образом решаю, хочу ли я применить зеркальную матрицу
  • Я измеряю высоту, чтобы увидеть, нужно ли мне применять матрицу масштабирования.

Ниже приведен код, который почти работает. Как-то это не согласуется, и кадры иногда центрированы, а иногда смещены. У меня нет опыта работы с матрицами, поэтому я был бы признателен, если бы кто-то с большим количеством знаний мог подтвердить/исправить/улучшить процедуру преобразования. Эта матрица предоставляется методу рисования холста.

Кроме того, я хотел бы контролировать:

  • если требуется уменьшение масштаба, уменьшите масштаб до точной высоты (высота - мое единственное значение ориентации)
  • можно ли использовать матрицу, чтобы все кадры рисовались с нижним центром?

edit: Думаю, я могу контролировать точное уменьшение размера и нижнее центральное положение с помощью screenRect (целевой прямоугольник)?

Базовый урезанный код:

RectF screenRect = new RectF(0, 0, ((float) displayWith), ((float) displayHeight));

Matrix mirror = null;
if (isMirror) {
    mirror = new Matrix();
    mirror.setScale(-1, 1);
    mirror.postTranslate(p.x, 0); // position X back to original point
}

Matrix scale = null;
if (isScaleDown) { // down-scale
    scale = new Matrix();
    scale.setRectToRect(imageRect, screenRect, Matrix.ScaleToFit.CENTER);           
}               

// COMBINED TRANSFORMATION MATRIX
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Matrix trans = null;
if (scale != null) trans = scale;
if (mirror != null && trans == null) trans = mirror;
if (mirror != null && trans != null) trans.setConcat(trans, mirror);
return trans;

person hpet    schedule 09.05.2013    source источник


Ответы (1)


Для тех, кто заинтересован, я установил «масштабную» и «зеркальную» матрицу следующим образом:

  1. matrix.setScale (масштабный коэффициент, масштабный коэффициент); // значение между 0..1
  2. matrix.postScale(-1, 1, смещениеX, смещениеY); // отразить по вертикали и сместить вправо
  3. matrix.postTranslate(dx, dy); // конечная позиция матрицы - для меня "выравнивание по нижнему центру"
person hpet    schedule 11.06.2013