Changeset 31fb1d


Ignore:
Timestamp:
Aug 11, 2010, 2:58:43 PM (15 years ago)
Author:
Frederik Heber <heber@…>
Branches:
Action_Thermostats, Add_AtomRandomPerturbation, Add_FitFragmentPartialChargesAction, Add_RotateAroundBondAction, Add_SelectAtomByNameAction, Added_ParseSaveFragmentResults, AddingActions_SaveParseParticleParameters, Adding_Graph_to_ChangeBondActions, Adding_MD_integration_tests, Adding_ParticleName_to_Atom, Adding_StructOpt_integration_tests, AtomFragments, Automaking_mpqc_open, AutomationFragmentation_failures, Candidate_v1.5.4, Candidate_v1.6.0, Candidate_v1.6.1, ChangeBugEmailaddress, ChangingTestPorts, ChemicalSpaceEvaluator, CombiningParticlePotentialParsing, Combining_Subpackages, Debian_Package_split, Debian_package_split_molecuildergui_only, Disabling_MemDebug, Docu_Python_wait, EmpiricalPotential_contain_HomologyGraph, EmpiricalPotential_contain_HomologyGraph_documentation, Enable_parallel_make_install, Enhance_userguide, Enhanced_StructuralOptimization, Enhanced_StructuralOptimization_continued, Example_ManyWaysToTranslateAtom, Exclude_Hydrogens_annealWithBondGraph, FitPartialCharges_GlobalError, Fix_BoundInBox_CenterInBox_MoleculeActions, Fix_ChargeSampling_PBC, Fix_ChronosMutex, Fix_FitPartialCharges, Fix_FitPotential_needs_atomicnumbers, Fix_ForceAnnealing, Fix_IndependentFragmentGrids, Fix_ParseParticles, Fix_ParseParticles_split_forward_backward_Actions, Fix_PopActions, Fix_QtFragmentList_sorted_selection, Fix_Restrictedkeyset_FragmentMolecule, Fix_StatusMsg, Fix_StepWorldTime_single_argument, Fix_Verbose_Codepatterns, Fix_fitting_potentials, Fixes, ForceAnnealing_goodresults, ForceAnnealing_oldresults, ForceAnnealing_tocheck, ForceAnnealing_with_BondGraph, ForceAnnealing_with_BondGraph_continued, ForceAnnealing_with_BondGraph_continued_betteresults, ForceAnnealing_with_BondGraph_contraction-expansion, FragmentAction_writes_AtomFragments, FragmentMolecule_checks_bonddegrees, GeometryObjects, Gui_Fixes, Gui_displays_atomic_force_velocity, ImplicitCharges, IndependentFragmentGrids, IndependentFragmentGrids_IndividualZeroInstances, IndependentFragmentGrids_IntegrationTest, IndependentFragmentGrids_Sole_NN_Calculation, JobMarket_RobustOnKillsSegFaults, JobMarket_StableWorkerPool, JobMarket_unresolvable_hostname_fix, MoreRobust_FragmentAutomation, ODR_violation_mpqc_open, PartialCharges_OrthogonalSummation, PdbParser_setsAtomName, PythonUI_with_named_parameters, QtGui_reactivate_TimeChanged_changes, Recreated_GuiChecks, Rewrite_FitPartialCharges, RotateToPrincipalAxisSystem_UndoRedo, SaturateAtoms_findBestMatching, SaturateAtoms_singleDegree, StoppableMakroAction, Subpackage_CodePatterns, Subpackage_JobMarket, Subpackage_LinearAlgebra, Subpackage_levmar, Subpackage_mpqc_open, Subpackage_vmg, Switchable_LogView, ThirdParty_MPQC_rebuilt_buildsystem, TrajectoryDependenant_MaxOrder, TremoloParser_IncreasedPrecision, TremoloParser_MultipleTimesteps, TremoloParser_setsAtomName, Ubuntu_1604_changes, stable
Children:
2b7d1b
Parents:
03c902
Message:

(un)select-atoms-inside-cuboid: cuboid may be rotated.

  • Matrix::rotate() sets contents to arbitrary rotation matrix.
  • BUGFIX: Matrix::transpose() was working only for symmetric matrices.
  • TEST: unit test cases for rotation() and transpose().
  • new options "angle-x", "angle-y", "angle-z"
  • (un)select-atoms-inside-cuboid: have these as optional arguments.
