source: LinearAlgebra/src/unittests/PlaneUnitTest.cpp@ 120a86

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
Last change on this file since 120a86 was bf4b9f, checked in by Frederik Heber <heber@…>, 14 years ago

Moved LinearAlgebra from folder src/ into distinct sub-package.

  • src/LinearAlgebra folder is now LinearAlgebra/src/LinearAlgebra due to include consistency.
  • src/LinearAlgebra/unittests have been moved to LinearAlgebra/unittests.
  • All Makefile.am's had to be changed due to changed location of library.
  • renamed libMolecuilderLinearAlgebra to libLinearAlgebra.
  • CONFIG_AUX_DIR is build-aux 9for molecuilder and LinearAlgebra).
  • m4 is symlinked from below.
  • build-aux now contains small README such that it is created automatically.
  • Property mode set to 100644
File size: 7.7 KB
Line 
1/*
2 * Project: MoleCuilder
3 * Description: creates and alters molecular systems
4 * Copyright (C) 2010 University of Bonn. All rights reserved.
5 * Please see the LICENSE file or "Copyright notice" in builder.cpp for details.
6 */
7
8/*
9 * PlaneUnittest.cpp
10 *
11 * Created on: Apr 30, 2010
12 * Author: crueger
13 */
14
15// include config.h
16#ifdef HAVE_CONFIG_H
17#include <config.h>
18#endif
19
20#include <cppunit/CompilerOutputter.h>
21#include <cppunit/extensions/TestFactoryRegistry.h>
22#include <cppunit/ui/text/TestRunner.h>
23
24#include <cmath>
25#include <limits>
26
27#include "defs.hpp"
28#include "Exceptions.hpp"
29#include "Line.hpp"
30#include "Vector.hpp"
31
32#include "PlaneUnitTest.hpp"
33
34#ifdef HAVE_TESTRUNNER
35#include "UnitTestMain.hpp"
36#endif /*HAVE_TESTRUNNER*/
37
38CPPUNIT_TEST_SUITE_REGISTRATION( PlaneUnittest );
39
40void PlaneUnittest::setUp(){
41 p1 = new Plane(unitVec[0],unitVec[1],unitVec[2]);
42 p2 = new Plane(unitVec[0],unitVec[1],zeroVec);
43 p3 = new Plane(unitVec[0],zeroVec,unitVec[2]);
44 p4 = new Plane(zeroVec,unitVec[1],unitVec[2]);
45}
46
47void PlaneUnittest::tearDown(){
48 delete p1;
49 delete p2;
50 delete p3;
51 delete p4;
52}
53
54void PlaneUnittest::constructionErrorTest(){
55 // try several method of construction..
56 // see if error checking works
57
58 // three points
59 CPPUNIT_ASSERT_NO_THROW(Plane(unitVec[0],unitVec[1],unitVec[2]));
60 // when only two points are differnt this gives an error
61 CPPUNIT_ASSERT_THROW(Plane(unitVec[0],unitVec[1],unitVec[1]),LinearDependenceException);
62 // same with only one point
63 CPPUNIT_ASSERT_THROW(Plane(unitVec[0],unitVec[0],unitVec[0]),LinearDependenceException);
64
65 // use two vector giving two directions
66 CPPUNIT_ASSERT_NO_THROW(Plane(unitVec[0],unitVec[1],0));
67 // and again this is actually only one vector
68 CPPUNIT_ASSERT_THROW(Plane(unitVec[0],unitVec[0],0),LinearDependenceException);
69 // Zero vector does not give a good direction
70 CPPUNIT_ASSERT_THROW(Plane(unitVec[0],zeroVec,0),ZeroVectorException);
71
72 // use a normalvector and an scalar offset
73 CPPUNIT_ASSERT_NO_THROW(Plane(unitVec[0],0));
74 // The zero vector is no good as a normalvector
75 CPPUNIT_ASSERT_THROW(Plane(zeroVec,0),ZeroVectorException);
76
77 // use a normalvector and an offset vector
78 CPPUNIT_ASSERT_NO_THROW(Plane(unitVec[0],zeroVec));
79 // and the bad zeroVector again
80 CPPUNIT_ASSERT_THROW(Plane(zeroVec,zeroVec),ZeroVectorException);
81}
82
83
84// we need to test normals independent of the direction
85bool testNormal(const Vector &normal1, const Vector &normal2){
86 return (normal1==normal2) || (normal1==-1*normal2);
87}
88
89void PlaneUnittest::constructionResultTest(){
90 {
91 // construct with three points on plane
92 Plane p1(unitVec[0],unitVec[1],zeroVec);
93 CPPUNIT_ASSERT(testNormal(unitVec[2],p1.getNormal()));
94 CPPUNIT_ASSERT_EQUAL(0.,p1.getOffset());
95
96 Plane p2(unitVec[0],unitVec[2],zeroVec);
97 CPPUNIT_ASSERT(testNormal(unitVec[1],p2.getNormal()));
98 CPPUNIT_ASSERT_EQUAL(0.,p2.getOffset());
99
100 Plane p3(unitVec[1],unitVec[2],zeroVec);
101 CPPUNIT_ASSERT(testNormal(unitVec[0],p3.getNormal()));
102 CPPUNIT_ASSERT_EQUAL(0.,p3.getOffset());
103 }
104 {
105 // construct with two directions + offset
106 Plane p1(unitVec[0],unitVec[1],0);
107 CPPUNIT_ASSERT(testNormal(unitVec[2],p1.getNormal()));
108 CPPUNIT_ASSERT_EQUAL(0.,p1.getOffset());
109
110 Plane p2(unitVec[0],unitVec[2],0);
111 CPPUNIT_ASSERT(testNormal(unitVec[1],p2.getNormal()));
112 CPPUNIT_ASSERT_EQUAL(0.,p2.getOffset());
113
114 Plane p3(unitVec[1],unitVec[2],0);
115 CPPUNIT_ASSERT(testNormal(unitVec[0],p3.getNormal()));
116 CPPUNIT_ASSERT_EQUAL(0.,p3.getOffset());
117 }
118}
119
120void PlaneUnittest::pointsTest(){
121 std::vector<Vector> points1 = p1->getPointsOnPlane();
122 CPPUNIT_ASSERT(p1->isContained(points1[0]));
123 CPPUNIT_ASSERT(p1->isContained(points1[1]));
124 CPPUNIT_ASSERT(p1->isContained(points1[2]));
125 // check that the three points differ
126 CPPUNIT_ASSERT(points1[0]!=points1[1]);
127 CPPUNIT_ASSERT(points1[0]!=points1[2]);
128 CPPUNIT_ASSERT(points1[1]!=points1[2]);
129
130
131 std::vector<Vector> points2 = p2->getPointsOnPlane();
132 CPPUNIT_ASSERT(p2->isContained(points2[0]));
133 CPPUNIT_ASSERT(p2->isContained(points2[1]));
134 CPPUNIT_ASSERT(p2->isContained(points2[2]));
135 // check that the three points differ
136 CPPUNIT_ASSERT(points2[0]!=points2[1]);
137 CPPUNIT_ASSERT(points2[0]!=points2[2]);
138 CPPUNIT_ASSERT(points2[1]!=points2[2]);
139
140 std::vector<Vector> points3 = p3->getPointsOnPlane();
141 CPPUNIT_ASSERT(p3->isContained(points3[0]));
142 CPPUNIT_ASSERT(p3->isContained(points3[1]));
143 CPPUNIT_ASSERT(p3->isContained(points3[2]));
144 // check that the three points differ
145 CPPUNIT_ASSERT(points3[0]!=points3[1]);
146 CPPUNIT_ASSERT(points3[0]!=points3[2]);
147 CPPUNIT_ASSERT(points3[1]!=points3[2]);
148
149 std::vector<Vector> points4 = p4->getPointsOnPlane();
150 CPPUNIT_ASSERT(p4->isContained(points4[0]));
151 CPPUNIT_ASSERT(p4->isContained(points4[1]));
152 CPPUNIT_ASSERT(p4->isContained(points4[2]));
153 // check that the three points differ
154 CPPUNIT_ASSERT(points4[0]!=points4[1]);
155 CPPUNIT_ASSERT(points4[0]!=points4[2]);
156 CPPUNIT_ASSERT(points4[1]!=points4[2]);
157}
158
159
160void PlaneUnittest::operationsTest(){
161 {
162 Vector t = (1./3.)*(unitVec[0]+unitVec[1]+unitVec[2]);
163 CPPUNIT_ASSERT(fabs(p1->distance(zeroVec)-t.Norm()) <= LINALG_MYEPSILON());
164 CPPUNIT_ASSERT_EQUAL(t,p1->getClosestPoint(zeroVec));
165 }
166
167 CPPUNIT_ASSERT(fabs(p2->distance(unitVec[2])-1) <= LINALG_MYEPSILON());
168 CPPUNIT_ASSERT_EQUAL(zeroVec,p2->getClosestPoint(unitVec[2]));
169 CPPUNIT_ASSERT(fabs(p3->distance(unitVec[1])-1) <= LINALG_MYEPSILON());
170 CPPUNIT_ASSERT_EQUAL(zeroVec,p3->getClosestPoint(unitVec[1]));
171 CPPUNIT_ASSERT(fabs(p4->distance(unitVec[0])-1) <= LINALG_MYEPSILON());
172 CPPUNIT_ASSERT_EQUAL(zeroVec,p4->getClosestPoint(unitVec[0]));
173}
174
175void PlaneUnittest::mirrorTest(){
176 Vector fixture;
177
178 // some Vectors that lie on the planes
179 fixture = p1->mirrorVector(unitVec[0]);
180 CPPUNIT_ASSERT_EQUAL(fixture,unitVec[0]);
181 fixture = p1->mirrorVector(unitVec[1]);
182 CPPUNIT_ASSERT_EQUAL(fixture,unitVec[1]);
183 fixture = p1->mirrorVector(unitVec[2]);
184 CPPUNIT_ASSERT_EQUAL(fixture,unitVec[2]);
185
186 fixture = p2->mirrorVector(zeroVec);
187 CPPUNIT_ASSERT_EQUAL(fixture,zeroVec);
188 fixture = p2->mirrorVector(unitVec[0]);
189 CPPUNIT_ASSERT_EQUAL(fixture,unitVec[0]);
190 fixture = p2->mirrorVector(unitVec[1]);
191 CPPUNIT_ASSERT_EQUAL(fixture,unitVec[1]);
192
193 fixture = p3->mirrorVector(zeroVec);
194 CPPUNIT_ASSERT_EQUAL(fixture,zeroVec);
195 fixture = p3->mirrorVector(unitVec[0]);
196 CPPUNIT_ASSERT_EQUAL(fixture,unitVec[0]);
197 fixture = p3->mirrorVector(unitVec[2]);
198 CPPUNIT_ASSERT_EQUAL(fixture,unitVec[2]);
199
200 fixture = p4->mirrorVector(zeroVec);
201 CPPUNIT_ASSERT_EQUAL(fixture,zeroVec);
202 fixture = p4->mirrorVector(unitVec[1]);
203 CPPUNIT_ASSERT_EQUAL(fixture,unitVec[1]);
204 fixture = p4->mirrorVector(unitVec[2]);
205 CPPUNIT_ASSERT_EQUAL(fixture,unitVec[2]);
206
207 // some Vectors outside of the planes
208 {
209 Vector t = (2./3.)*(unitVec[0]+unitVec[1]+unitVec[2]);
210 fixture = p1->mirrorVector(zeroVec);
211 CPPUNIT_ASSERT_EQUAL(fixture,t);
212 }
213
214 fixture = p2->mirrorVector(unitVec[2]);
215 CPPUNIT_ASSERT_EQUAL(fixture,-1*unitVec[2]);
216 fixture = p3->mirrorVector(unitVec[1]);
217 CPPUNIT_ASSERT_EQUAL(fixture,-1*unitVec[1]);
218 fixture = p4->mirrorVector(unitVec[0]);
219 CPPUNIT_ASSERT_EQUAL(fixture,-1*unitVec[0]);
220}
221
222void PlaneUnittest::LineIntersectionTest(){
223 Vector fixture;
224 // plane at (0,0,0) normal to (1,0,0) cuts line from (0,0,0) to (2,1,0) at ???
225 Line l1 = makeLineThrough(zeroVec,Vector(2,1,0));
226 CPPUNIT_ASSERT_NO_THROW(fixture = Plane(unitVec[0], zeroVec).GetIntersection(l1) );
227 CPPUNIT_ASSERT_EQUAL( zeroVec, fixture );
228
229 // plane at (2,1,0) normal to (0,1,0) cuts line from (1,0,0) to (0,1,1) at ???
230 Line l2 = makeLineThrough(unitVec[0],Vector(0,1,1));
231 CPPUNIT_ASSERT_NO_THROW(fixture = Plane(unitVec[1], Vector(2,1,0)).GetIntersection(l2) );
232 CPPUNIT_ASSERT_EQUAL( Vector(0., 1., 1.), fixture );
233}
Note: See TracBrowser for help on using the repository browser.