From 3da7146f165e141bded235dd08da08fdc72e361f Mon Sep 17 00:00:00 2001
From: Marco Biasini <marco.biasini@unibas.ch>
Date: Fri, 18 Mar 2011 16:54:09 +0100
Subject: [PATCH] simplify IsOnLine in 3D, fix it for the 2D case

---
 modules/geom/src/composite2_op.cc     |  5 ++-
 modules/geom/src/composite3_op.cc     |  5 +--
 modules/geom/tests/CMakeLists.txt     |  1 +
 modules/geom/tests/test_composite2.cc | 54 +++++++++++++++++++++++++++
 modules/geom/tests/test_composite3.cc |  8 ++--
 5 files changed, 64 insertions(+), 9 deletions(-)
 create mode 100644 modules/geom/tests/test_composite2.cc

diff --git a/modules/geom/src/composite2_op.cc b/modules/geom/src/composite2_op.cc
index 897512768..ad25008f8 100644
--- a/modules/geom/src/composite2_op.cc
+++ b/modules/geom/src/composite2_op.cc
@@ -57,8 +57,9 @@ Real Distance(const Line2& l, const Vec2& v)
 
 bool IsOnLine(const Line2& l, const Vec2& v, Real ephilon)
 {
-  Vec2 tmp=CompDivide(v-l.GetOrigin(),l.GetDirection());
-  return std::fabs(tmp[0]-tmp[1])<ephilon && std::fabs(tmp[0]-tmp[2])<ephilon;
+  Vec2 d1=v-l.GetOrigin();
+  Vec2 d2=l.GetDirection();
+  return Length2(d1-Dot(d1, d2)*d2)<(ephilon*ephilon);
 }
 
 
diff --git a/modules/geom/src/composite3_op.cc b/modules/geom/src/composite3_op.cc
index 271c4bec8..d1602699c 100644
--- a/modules/geom/src/composite3_op.cc
+++ b/modules/geom/src/composite3_op.cc
@@ -92,10 +92,9 @@ Real Distance(const Plane& p, const Vec3& v)
 
 bool IsOnLine(const Line3& l, const Vec3& v, Real ephilon)
 {
-  Vec3 s=v-l.GetOrigin();
-  Vec3 s_on_line=Dot(s, l.GetDirection())*l.GetDirection();
-  return Length2(s-s_on_line)<(ephilon*ephilon);
+  return Length2(Cross(v-l.GetOrigin(), l.GetDirection()))<(ephilon*ephilon);
 }
+
 bool IsInPlane(const Plane& p,  const Line3& l,Real ephilon)
 {
   return Distance(p,l.GetOrigin())<ephilon && AreParallel(p,l,ephilon);  
diff --git a/modules/geom/tests/CMakeLists.txt b/modules/geom/tests/CMakeLists.txt
index 3235335a2..6a638d774 100644
--- a/modules/geom/tests/CMakeLists.txt
+++ b/modules/geom/tests/CMakeLists.txt
@@ -1,5 +1,6 @@
 set(GEOM_UNITTESTS
   test_composite3.cc
+  test_composite2.cc
   tests.cc
 )
 
diff --git a/modules/geom/tests/test_composite2.cc b/modules/geom/tests/test_composite2.cc
new file mode 100644
index 000000000..5f79e7b44
--- /dev/null
+++ b/modules/geom/tests/test_composite2.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_init2)
+{
+  Line3 line(geom::Vec2(0,0), geom::Vec2(2,0));
+  BOOST_CHECK_EQUAL(geom::Length(line.GetDirection()), 1.0);
+}
+
+BOOST_AUTO_TEST_CASE(is_on_line2)
+{
+  Line2 line(geom::Vec2(0,0), geom::Vec2(1,0));
+  BOOST_CHECK(IsOnLine(line, geom::Vec2(0.5,0.0)));
+  BOOST_CHECK(IsOnLine(line, geom::Vec2(1.0,0.0)));
+  BOOST_CHECK(IsOnLine(line, geom::Vec2(0.0,0.0)));
+  BOOST_CHECK(IsOnLine(line, geom::Vec2(-5,0.0)));
+  BOOST_CHECK(IsOnLine(line, geom::Vec2(10.0,0.0)));
+  BOOST_CHECK(!IsOnLine(line, geom::Vec2(0.5,0.1)));
+  BOOST_CHECK(!IsOnLine(line, geom::Vec2(1.0,0.1)));
+  
+  line=Line2(geom::Vec2(1,0), geom::Vec2(3,2));
+  for (int i=-10; i<10; ++i) {
+    BOOST_CHECK(IsOnLine(line, line.At(i)));
+  }
+  BOOST_CHECK(!IsOnLine(line, geom::Vec2(3,2.1)));
+}
+
+BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
diff --git a/modules/geom/tests/test_composite3.cc b/modules/geom/tests/test_composite3.cc
index 88dd739d7..1ee00dafd 100644
--- a/modules/geom/tests/test_composite3.cc
+++ b/modules/geom/tests/test_composite3.cc
@@ -27,13 +27,13 @@ using namespace geom;
 BOOST_AUTO_TEST_SUITE( geom )
 
 
-BOOST_AUTO_TEST_CASE(line_init)
+BOOST_AUTO_TEST_CASE(line_init3)
 {
   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)
+BOOST_AUTO_TEST_CASE(is_on_line3)
 {
   Line3 line(geom::Vec3(0,0,0), geom::Vec3(1,0,0));
   BOOST_CHECK(IsOnLine(line, geom::Vec3(0.5,0.0,0.0)));
@@ -46,9 +46,9 @@ BOOST_AUTO_TEST_CASE(is_on_line)
   
   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, line.At(i)));
   }
-  BOOST_CHECK(!IsOnLine(line, geom::Vec3(1,2,2.1), 1e-6));
+  BOOST_CHECK(!IsOnLine(line, geom::Vec3(1,2,2.1)));
 }
 
 BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file
-- 
GitLab