Создать систему преобразования матриц в React Native?

Я только что создал относительно сложный пользовательский интерфейс для редактирования изображений в React Native.

Предполагается, что интерфейс будет очень похож на Instagram и имеет функции масштабирования, панорамирования и поворота.

Преобразования хранятся в виде данных, например:

transformation: {
  bottomBoundary: 1989,
  leftBoundary: 410,
  rightBoundary: 1634,
  topBoundary: 765,
  rotation: 0,
},

Где topBoundary и bottomBoundary - это смещения от верха изображения, а leftBoundary и rightBoundary - оба смещения от левого края изображения.

При повороте, поскольку React Native использует центр объектов в качестве источника преобразования, изображения необходимо смещать, когда они находятся в ориентации 90 ° или 270 °, чтобы они по-прежнему «прилипали» к верхнему / левому углу и могли быть смещены:

CalculRotationOffset.js

export default function (width, height) {
  const transform = [
    { rotate: `${this.rotation}deg` },
  ]

  /*
    RN rotates around centre point, so we need to
    manually offset the rotation to stick the image
    to the top left corner so that our offsets will
    work.
  */
  if (this.rotation === 90) {
    transform.push(
      { translateX: -((width - height) / 2) },
      { translateY: -((width - height) / 2) },
    )
  } else if (this.rotation === 270) {
    transform.push(
      { translateX: ((width - height) / 2) },
      { translateY: ((width - height) / 2) },
    )
  }
  return transform
}

Что-то в моей реализации поворота и масштабирования не работает вместе.

Вот полный пример закуски..

Чтобы воспроизвести ошибку:

  1. Один раз повернуть изображение
  2. Сведите пальцы, чтобы увеличить или уменьшить масштаб
  3. Снова поверните изображение

Изображение теперь будет перевернуто и смещено неправильно.

Здесь последовательно происходят как минимум три преобразования, чтобы воспроизвести ошибку, поэтому мне не удалось отследить проблему.

Этот вопрос обязательно будет одобрен, если это необходимо, и я могу также предложить денежное вознаграждение. Спасибо!

Обновлять: После нескольких предложений кажется, что лучший способ решить эту проблему - использовать преобразования матриц, а затем каким-то образом преобразовать эту матрицу обратно в стиль, который RN может отображать на экране. Матричные преобразования должны поддерживать панорамирование, поворот и масштабирование.

Это похоже на обычную проблему, которая возникает, когда вы представляете преобразование с отдельными частями преобразования, которые не следует разделять. Есть ли у вас возможность напрямую установить матрицу и комбинировать разные матрицы? Кстати, я не знаю фреймворка React. Скорее всего, это значительно упростит задачу. Например, смещения также должны вращаться при повороте изображения. Это будет сделано неявно с помощью единственной матрицы и соответствующих операторов.

Nico Schertler 24.04.2018 20:32

@NicoSchertler Я полагаю, что это был бы вариант, но причина, по которой я делаю это таким образом, заключается в том, чтобы как можно проще отскакивать преобразованные изображения от основного изображения с учетом данных преобразования. В частности, используя Cloudinary API. Если у вас есть идея полностью переписанного решения, напишите мне в личку.

j_d 25.04.2018 08:54

Эти виды преобразований зависят от порядка, поэтому проверьте свой код, если вы используете тот же порядок преобразований, что и предполагалось (при редактировании), но, как указал Нико, использование кумулятивной единой унифицированной матрицы 3x3 намного проще и нечестно, чем это. для получения дополнительной информации взгляните на это: Понимание матриц однородного преобразования 4x4 они 3D, поэтому у вас не будет осей Z и координаты Z (матрица 3x3), отбрасываемой (Xz,Yz,Zx,Zy,Zz и один из нулей в столбце Z?)

Spektre 29.04.2018 11:24

@Spektre Да, я уже несколько раз видел это, но не понимаю, как это проще.

j_d 30.04.2018 10:03

вместо обработки открытого упорядоченного списка команд преобразования, которые влияют друг на друга, вы применяете или запоминаете только одну матрицу 3x3, несмотря ни на что. нет условий if, что бы то ни было

Spektre 30.04.2018 17:07

