From 3bab5737676837a20b3c05cdb57e9e75982b4606 Mon Sep 17 00:00:00 2001 From: Marco Biasini <marco.biasini@unibas.ch> Date: Tue, 15 Mar 2011 09:27:14 +0100 Subject: [PATCH] fix IsOnLine and add unit test --- modules/geom/CMakeLists.txt | 1 + modules/geom/src/composite3_op.cc | 5 ++- modules/geom/tests/CMakeLists.txt | 6 +++ modules/geom/tests/test_composite3.cc | 54 +++++++++++++++++++++++++++ modules/geom/tests/tests.cc | 22 +++++++++++ 5 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 modules/geom/tests/CMakeLists.txt create mode 100644 modules/geom/tests/test_composite3.cc create mode 100644 modules/geom/tests/tests.cc diff --git a/modules/geom/CMakeLists.txt b/modules/geom/CMakeLists.txt index 6955f55f9..f6f5287df 100644 --- a/modules/geom/CMakeLists.txt +++ b/modules/geom/CMakeLists.txt @@ -1,2 +1,3 @@ add_subdirectory(src) +add_subdirectory(tests) add_subdirectory(pymod) \ No newline at end of file diff --git a/modules/geom/src/composite3_op.cc b/modules/geom/src/composite3_op.cc index 1c5b699d2..271c4bec8 100644 --- a/modules/geom/src/composite3_op.cc +++ b/modules/geom/src/composite3_op.cc @@ -92,8 +92,9 @@ Real Distance(const Plane& p, const Vec3& v) bool IsOnLine(const Line3& l, const Vec3& v, Real ephilon) { - Vec3 tmp=CompDivide(v-l.GetOrigin(),l.GetDirection()); - return std::fabs(tmp[0]-tmp[1])<ephilon && std::fabs(tmp[0]-tmp[2])<ephilon; + Vec3 s=v-l.GetOrigin(); + Vec3 s_on_line=Dot(s, l.GetDirection())*l.GetDirection(); + return Length2(s-s_on_line)<(ephilon*ephilon); } bool IsInPlane(const Plane& p, const Line3& l,Real ephilon) { diff --git a/modules/geom/tests/CMakeLists.txt b/modules/geom/tests/CMakeLists.txt new file mode 100644 index 000000000..3235335a2 --- /dev/null +++ b/modules/geom/tests/CMakeLists.txt @@ -0,0 +1,6 @@ +set(GEOM_UNITTESTS + test_composite3.cc + tests.cc +) + +ost_unittest(geom "${GEOM_UNITTESTS}") diff --git a/modules/geom/tests/test_composite3.cc b/modules/geom/tests/test_composite3.cc new file mode 100644 index 000000000..88dd739d7 --- /dev/null +++ b/modules/geom/tests/test_composite3.cc @@ -0,0 +1,54 @@ +//------------------------------------------------------------------------------ +// This file is part of the OpenStructure project <www.openstructure.org> +// +// Copyright (C) 2008-2011 by the OpenStructure authors +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License as published by the Free +// Software Foundation; either version 3.0 of the License, or (at your option) +// any later version. +// This library is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +// details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with this library; if not, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +//------------------------------------------------------------------------------ + +#include <ost/geom/geom.hh> + +#define BOOST_TEST_DYN_LINK +#include <boost/test/unit_test.hpp> + +using namespace geom; + +BOOST_AUTO_TEST_SUITE( geom ) + + +BOOST_AUTO_TEST_CASE(line_init) +{ + Line3 line(geom::Vec3(0,0,0), geom::Vec3(2,0,0)); + BOOST_CHECK_EQUAL(geom::Length(line.GetDirection()), 1.0); +} + +BOOST_AUTO_TEST_CASE(is_on_line) +{ + Line3 line(geom::Vec3(0,0,0), geom::Vec3(1,0,0)); + BOOST_CHECK(IsOnLine(line, geom::Vec3(0.5,0.0,0.0))); + BOOST_CHECK(IsOnLine(line, geom::Vec3(1.0,0.0,0.0))); + BOOST_CHECK(IsOnLine(line, geom::Vec3(0.0,0.0,0.0))); + BOOST_CHECK(IsOnLine(line, geom::Vec3(-5,0.0,0.0))); + BOOST_CHECK(IsOnLine(line, geom::Vec3(10.0,0.0,0.0))); + BOOST_CHECK(!IsOnLine(line, geom::Vec3(0.5,0.1,0.0))); + BOOST_CHECK(!IsOnLine(line, geom::Vec3(1.0,0.0,0.1))); + + line=Line3(geom::Vec3(1,0,0), geom::Vec3(1,1,1)); + for (int i=-10; i<10; ++i) { + BOOST_CHECK(IsOnLine(line, line.At(i), 1e-6)); + } + BOOST_CHECK(!IsOnLine(line, geom::Vec3(1,2,2.1), 1e-6)); +} + +BOOST_AUTO_TEST_SUITE_END() \ No newline at end of file diff --git a/modules/geom/tests/tests.cc b/modules/geom/tests/tests.cc new file mode 100644 index 000000000..fbce7b185 --- /dev/null +++ b/modules/geom/tests/tests.cc @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// This file is part of the OpenStructure project <www.openstructure.org> +// +// Copyright (C) 2008-2011 by the OpenStructure authors +// +// This library is free software; you can redistribute it and/or modify it under +// the terms of the GNU Lesser General Public License as published by the Free +// Software Foundation; either version 3.0 of the License, or (at your option) +// any later version. +// This library is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +// details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with this library; if not, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +//------------------------------------------------------------------------------ +#define BOOST_TEST_DYN_LINK +#define BOOST_TEST_MODULE geom +#include <boost/test/unit_test.hpp> + -- GitLab