Location:
src
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • src/Actions/MapOfActions.cpp

    r03c902 r31fb1d  
    256256  DescriptionMap["version"] = "show version";
    257257  // keys for values
     258  DescriptionMap["angle-x"] = "angle of a rotation around x axis";
     259  DescriptionMap["angle-y"] = "angle of a rotation around y axis";
     260  DescriptionMap["angle-z"] = "angle of a rotation around z axis";
    258261  DescriptionMap["bin-output-file"] = "name of the bin output file";
    259262  DescriptionMap["bin-end"] = "start of the last bin";
     
    383386
    384387  // value types for the values
     388  TypeMap["angle-x"] = &typeid(double);
     389  TypeMap["angle-y"] = &typeid(double);
     390  TypeMap["angle-z"] = &typeid(double);
    385391  TypeMap["bin-output-file"] = &typeid(std::string);
    386392  TypeMap["bin-end"] = &typeid(double);
     
    583589
    584590    // hidden arguments
     591  hidden.insert("angle-x");
     592  hidden.insert("angle-y");
     593  hidden.insert("angle-z");
    585594  hidden.insert("bin-end");
    586595  hidden.insert("bin-output-file");
  • src/Actions/SelectionAction/AllAtomsInsideCuboidAction.cpp

    r03c902 r31fb1d  
    2020#include "Helpers/Log.hpp"
    2121#include "Helpers/Verbose.hpp"
     22#include "LinearAlgebra/Matrix.hpp"
    2223#include "LinearAlgebra/Vector.hpp"
    2324#include "Shapes/BaseShapes.hpp"
     
    4041class SelectionAllAtomsInsideCuboidState : public ActionState {
    4142public:
    42   SelectionAllAtomsInsideCuboidState(std::vector<atom*> _selectedAtoms, const Vector &_position, const Vector &_extension) :
     43  SelectionAllAtomsInsideCuboidState(std::vector<atom*> _selectedAtoms, const Vector &_position, const Vector &_extension, const double _Xangle, const double _Yangle, const double _Zangle) :
    4344    selectedAtoms(_selectedAtoms),
    4445    position(_position),
    45     extension(_extension)
     46    extension(_extension),
     47    Xangle(_Xangle),
     48    Yangle(_Yangle),
     49    Zangle(_Zangle)
    4650  {}
    4751  std::vector<atom*> selectedAtoms;
    4852  Vector position;
    4953  Vector extension;
     54  double Xangle;
     55  double Yangle;
     56  double Zangle;
    5057};
    5158
     
    6572};
    6673
     74void SelectionAllAtomsInsideCuboid(const Vector &position, const Vector &extension, const double Xangle, const double Yangle, const double Zangle) {
     75  ValueStorage::getInstance().setCurrentValue(SelectionAllAtomsInsideCuboidAction::NAME, extension);
     76  ValueStorage::getInstance().setCurrentValue("position", position);
     77  ValueStorage::getInstance().setCurrentValue("angle-x", Xangle);
     78  ValueStorage::getInstance().setCurrentValue("angle-y", Yangle);
     79  ValueStorage::getInstance().setCurrentValue("angle-z", Zangle);
     80  ActionRegistry::getInstance().getActionByName(SelectionAllAtomsInsideCuboidAction::NAME)->call(Action::NonInteractive);
     81};
     82
    6783Dialog* SelectionAllAtomsInsideCuboidAction::fillDialog(Dialog *dialog) {
    6884  ASSERT(dialog,"No Dialog given when filling action dialog");
     
    7894  Vector position;
    7995  Vector extension;
     96  double Xangle = 0.;
     97  double Yangle = 0.;
     98  double Zangle = 0.;
     99  Matrix RotationMatrix;
    80100
    81101  ValueStorage::getInstance().queryCurrentValue("position", position);
    82102  ValueStorage::getInstance().queryCurrentValue(NAME, extension);
     103  // check whether a rotation is given.
     104  if (ValueStorage::getInstance().queryCurrentValue("angle-x", Xangle, true))
     105    Xangle = 0.;
     106  if (ValueStorage::getInstance().queryCurrentValue("angle-y", Yangle, true))
     107    Yangle = 0.;
     108  if (ValueStorage::getInstance().queryCurrentValue("angle-z", Zangle, true))
     109    Zangle = 0.;
     110  RotationMatrix.rotation(Xangle, Yangle, Zangle);
    83111
    84   DoLog(1) && (Log() << Verbose(1) << "Selecting all atoms inside a cuboid at " << position << " and extension of " << extension << "." << endl);
    85   Shape s = translate(stretch(Cuboid(),extension),position);
     112  DoLog(1) && (Log() << Verbose(1) << "Selecting all atoms inside a rotated " << RotationMatrix << " cuboid at " << position << " and extension of " << extension << "." << endl);
     113  Shape s = translate(transform(stretch(Cuboid(),extension),RotationMatrix),position);
    86114  World::getInstance().selectAllAtoms(AtomByShape(s));
    87   return Action::state_ptr(new SelectionAllAtomsInsideCuboidState(selectedAtoms, position, extension));
     115  return Action::state_ptr(new SelectionAllAtomsInsideCuboidState(selectedAtoms, position, extension, Xangle, Yangle, Zangle));
    88116}
    89117
     
    95123    World::getInstance().selectAtom(*iter);
    96124
    97   return Action::state_ptr(new SelectionAllAtomsInsideCuboidState(state->selectedAtoms, state->position, state->extension));
     125  return Action::state_ptr(_state);
    98126}
    99127
    100128Action::state_ptr SelectionAllAtomsInsideCuboidAction::performRedo(Action::state_ptr _state){
    101129  SelectionAllAtomsInsideCuboidState *state = assert_cast<SelectionAllAtomsInsideCuboidState*>(_state.get());
     130  Matrix RotationMatrix;
    102131
    103   Shape s = translate(stretch(Cuboid(),state->extension),state->position);
     132  RotationMatrix.rotation(state->Xangle, state->Yangle, state->Zangle);
     133  Shape s = translate(transform(stretch(Cuboid(),state->extension),RotationMatrix),state->position);
    104134  World::getInstance().selectAllAtoms(AtomByShape(s));
    105135
    106   return Action::state_ptr(new SelectionAllAtomsInsideCuboidState(state->selectedAtoms, state->position, state->extension));
     136  return Action::state_ptr(_state);
    107137}
    108138
  • src/Actions/SelectionAction/AllAtomsInsideCuboidAction.hpp

    r03c902 r31fb1d  
    1717class SelectionAllAtomsInsideCuboidAction : public Action {
    1818  friend void SelectionAllAtomsInsideCuboid(const Vector &position, const Vector &extension);
     19  friend void SelectionAllAtomsInsideCuboid(const Vector &position, const Vector &extension, const double Xangle, const double Yangle, const double Zangle);
    1920
    2021public:
  • src/Actions/SelectionAction/NotAllAtomsInsideCuboidAction.cpp

    r03c902 r31fb1d  
    2020#include "Helpers/Log.hpp"
    2121#include "Helpers/Verbose.hpp"
     22#include "LinearAlgebra/Matrix.hpp"
    2223#include "LinearAlgebra/Vector.hpp"
    2324#include "Shapes/BaseShapes.hpp"
     
    4041class SelectionNotAllAtomsInsideCuboidState : public ActionState {
    4142public:
    42   SelectionNotAllAtomsInsideCuboidState(std::vector<atom*> _selectedAtoms, const Vector &_position, const Vector &_extension) :
     43  SelectionNotAllAtomsInsideCuboidState(std::vector<atom*> _selectedAtoms, const Vector &_position, const Vector &_extension, const double _Xangle, const double _Yangle, const double _Zangle) :
    4344    selectedAtoms(_selectedAtoms),
    4445    position(_position),
    45     extension(_extension)
     46    extension(_extension),
     47    Xangle(_Xangle),
     48    Yangle(_Yangle),
     49    Zangle(_Zangle)
    4650  {}
    4751  std::vector<atom*> selectedAtoms;
    4852  Vector position;
    4953  Vector extension;
     54  double Xangle;
     55  double Yangle;
     56  double Zangle;
    5057};
    5158
     
    6572};
    6673
     74void SelectionNotAllAtomsInsideCuboid(const Vector &position, const Vector &extension, const double Xangle, const double Yangle, const double Zangle) {
     75  ValueStorage::getInstance().setCurrentValue(SelectionNotAllAtomsInsideCuboidAction::NAME, extension);
     76  ValueStorage::getInstance().setCurrentValue("position", position);
     77  ValueStorage::getInstance().setCurrentValue("angle-x", Xangle);
     78  ValueStorage::getInstance().setCurrentValue("angle-y", Yangle);
     79  ValueStorage::getInstance().setCurrentValue("angle-z", Zangle);
     80  ActionRegistry::getInstance().getActionByName(SelectionNotAllAtomsInsideCuboidAction::NAME)->call(Action::NonInteractive);
     81};
     82
    6783Dialog* SelectionNotAllAtomsInsideCuboidAction::fillDialog(Dialog *dialog) {
    6884  ASSERT(dialog,"No Dialog given when filling action dialog");
     
    7894  Vector position;
    7995  Vector extension;
     96  double Xangle = 0.;
     97  double Yangle = 0.;
     98  double Zangle = 0.;
     99  Matrix RotationMatrix;
    80100
    81101  ValueStorage::getInstance().queryCurrentValue("position", position);
    82102  ValueStorage::getInstance().queryCurrentValue(NAME, extension);
     103  // check whether a rotation is given.
     104  if (ValueStorage::getInstance().queryCurrentValue("angle-x", Xangle, true))
     105    Xangle = 0.;
     106  if (ValueStorage::getInstance().queryCurrentValue("angle-y", Yangle, true))
     107    Yangle = 0.;
     108  if (ValueStorage::getInstance().queryCurrentValue("angle-z", Zangle, true))
     109    Zangle = 0.;
     110  RotationMatrix.rotation(Xangle, Yangle, Zangle);
    83111
    84   DoLog(1) && (Log() << Verbose(1) << "Unselecting all atoms inside a cuboid at " << position << " and extension of " << extension << "." << endl);
    85   Shape s = translate(stretch(Cuboid(),extension),position);
     112  DoLog(1) && (Log() << Verbose(1) << "Unselecting all atoms inside a rotated " << RotationMatrix << " cuboid at " << position << " and extension of " << extension << "." << endl);
     113  Shape s = translate(transform(stretch(Cuboid(),extension),RotationMatrix),position);
     114
    86115  World::getInstance().unselectAllAtoms(AtomByShape(s));
    87   return Action::state_ptr(new SelectionNotAllAtomsInsideCuboidState(selectedAtoms, position, extension));
     116  return Action::state_ptr(new SelectionNotAllAtomsInsideCuboidState(selectedAtoms, position, extension, Xangle, Yangle, Zangle));
    88117}
    89118
     
    95124    World::getInstance().selectAtom(*iter);
    96125
    97   return Action::state_ptr(new SelectionNotAllAtomsInsideCuboidState(state->selectedAtoms, state->position, state->extension));
     126  return Action::state_ptr(_state);
    98127}
    99128
    100129Action::state_ptr SelectionNotAllAtomsInsideCuboidAction::performRedo(Action::state_ptr _state){
    101130  SelectionNotAllAtomsInsideCuboidState *state = assert_cast<SelectionNotAllAtomsInsideCuboidState*>(_state.get());
     131  Matrix RotationMatrix;
    102132
    103   Shape s = translate(stretch(Cuboid(),state->extension),state->position);
     133  RotationMatrix.rotation(state->Xangle, state->Yangle, state->Zangle);
     134  Shape s = translate(transform(stretch(Cuboid(),state->extension),RotationMatrix),state->position);
    104135  World::getInstance().unselectAllAtoms(AtomByShape(s));
    105136
    106   return Action::state_ptr(new SelectionNotAllAtomsInsideCuboidState(state->selectedAtoms, state->position, state->extension));
     137  return Action::state_ptr(_state);
    107138}
    108139
  • src/Actions/SelectionAction/NotAllAtomsInsideCuboidAction.hpp

    r03c902 r31fb1d  
    1717class SelectionNotAllAtomsInsideCuboidAction : public Action {
    1818  friend void SelectionNotAllAtomsInsideCuboid(const Vector &position, const Vector &extension);
     19  friend void SelectionNotAllAtomsInsideCuboid(const Vector &position, const Vector &extension, const double Xangle, const double Yangle, const double Zangle);
    1920
    2021public:
  • src/LinearAlgebra/Matrix.cpp

    r03c902 r31fb1d  
    115115}
    116116
     117void Matrix::rotation(const double x, const double y, const double z)
     118{
     119  set(0,0, cos(y)*cos(z));
     120  set(0,1, cos(z)*sin(x)*sin(y) - cos(x)*sin(z));
     121  set(0,2, cos(x)*cos(z)*sin(y) + sin(x) * sin(z));
     122  set(1,0, cos(y)*sin(z));
     123  set(1,1, cos(x)*cos(z) + sin(x)*sin(y)*sin(z));
     124  set(1,2, -cos(z)*sin(x) + cos(x)*sin(y)*sin(z));
     125  set(2,0, -sin(y));
     126  set(2,1, cos(y)*sin(x));
     127  set(2,2, cos(x)*cos(y));
     128}
     129
    117130Matrix &Matrix::operator=(const Matrix &src){
    118131  if(&src!=this){
     
    220233
    221234
    222 void Matrix::transpose()
     235Matrix &Matrix::transpose()
    223236{
    224237  double tmp;
     
    226239    for (int j=i+1;j<NDIM;j++) {
    227240      tmp = at(j,i);
     241      at(j,i) = at(i,j);
    228242      at(i,j) = tmp;
    229       at(j,i) = tmp;
    230     }
     243    }
     244  return *this;
    231245}
    232246
  • src/LinearAlgebra/Matrix.hpp

    r03c902 r31fb1d  
    5454   */
    5555  void zero();
     56
     57  /**
     58   * Sets all matrix corresponding to a rotation matrix,
     59   * first around the x-, then the y-, finally the z-axis
     60   * with given angles.
     61   */
     62  void rotation(const double x, const double y, const double z);
    5663
    5764  /**
     
    113120   */
    114121  Matrix transpose() const;
    115   void transpose();
     122  Matrix &transpose();
    116123
    117124  // operators
  • src/unittests/MatrixUnittest.cpp

    r03c902 r31fb1d  
    1414#include <cppunit/extensions/TestFactoryRegistry.h>
    1515#include <cppunit/ui/text/TestRunner.h>
     16
     17#include <cmath>
    1618
    1719#include "MatrixUnittest.hpp"
     
    156158    }
    157159  }
     160}
     161
     162void MatrixUnittest::TransposeTest(){
     163  Matrix res;
     164
     165  // transpose of unit is unit
     166  res.one();
     167  (const Matrix)res.transpose();
     168  CPPUNIT_ASSERT_EQUAL(res,*one);
     169
     170  // transpose of transpose is same matrix
     171  res.zero();
     172  res.set(2,2, 1.);
     173  CPPUNIT_ASSERT_EQUAL(res.transpose().transpose(),res);
    158174}
    159175
     
    230246}
    231247
     248void MatrixUnittest::RotationTest(){
     249  Matrix res;
     250  Matrix inverse;
     251
     252  // zero rotation angles yields unity matrix
     253  res.rotation(0,0,0);
     254  CPPUNIT_ASSERT_EQUAL(*one, res);
     255
     256  // arbitrary rotation matrix has det = 1
     257  res.rotation(M_PI/3.,1.,M_PI/7.);
     258  CPPUNIT_ASSERT(fabs(fabs(res.determinant()) -1.) < MYEPSILON);
     259
     260  // inverse is rotation matrix with negative angles
     261  res.rotation(M_PI/3.,0.,0.);
     262  inverse.rotation(-M_PI/3.,0.,0.);
     263  CPPUNIT_ASSERT_EQUAL(*one, res * inverse);
     264
     265  // ... or transposed
     266  res.rotation(M_PI/3.,0.,0.);
     267  CPPUNIT_ASSERT_EQUAL(inverse, ((const Matrix) res).transpose());
     268}
    232269
    233270void MatrixUnittest::InvertTest(){
  • src/unittests/MatrixUnittest.hpp

    r03c902 r31fb1d  
    1919  CPPUNIT_TEST ( VectorTest );
    2020  CPPUNIT_TEST ( OperationTest );
     21  CPPUNIT_TEST ( TransposeTest );
     22  CPPUNIT_TEST ( RotationTest );
    2123  CPPUNIT_TEST ( InvertTest );
    2224  CPPUNIT_TEST ( DeterminantTest );
     
    3133  void VectorTest();
    3234  void OperationTest();
     35  void TransposeTest();
     36  void RotationTest();
    3337  void InvertTest();
    3438  void DeterminantTest();
Note: See TracChangeset for help on using the changeset viewer.