Определите матрицу преобразования

Вероятно, немного излишества, но я наслаждаюсь этим видом изолированной проблемы.:)

Этот код использует временный Набор (для проверки уникальности), но удаляет элементы непосредственно в исходном списке. Так как удаление элемента в ArrayList может вызвать огромный объем копирования массива, удалить (интервал) - метода избегают.

public static <T> void removeDuplicates(ArrayList<T> list) {
    int size = list.size();
    int out = 0;
    {
        final Set<T> encountered = new HashSet<T>();
        for (int in = 0; in < size; in++) {
            final T t = list.get(in);
            final boolean first = encountered.add(t);
            if (first) {
                list.set(out++, t);
            }
        }
    }
    while (out < size) {
        list.remove(--size);
    }
}

, В то время как мы в нем, вот версия для LinkedList (намного более хороший!):

public static <T> void removeDuplicates(LinkedList<T> list) {
    final Set<T> encountered = new HashSet<T>();
    for (Iterator<T> iter = list.iterator(); iter.hasNext(); ) {
        final T t = iter.next();
        final boolean first = encountered.add(t);
        if (!first) {
            iter.remove();
        }
    }
}

Использование маркер взаимодействуют через интерфейс для представления унифицированного решения для Списка:

public static <T> void removeDuplicates(List<T> list) {
    if (list instanceof RandomAccess) {
        // use first version here
    } else {
        // use other version here
    }
}

РЕДАКТИРОВАНИЕ: Я предполагаю, что материал дженериков действительно не добавляет значения здесь.. О, хорошо.:)

6
задан Community 23 May 2017 в 12:01
поделиться

4 ответа

Я запуталась. Это двумерная или трехмерная проблема?

Насколько я понимаю, у вас есть плоский прямоугольник, внедренный в трехмерное пространство, и вы смотрите на две его двухмерные "картинки" - одну из исходной версии, а другую - на основе на трансформированной версии. Это правильно?

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

2
ответ дан 17 December 2019 в 18:19
поделиться

Это математическая задача, а не программирование ..

вам нужно определить набор уравнений (ваша матрица преобразования, я предполагаю, это 3 уравнения), а затем решить его для 4 преобразований угловых точек.

Я когда-либо описывал это только немецкими словами ... так что вышесказанное будет звучать странно ...

1
ответ дан 17 December 2019 в 18:19
поделиться

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

  1. Переместите угол в начало координат. После этого повороты будут происходить вокруг начала координат.
  2. Определите векторы осей. Сделайте это, вычтя смежные углы из исходной точки. Это будут локальные оси x и y вашего мира.
  3. Определите углы, используя векторы. Вы можете использовать точечные произведения и перекрестные произведения, чтобы определить угол между локальной осью x и глобальной осью x (1, 0, 0).
  4. Поверните на угол на шаге 3. Это даст вам новую ось x, которая должен соответствовать глобальной оси x и новой локальной оси y. Затем вы можете определить другой поворот вокруг оси x, который приведет ось y в соответствие с глобальной осью y.

Без координат z вы можете видеть, что это будет сложно, но это общий процесс. Надеюсь, это поможет.

0
ответ дан 17 December 2019 в 18:19
поделиться

Решение не будет уникальным, как указывает Alex319.

Если второе изображение действительно представляет собой трапецию, как вы говорите, то это не будет слишком сложно. Это трапеция (не параллелограмм) из-за перспективы, поэтому она должна быть равнобедренной трапецией.

Нарисуйте две диагонали. Они пересекаются в центре прямоугольника, поэтому смещение выполняется.

Вращайте трапецию, пока ее параллельные стороны не станут параллельны двум сторонам исходного прямоугольника. (Какие два? Неважно.)

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

Теперь о вращении вне плоскости. Измерьте расстояние от центра до одной из параллельных сторон и воспользуйтесь законом синусов.

Если это не трапеция, а только четырехугольник, тогда будет сложнее, вы »

0
ответ дан 17 December 2019 в 18:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: