diff options
| author | Felix Morgner <felix.morgner@gmail.com> | 2026-08-24 11:16:07 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@gmail.com> | 2026-08-24 11:16:07 +0200 |
| commit | c068f22329d5cc722622a2183bbb22eef2093df7 (patch) | |
| tree | 12d56c1aede67988a55e241364606bfbb4dba933 /tool_src/BspLib/LineSeg.cpp | |
| download | openparsec-main.tar.xz openparsec-main.zip | |
Diffstat (limited to 'tool_src/BspLib/LineSeg.cpp')
| -rw-r--r-- | tool_src/BspLib/LineSeg.cpp | 71 |
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 + +//----------------------------------------------------------------------------- |
