Вероятно, немного излишества, но я наслаждаюсь этим видом изолированной проблемы.:)
Этот код использует временный Набор (для проверки уникальности), но удаляет элементы непосредственно в исходном списке. Так как удаление элемента в 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
}
}
РЕДАКТИРОВАНИЕ: Я предполагаю, что материал дженериков действительно не добавляет значения здесь.. О, хорошо.:)
Я запуталась. Это двумерная или трехмерная проблема?
Насколько я понимаю, у вас есть плоский прямоугольник, внедренный в трехмерное пространство, и вы смотрите на две его двухмерные "картинки" - одну из исходной версии, а другую - на основе на трансформированной версии. Это правильно?
Если это верно, значит, для решения проблемы недостаточно информации. Например, предположим, что две картинки выглядят совершенно одинаково. Это могло произойти из-за того, что перевод является тождеством, или из-за того, что перевод сдвигает прямоугольник вдвое дальше от камеры и удваивает его размер (таким образом, он выглядит точно так же).
Это математическая задача, а не программирование ..
вам нужно определить набор уравнений (ваша матрица преобразования, я предполагаю, это 3 уравнения), а затем решить его для 4 преобразований угловых точек.
Я когда-либо описывал это только немецкими словами ... так что вышесказанное будет звучать странно ...
Судя по имеющейся у вас информации, это не так просто. Однако я дам вам несколько идей, с которыми можно поиграть. Если бы у вас были трехмерные координаты углов, вам было бы легче. Вот основная идея.
Без координат z вы можете видеть, что это будет сложно, но это общий процесс. Надеюсь, это поможет.
Решение не будет уникальным, как указывает Alex319.
Если второе изображение действительно представляет собой трапецию, как вы говорите, то это не будет слишком сложно. Это трапеция (не параллелограмм) из-за перспективы, поэтому она должна быть равнобедренной трапецией.
Нарисуйте две диагонали. Они пересекаются в центре прямоугольника, поэтому смещение выполняется.
Вращайте трапецию, пока ее параллельные стороны не станут параллельны двум сторонам исходного прямоугольника. (Какие два? Неважно.)
Проведите третью параллель через центр. Масштабируйте это по сторонам прямоугольника, который вы выбрали.
Теперь о вращении вне плоскости. Измерьте расстояние от центра до одной из параллельных сторон и воспользуйтесь законом синусов.
Если это не трапеция, а только четырехугольник, тогда будет сложнее, вы »