@Spektre Да, с этой стороны все ясно. Как преобразовать эту матрицу в стиль, понятный RN? Бесплатной карты нет, логика должна быть написана в какой-то момент ...

j_d 01.05.2018 09:06

@IsaacHinman результирующий сдвиг вращения и масштаб могут быть извлечены непосредственно из матрицы, извлекая 2 вектора оси и начало координат ... размер каждого вектора оси дает вам масштаб, вращение в 2D - это простое использование atan2 по оси X, а начало координат - это перевод ...

Spektre 01.05.2018 16:03

@Spektre Вы заинтересованы в создании демонстрационного решения для вознаграждения?

j_d 01.05.2018 18:59

@IsaacHinman Я не использую код в среде, которую вы помечаете, поэтому не совсем, но этот Разобрать 2D матрицу преобразования может помочь

Spektre 01.05.2018 19:10

@Spektre Если вы доступны для найма, пожалуйста, напишите мне в личку.

j_d 02.05.2018 10:06

@IsaacHinman, мое рабочее время программирования на следующие 10-15 лет уже забронировано. Я кодирую простые вещи здесь как начало или отвлечение перед тем, как приступить к «тяжелым» вещам.

Spektre 02.05.2018 10:12

@Spektre Понятно. Спасибо за ваше время, я перечитаю ваши предыдущие комментарии и попытаюсь понять.

j_d 02.05.2018 10:17

Вы проводили модульные тесты отдельных преобразований, а затем комбинации преобразований? Я уверен, что такая библиотека уже должна быть. Пробовали работать от github.com/kiddkai/react-native-gestures?

Soleil 03.05.2018 12:08

Мне удалось создать ваше приложение и запустить его. Вы добились прогресса? У вас есть репо?

Soleil 03.05.2018 13:48

@Soleil Что именно ты спрашиваешь? Я хочу реорганизовать приложение (как показано в закуске Expo), чтобы использовать более простую систему преобразования матриц. Нет, прогресса и репо нет.

j_d 03.05.2018 14:25

@IsaacHinman Мне не удалось воспроизвести вашу ошибку, все в порядке. Тем не менее, вы теряете сковороду после первого зажима, и она больше не возвращается. Нет проблем, когда мы вращаемся.

Soleil 03.05.2018 16:10

Невозможно воспроизвести ошибку, но вам нужен this.pinching = false в handleResponderEnd, иначе вы больше не сможете панорамировать после защемления.

Anthony De Smet 09.06.2018 13:35

@j_d просто стоит отметить, что React Native уже поддерживает matrix в качестве типа преобразования, поэтому нет необходимости конвертировать обратно - github.com/facebook/react-native/blob/…

levi 05.12.2019 11:25
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
34
18
3 417
1

Ответы 1

Я бы заменил bottomBoundary и т. д. На разложенную матрицу преобразования (поворот, масштаб, перевод) и использовал бы мультитач в пользовательском интерфейсе. Проведя одним пальцем по изображению, вы можете обновить компонент трансляции матрицы, а двумя пальцами трансформировать его так, чтобы изображение прилипало к пальцам. Если вы хотите ограничить вращение шагом в 90 градусов, вы можете привязать его, когда пользователь отпустит. Это позволяет вам свободно и интуитивно перемещаться по изображению, не требуя кнопок текущего поворота.

Хранение матрицы всегда в разложенной форме позволяет избежать ее разложения или нормализации, чтобы избежать накопления числовой неточности (перекоса и изменения соотношения сторон).

Создание нового класса DecomposedMatrix поможет структурировать код. Ключ в том, чтобы преобразовать его примерно так:

scaleBy(scale) {
    this.scale *= scale;
    this.x *= scale;
    this.y *= scale;
}

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

j_d 03.05.2018 10:22

@IsaacHinman полностью меняет пользовательский интерфейс, внутреннюю логику и меняет представление о том, следует ли использовать матрицу преобразования, которая требует преобразования в формат React Native. Таким образом, он не переформулирует ситуацию, а использует совершенно новый подход. Я собирался также добавить образец кода, но передумал ...

jjrv 03.05.2018 10:24

@jjrv Тогда, возможно, я прочитал ответ до того, как вы его закончили. Одевают!

j_d 03.05.2018 10:27

Другие вопросы по теме