aboutsummaryrefslogtreecommitdiff
path: root/tool_src/BspLib/LineSeg.cpp
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@gmail.com>2026-08-24 11:16:07 +0200
committerFelix Morgner <felix.morgner@gmail.com>2026-08-24 11:16:07 +0200
commitc068f22329d5cc722622a2183bbb22eef2093df7 (patch)
tree12d56c1aede67988a55e241364606bfbb4dba933 /tool_src/BspLib/LineSeg.cpp
downloadopenparsec-main.tar.xz
openparsec-main.zip
initial importHEADmain
Diffstat (limited to 'tool_src/BspLib/LineSeg.cpp')
-rw-r--r--tool_src/BspLib/LineSeg.cpp71
1 files changed, 71 insertions, 0 deletions
diff --git a/tool_src/BspLib/LineSeg.cpp b/tool_src/BspLib/LineSeg.cpp
new file mode 100644
index 0000000..7fc1872
--- /dev/null
+++ b/tool_src/BspLib/LineSeg.cpp
@@ -0,0 +1,71 @@
+//-----------------------------------------------------------------------------
+// BSPLIB MODULE: LineSeg.cpp
+//
+// Copyright (c) 1997-1998 by Markus Hadwiger
+// All Rights Reserved.
+//-----------------------------------------------------------------------------
+
+// bsplib headers
+#include "Vertex.h"
+
+
+BSPLIB_NAMESPACE_BEGIN
+
+
+// check if a single vertex lies on a line segment ----------------------------
+//
+int LineSeg2::PointOnLineSeg( const Vertex2& vertex ) const
+{
+ if ( m_dirvec.IsNullVector() )
+ return FALSE;
+
+ Vector2 vertexvec( vertex - m_basevtx );
+ Vector2 crossprod( vertexvec, m_dirvec );
+
+ if ( ( crossprod.VecLength() / m_dirvec.VecLength() ) > EPS_POINT_ON_LINE )
+ return FALSE;
+
+ double t;
+ if ( fabs( m_dirvec.X ) >= EPS_DENOM_ZERO )
+ t = vertexvec.X / m_dirvec.X;
+ else if ( fabs( m_dirvec.Y ) >= EPS_DENOM_ZERO )
+ t = vertexvec.Y / m_dirvec.Y;
+ else
+ return FALSE;
+
+ return ( ( t >= EPS_POINT_ON_LINESEG ) && ( t <= 1.0 - EPS_POINT_ON_LINESEG ) );
+}
+
+
+// check if a single vertex lies on a line segment ----------------------------
+//
+int LineSeg3::PointOnLineSeg( const Vertex3& vertex ) const
+{
+ if ( m_dirvec.IsNullVector() )
+ return FALSE;
+
+ Vector3 vertexvec( vertex - m_basevtx );
+ Vector3 crossprod( vertexvec, m_dirvec );
+
+ // check if point lies on line
+ if ( ( crossprod.VecLength() / m_dirvec.VecLength() ) > EPS_POINT_ON_LINE )
+ return FALSE;
+
+ // check if it lies between start- and endvertex of lineseg
+ double t;
+ if ( fabs( m_dirvec.X ) >= EPS_DENOM_ZERO )
+ t = vertexvec.X / m_dirvec.X;
+ else if ( fabs( m_dirvec.Y ) >= EPS_DENOM_ZERO )
+ t = vertexvec.Y / m_dirvec.Y;
+ else if ( fabs( m_dirvec.Z ) >= EPS_DENOM_ZERO )
+ t = vertexvec.Z / m_dirvec.Z;
+ else
+ return FALSE;
+
+ return ( ( t >= EPS_POINT_ON_LINESEG ) && ( t <= 1.0 - EPS_POINT_ON_LINESEG ) );
+}
+
+
+BSPLIB_NAMESPACE_END
+
+//-----------------------------------------------------------------------------