От 2-D пространства будет 2 допустимых прямоугольника, которые могут быть созданы. Не зная исходную матричную проекцию, Вы не будете знать, какой корректен. Это совпадает с проблемой "поля": Вы видите два квадрата, одна внутренняя часть другой, с 4 внутренними вершинами, подключенными к 4 соответствующим внешним вершинам. Вы смотрите на поле от нисходящего или восходящего?
Однако Вы ищете матричное преобразование T где...
{{x1, y1, z1}, {x2, y2, z2}, {x3, y3, z3}, {x4, y4, z4}} x T = {{x1, y1}, {x2, y2}, {x3, y3}, {x4, y4}}
(4 x 3) x T = (4 x 2)
, Таким образом, T должен быть (3 x 2) матрица. Таким образом, у нас есть 6 неизвестных.
Теперь создают систему из ограничений на T и решают с Симплексом. Для создания ограничений Вы знаете, что строка, проходящая через первые две точки, должна быть параллельна передаче строки вторым двум точкам. Вы знаете, что строка, проходящая через точки 1 и 3, должна быть параллельна строкам, проходящим через точки 2 и 4. Вы знаете, что строка, проходящая 1 и 2, должна быть ортогональной к строке, проходящей через точки 2 и 3. Вы знаете, что длина строки от 1 и 2 должна равняться длине строки от 3 и 4. Вы знаете, что длина строки от 1 и 3 должна равняться длине строки от 2 и 4.
Для создания этого еще легче Вы знаете о прямоугольнике, таким образом, Вы знаете длину всех сторон.
, Который должен дать Вам много ограничений для решения этой проблемы.
, Конечно, для возвращения можно найти T-инверсию.
@Rob: Да, существует бесконечное число проекций, но не бесконечное число проектов, где точки должны удовлетворить требования прямоугольника.
@nlucaroni: Да, это только разрешимо, если у Вас есть четыре точки в проекции. Если прямоугольные проекты ко всего 2 точкам (т.е. плоскость прямоугольника является ортогональным на поверхность проекции), то это не может быть решено.
Hmmm... Я должен пойти домой и записать этот небольшой драгоценный камень. Это походит на забаву.
Обновления:
Нет - последний класс означает, что вы не можете наследовать от него. Это не имеет ничего общего с изменчивостью. Следующий класс является окончательным, но изменяемым:
public final class FinalMutable {
int value;
public void setValue(int v) { value=v; }
public int getValue() { return value; }
}
Нет, final означает, что класс не может быть расширен. Это ничего не говорит об изменчивости. Например:
final class MutInt {
public int modifyMe;
}
Не существует ключевого слова для неизменяемости, это больше похоже на шаблон проектирования.
РЕДАКТИРОВАТЬ:
Это означает, что нет ключевого слова, делающего класс неизменяемым. Чтобы сделать класс неизменяемым, вы должны защитить внутренние компоненты, сделав их окончательными или закрытыми.
Непонятная вещь заключается в следующем: ключевое слово final имеет другое значение при использовании в классе, чем при использовании в поле / переменной. Первое означает «этот класс не может быть расширен». Второй означает, что «эту переменную (или ссылку) изменить нельзя».
As has been said by the others before final
does not make a class imuutable in Java though it plays a part in the immutability strategy. To obtain immutability you should follow the general guidlines:
final
, or use static factories and keep constructors private private
and final
setXXX
methods (that is, avoid the Java Beans convention) setXXX
methods, but any method which can change state В дополнение к другим ответам, если вы посмотрите на код для java.lang.String
, вы увидите, что он содержит поле: hash
, который является изменяемым и фактически вычисляется и сохраняется при первом вызове hashCode ()
.
Однако класс по-прежнему неизменяемый : Поле хэша
не может быть доступно напрямую или изменено за пределами класса.
Кроме того, вы можете заметить, что общий подход в JDK - это реализация неизменяемых оболочек, которые могут использоваться для раскрытия внутренних объектов объекта. состояние, не позволяя его изменять; например,
private final List<String> values;
public List<? get String> getValues() {
return Collections.unmodifiableList(values);
}