2017-09-12 15 views
2

현재 을 찾고 있는데, typedef Transform<float,3,Isometry> Isometry3f;으로 정의됩니다.Eigen isometry가 등각 투영법을 유지하는 방법?

따라서 예를 들어, Isometry3fAffine3f을 할당 할 수 없으므로 isometry를 그대로 유지하는 것이 좋습니다. (그 이유는 ModeTransform의 할당 연산자에 선택되어 있는지입니다.)

나는 그러나 수 -

Eigen::Isometry3f iso; 
iso.setIdentity(); 
iso(1, 1) = 2; //works (but should not ?!) 

을 따라서 등거리 변환을 파괴 - Transform::m_matrix(...) 바로 가기가 Transform::operator(...) 통해.

: Transform::operator(...)을 허용하지 않거나 경고를 발행해야합니까? 내가 실수로 등거리 변환을 파괴 할 수있다 다른 함정 위치 : 당신이 정말 엉망하려면까지 당신은 여전히 ​​

Q2은 ... Transform.matrix()(1,1) = 2 사용할 수 있을까?

: 다른 함정이있는 경우 : Mode==Isometry의 의도는 무엇입니까? 폐쇄성/안전성을 보장하지 않습니까?

답변

1

Mode==Isometry의 주된 목적은 회전 또는 반전과 같은 일부 작업의 속도를 향상시키는 것입니다. 본질적으로 "나는 사용자, 기본 행렬이 등각 투영을 나타내는 Eigen에 대한 보장"이라고 말합니다. 따라서 사용자가 직접 쏘지 않아도되는 것은 사용자의 책임입니다. , 등거리 변환에 대해 확인하는 것은 전혀 싸지 않다

iso.linear() = Matrix3f::Random(); 

그래서 초기 목적을 끊을 모든 곳에서 검사를 추가 : 당신은 또한 나쁜 행렬과 선형 부분을 대체하여 초기 등거리 변환을 깰 수 있습니다. 아마도 bool Transform::checkIsometry()을 추가하면 사용자 코드에서 문제를 추적하는 데 도움이되지만 이는 범위를 벗어난 것입니다.

+0

아이겐 (Iigen)이 아이소 메 트리 (Isoometries)를 보존 할 책임이 있다고 생각합니다. 스케일, 전단 및 할당 또는 비등 방성과의 연결을 금지하는 것과 같습니다. 왜 다음 단계를 수행하고 isometry 유형의 변형 객체를 통해 행렬 액세스를 금지합니까? 대안 : 문서에서'Transform'의 문서는'_Mode'가 "변환 유형"이라고 말하고 내부 사용을 - 아마도 잘못된 - 힌트로 언급하지 않기 때문에 힌트라고 절대적으로 분명히하십시오. 어쩌면'TransformTraits' 열거 형을 저장 모드 표시기와 역함수 등에 대한 힌트로 사용해서는 안됩니다. – Thomas

+0

Isometry에 대한 operator() 및 linear() const를 사용자에게 힘들게 만들면 기존 코드가 손상됩니다. 대조적으로, scale/shear와 같은 것을 호출하는 것은 등각 투영에 대해 의미가 없습니다. 그러나 의사가 더 명확하고 그러한 함정에 대해 경고 할 수 있다는 것에 동의합니다. – ggael