2017-09-12 5 views
2

Je suis actuellement à la recherche dans Eigen::Isometry3f, défini comme typedef Transform<float,3,Isometry> Isometry3f;. Par conséquent, je ne peux pas, par exemple, affecter un Affine3f à Isometry3f, ce qui est bon pour garder l'isométrie intacte. (La raison est que Mode est cochée dans l'opérateur d'affectation de Transform.)Comment s'assurer que l'isométrie propre reste isométrique?

Je peux cependant - via le Transform::operator(...), les raccourcis à Transform::m_matrix(...) - font

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

et détruisent ainsi l'isométrie.

Q1: Ne devrait pas Transform::operator(...) être désavouée ou au moins émettre un avertissement? Si vous voulez vraiment gâcher, vous pouvez toujours utiliser Transform.matrix()(1,1) = 2 ...

Q2: Y at-il d'autres pièges où je pourrais accidentellement détruire mon isométrie?

Q3: S'il y a d'autres pièges: quelle est l'intention de Mode==Isometry? N'est-ce pas pour assurer la fermeture/sécurité?

Répondre

1

Le but principal de Mode==Isometry est d'améliorer la vitesse de certaines opérations, comme l'inversion, ou l'extraction de la partie de rotation. Il dit essentiellement "je, l'utilisateur, la garantie à Eigen que la matrice sous-jacente représente une isométrie". Il est donc de la responsabilité de l'utilisateur de ne pas tirer lui-même. Vous pouvez aussi casser une isométrie initiale en remplaçant la partie linéaire avec une mauvaise matrice:

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

Vérification de isométrie est pas pas cher du tout, afin d'ajouter des contrôles partout romprait l'objectif initial. Peut-être que l'ajout d'un bool Transform::checkIsometry() aiderait à repérer les problèmes dans le code de l'utilisateur, mais cela est hors de la portée de SO.

+0

Il me semble qu'il y a des endroits où Eigen prend la responsabilité de préserver les isométries, comme l'échelle, le cisaillement et l'assignation ou la concaténation interdits avec des non-isométries. Pourquoi ne pas passer à l'étape suivante et interdire l'accès à la matrice à travers des objets transformés de type isométrie? Alternative: faire clairement comprendre aux docs que c'est un indice puisque les docs de 'Transform' disent seulement que' _Mode' est "le type de transformation" et ne mentionnent pas son utilisation interne comme indice - peut-être incorrect -. Peut-être alors l'enum 'TransformTraits' ne devrait pas être utilisé comme indicateur de mode de stockage et indice pour l'inverse, etc. – Thomas

+0

Rendre opérateur() et linear() const pour Isometry serait pénible pour l'utilisateur et cela casserait le code existant. En revanche, appeler échelle/cisaillement et les goûts est un non sens pour les isométries. Mais je suis d'accord que le document pourrait être plus clair et avertir de tels pièges. – ggael