Changeset 6c6d84


Ignore:
Timestamp:
Aug 20, 2009, 11:35:19 AM (16 years ago)
Author:
Saskia Metzler <metzler@…>
Children:
bc3953
Parents:
84b811
Message:

Ticket 16: Unit tests for Vector::RotateVector(), additionally fixing the function

Location:
molecuilder/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • molecuilder/src/vector.cpp

    r84b811 r6c6d84  
    467467};
    468468
    469 /** Rotates the vector around the axis given by \a *axis by an angle of \a alpha.
     469/** Rotates the vector relative to the origin around the axis given by \a *axis by an angle of \a alpha.
    470470 * \param *axis rotation axis
    471471 * \param alpha rotation angle in radian
     
    478478  a.ProjectOntoPlane(axis);
    479479  // construct normal vector
    480   y.MakeNormalVector(axis,this);
     480  bool rotatable = y.MakeNormalVector(axis,&a);
     481  // The normal vector cannot be created if there is linar dependency.
     482  // Then the vector to rotate is on the axis and any rotation leads to the vector itself.
     483  if (!rotatable) {
     484    return;
     485  }
    481486  y.Scale(Norm());
    482487  // scale normal vector by sine and this vector by cosine
    483488  y.Scale(sin(alpha));
    484   Scale(cos(alpha));
     489  a.Scale(cos(alpha));
     490  CopyVector(Projection(axis));
    485491  // add scaled normal vector onto this vector
    486492  AddVector(&y);
  • molecuilder/src/vectorunittest.cpp

    r84b811 r6c6d84  
    5555void VectorTest::SimpleAlgebraTest()
    5656{
    57   Vector helper;
    5857  double factor;
     58  // copy vector
     59  fixture.Init(2.,3.,4.);
     60  CPPUNIT_ASSERT_EQUAL( Vector(2.,3.,4.), fixture );
    5961  // summation and scaling
    60   helper.CopyVector(&zero);
    61   helper.AddVector(&unit);
    62   CPPUNIT_ASSERT_EQUAL( true, helper.IsOne() );
    63   helper.CopyVector(&zero);
    64   helper.SubtractVector(&unit);
    65   CPPUNIT_ASSERT_EQUAL( true, helper.IsOne() );
    66   CPPUNIT_ASSERT_EQUAL( false, helper.IsZero() );
    67   helper.CopyVector(&zero);
    68   helper.AddVector(&zero);
    69   CPPUNIT_ASSERT_EQUAL( true, helper.IsZero() );
    70   helper.CopyVector(&notunit);
    71   helper.SubtractVector(&otherunit);
    72   CPPUNIT_ASSERT_EQUAL( true, helper.IsOne() );
    73   helper.CopyVector(&unit);
    74   helper.AddVector(&otherunit);
    75   CPPUNIT_ASSERT_EQUAL( false, helper.IsOne() );
    76   helper.CopyVector(&notunit);
    77   helper.SubtractVector(&unit);
    78   helper.SubtractVector(&otherunit);
    79   CPPUNIT_ASSERT_EQUAL( false, helper.IsZero() );
    80   helper.CopyVector(&unit);
    81   helper.Scale(0.98);
    82   CPPUNIT_ASSERT_EQUAL( false, helper.IsOne() );
    83   helper.CopyVector(&unit);
    84   helper.Scale(1.);
    85   CPPUNIT_ASSERT_EQUAL( true, helper.IsOne() );
    86   helper.CopyVector(&unit);
     62  fixture.CopyVector(&zero);
     63  fixture.AddVector(&unit);
     64  CPPUNIT_ASSERT_EQUAL( true, fixture.IsOne() );
     65  fixture.CopyVector(&zero);
     66  fixture.SubtractVector(&unit);
     67  CPPUNIT_ASSERT_EQUAL( true, fixture.IsOne() );
     68  CPPUNIT_ASSERT_EQUAL( false, fixture.IsZero() );
     69  fixture.CopyVector(&zero);
     70  fixture.AddVector(&zero);
     71  CPPUNIT_ASSERT_EQUAL( true, fixture.IsZero() );
     72  fixture.CopyVector(&notunit);
     73  fixture.SubtractVector(&otherunit);
     74  CPPUNIT_ASSERT_EQUAL( true, fixture.IsOne() );
     75  fixture.CopyVector(&unit);
     76  fixture.AddVector(&otherunit);
     77  CPPUNIT_ASSERT_EQUAL( false, fixture.IsOne() );
     78  fixture.CopyVector(&notunit);
     79  fixture.SubtractVector(&unit);
     80  fixture.SubtractVector(&otherunit);
     81  CPPUNIT_ASSERT_EQUAL( false, fixture.IsZero() );
     82  fixture.CopyVector(&unit);
     83  fixture.Scale(0.98);
     84  CPPUNIT_ASSERT_EQUAL( false, fixture.IsOne() );
     85  fixture.CopyVector(&unit);
     86  fixture.Scale(1.);
     87  CPPUNIT_ASSERT_EQUAL( true, fixture.IsOne() );
     88  fixture.CopyVector(&unit);
    8789  factor = 0.98;
    88   helper.Scale(factor);
    89   CPPUNIT_ASSERT_EQUAL( false, helper.IsOne() );
    90   helper.CopyVector(&unit);
     90  fixture.Scale(factor);
     91  CPPUNIT_ASSERT_EQUAL( false, fixture.IsOne() );
     92  fixture.CopyVector(&unit);
    9193  factor = 1.;
    92   helper.Scale(factor);
    93   CPPUNIT_ASSERT_EQUAL( true, helper.IsOne() );
     94  fixture.Scale(factor);
     95  CPPUNIT_ASSERT_EQUAL( true, fixture.IsOne() );
    9496};
    9597
     
    183185void VectorTest::LineIntersectionTest()
    184186{
    185   Vector helper;
    186187  // plane at (0,0,0) normal to (1,0,0) cuts line from (0,0,0) to (2,1,0) at ???
    187   CPPUNIT_ASSERT_EQUAL( true, helper.GetIntersectionWithPlane((ofstream *)&cout, &unit, &zero, &zero, &two) );
    188   CPPUNIT_ASSERT_EQUAL( zero, helper );
     188  CPPUNIT_ASSERT_EQUAL( true, fixture.GetIntersectionWithPlane((ofstream *)&cout, &unit, &zero, &zero, &two) );
     189  CPPUNIT_ASSERT_EQUAL( zero, fixture );
    189190
    190191  // plane at (2,1,0) normal to (0,1,0) cuts line from (1,0,0) to (0,1,1) at ???
    191   CPPUNIT_ASSERT_EQUAL( true, helper.GetIntersectionWithPlane((ofstream *)&cout, &otherunit, &two, &unit, &notunit) );
    192   CPPUNIT_ASSERT_EQUAL( Vector(0., 1., 1.), helper );
     192  CPPUNIT_ASSERT_EQUAL( true, fixture.GetIntersectionWithPlane((ofstream *)&cout, &otherunit, &two, &unit, &notunit) );
     193  CPPUNIT_ASSERT_EQUAL( Vector(0., 1., 1.), fixture );
    193194
    194195  // four vectors equal to zero
    195   CPPUNIT_ASSERT_EQUAL( false, helper.GetIntersectionOfTwoLinesOnPlane((ofstream *)&cout, &zero, &zero, &zero, &zero, NULL) );
    196   CPPUNIT_ASSERT_EQUAL( zero, helper );
     196  CPPUNIT_ASSERT_EQUAL( false, fixture.GetIntersectionOfTwoLinesOnPlane((ofstream *)&cout, &zero, &zero, &zero, &zero, NULL) );
     197  CPPUNIT_ASSERT_EQUAL( zero, fixture );
    197198
    198199  // four vectors equal to unit
    199   CPPUNIT_ASSERT_EQUAL( false, helper.GetIntersectionOfTwoLinesOnPlane((ofstream *)&cout, &unit, &unit, &unit, &unit, NULL) );
    200   CPPUNIT_ASSERT_EQUAL( zero, helper );
     200  CPPUNIT_ASSERT_EQUAL( false, fixture.GetIntersectionOfTwoLinesOnPlane((ofstream *)&cout, &unit, &unit, &unit, &unit, NULL) );
     201  CPPUNIT_ASSERT_EQUAL( zero, fixture );
    201202
    202203  // two equal lines
    203   CPPUNIT_ASSERT_EQUAL( true, helper.GetIntersectionOfTwoLinesOnPlane((ofstream *)&cout, &unit, &two, &unit, &two, NULL) );
    204   CPPUNIT_ASSERT_EQUAL( unit, helper );
     204  CPPUNIT_ASSERT_EQUAL( true, fixture.GetIntersectionOfTwoLinesOnPlane((ofstream *)&cout, &unit, &two, &unit, &two, NULL) );
     205  CPPUNIT_ASSERT_EQUAL( unit, fixture );
    205206
    206207  // line from (1,0,0) to (2,1,0) cuts line from (1,0,0) to (0,1,0) at ???
    207   CPPUNIT_ASSERT_EQUAL( true, helper.GetIntersectionOfTwoLinesOnPlane((ofstream *)&cout, &unit, &two, &unit, &otherunit, NULL) );
    208   CPPUNIT_ASSERT_EQUAL( unit, helper );
     208  CPPUNIT_ASSERT_EQUAL( true, fixture.GetIntersectionOfTwoLinesOnPlane((ofstream *)&cout, &unit, &two, &unit, &otherunit, NULL) );
     209  CPPUNIT_ASSERT_EQUAL( unit, fixture );
    209210
    210211  // line from (1,0,0) to (0,0,0) cuts line from (0,0,0) to (2,1,0) at ???
    211   CPPUNIT_ASSERT_EQUAL( true, helper.GetIntersectionOfTwoLinesOnPlane((ofstream *)&cout, &unit, &zero, &zero, &two, NULL) );
    212   CPPUNIT_ASSERT_EQUAL( zero, helper );
     212  CPPUNIT_ASSERT_EQUAL( true, fixture.GetIntersectionOfTwoLinesOnPlane((ofstream *)&cout, &unit, &zero, &zero, &two, NULL) );
     213  CPPUNIT_ASSERT_EQUAL( zero, fixture );
    213214
    214215  // line from (1,0,0) to (2,1,0) cuts line from (0,0,0) to (0,1,0) at ???
    215   CPPUNIT_ASSERT_EQUAL( true, helper.GetIntersectionOfTwoLinesOnPlane((ofstream *)&cout, &unit, &two, &zero, &otherunit, NULL) );
    216   CPPUNIT_ASSERT_EQUAL( Vector(0., -1., 0.), helper );
    217 };
     216  CPPUNIT_ASSERT_EQUAL( true, fixture.GetIntersectionOfTwoLinesOnPlane((ofstream *)&cout, &unit, &two, &zero, &otherunit, NULL) );
     217  CPPUNIT_ASSERT_EQUAL( Vector(0., -1., 0.), fixture );
     218};
     219
     220/** UnitTest for vector rotations.
     221 */
     222void VectorTest::VectorRotationTest()
     223{
     224  fixture.Init(-1.,0.,0.);
     225
     226  // zero vector does not change
     227  fixture.CopyVector(&zero);
     228  fixture.RotateVector(&unit, 1.);
     229  CPPUNIT_ASSERT_EQUAL( zero, fixture );
     230
     231  fixture.RotateVector(&two, 1.);
     232  CPPUNIT_ASSERT_EQUAL( zero,  fixture);
     233
     234  // vector on axis does not change
     235  fixture.CopyVector(&unit);
     236  fixture.RotateVector(&unit, 1.);
     237  CPPUNIT_ASSERT_EQUAL( unit, fixture );
     238
     239  fixture.RotateVector(&unit, 1.);
     240  CPPUNIT_ASSERT_EQUAL( unit, fixture );
     241
     242  // rotations
     243  fixture.CopyVector(&otherunit);
     244  fixture.RotateVector(&unit, M_PI);
     245  CPPUNIT_ASSERT_EQUAL( Vector(0.,-1.,0.), fixture );
     246
     247  fixture.CopyVector(&otherunit);
     248  fixture.RotateVector(&unit, 2. * M_PI);
     249  CPPUNIT_ASSERT_EQUAL( otherunit, fixture );
     250
     251  fixture.CopyVector(&otherunit);
     252  fixture.RotateVector(&unit, 0);
     253  CPPUNIT_ASSERT_EQUAL( otherunit, fixture );
     254
     255  fixture.Init(0.,0.,1.);
     256  fixture.RotateVector(&notunit, M_PI);
     257  CPPUNIT_ASSERT_EQUAL( otherunit, fixture );
     258}
     259
    218260
    219261/********************************************** Main routine **************************************/
  • molecuilder/src/vectorunittest.hpp

    r84b811 r6c6d84  
    2727    CPPUNIT_TEST ( ProjectionTest );
    2828    CPPUNIT_TEST ( LineIntersectionTest );
     29    CPPUNIT_TEST ( VectorRotationTest );
    2930    CPPUNIT_TEST_SUITE_END();
    3031
    3132public:
    32       void setUp();
    33       void tearDown();
     33    void setUp();
     34    void tearDown();
    3435
    35      void UnityTest();
    36      void OperatorAlgebraTest();
    37      void SimpleAlgebraTest();
    38      void EuclidianScalarProductTest();
    39      void EuclidianNormTest();
    40      void EuclidianDistancesTest();
    41      void EuclidianAnglesTest();
    42      void ProjectionTest();
    43      void LineIntersectionTest();
     36    void UnityTest();
     37    void OperatorAlgebraTest();
     38    void SimpleAlgebraTest();
     39    void EuclidianScalarProductTest();
     40    void EuclidianNormTest();
     41    void EuclidianDistancesTest();
     42    void EuclidianAnglesTest();
     43    void ProjectionTest();
     44    void LineIntersectionTest();
     45    void VectorRotationTest();
    4446
    4547private:
    46      Vector zero;
    47      Vector unit;
    48      Vector otherunit;
    49      Vector notunit;
    50      Vector two;
     48    // vector to execute tests on, may be modified during run
     49    Vector fixture;
     50    // never modify these during run, other tests might rely on them
     51    Vector zero;
     52    Vector unit;
     53    Vector otherunit;
     54    Vector notunit;
     55    Vector two;
    5156};
    5257
Note: See TracChangeset for help on using the changeset viewer.