diff --git a/CDeBoxTria.cpp b/CDeBoxTria.cpp
index f55023c..34ec61d 100644
--- a/CDeBoxTria.cpp
+++ b/CDeBoxTria.cpp
@@ -182,78 +182,21 @@ CDeBoxTria( const Frame3d& frBox, const Vector3d& vtDiag, double dSafeDist, cons
return CDeSimpleBoxTria( Frame3d(), vtDiag, trTriaL) ;
// Verifica preliminare con box esteso
- Frame3d frEst( Point3d( -dSafeDist, -dSafeDist, -dSafeDist)) ;
- if ( ! CDeSimpleBoxTria( frEst, vtDiag + 2 * Vector3d( dSafeDist, dSafeDist, dSafeDist), trTriaL))
+ Frame3d frTmp( Point3d( -dSafeDist, -dSafeDist, -dSafeDist)) ;
+ if ( ! CDeSimpleBoxTria( frTmp, vtDiag + 2 * Vector3d( dSafeDist, dSafeDist, dSafeDist), trTriaL))
return false ;
// Tre box aumentati con distanza di sicurezza in un sola dimensione
- Frame3d frTmp = frBox ; frTmp.Translate( - dSafeDist * frBox.VersX()) ;
+ frTmp.ChangeOrig( Point3d( -dSafeDist, 0, 0)) ;
if ( CDeSimpleBoxTria( frTmp, vtDiag + 2 * dSafeDist * X_AX, trTriaL))
return true ;
- frTmp = frBox ; frTmp.Translate( - dSafeDist * frBox.VersY()) ;
+ frTmp.ChangeOrig( Point3d( 0, -dSafeDist, 0)) ;
if ( CDeSimpleBoxTria( frTmp, vtDiag + 2 * dSafeDist * Y_AX, trTriaL))
return true ;
- frTmp = frBox ; frTmp.Translate( - dSafeDist * frBox.VersZ()) ;
+ frTmp.ChangeOrig( Point3d( 0, 0, -dSafeDist)) ;
if ( CDeSimpleBoxTria( frTmp, vtDiag + 2 * dSafeDist * Z_AX, trTriaL))
return true ;
-#if 1
- // Sfere centrate negli otto vertici
- if ( CDeSimpleSpheTria( Point3d( 0, 0, 0), dSafeDist, trTriaL))
- return true ;
- if ( CDeSimpleSpheTria( Point3d( vtDiag.x, 0, 0), dSafeDist, trTriaL))
- return true ;
- if ( CDeSimpleSpheTria( Point3d( vtDiag.x, vtDiag.y, 0), dSafeDist, trTriaL))
- return true ;
- if ( CDeSimpleSpheTria( Point3d( 0, vtDiag.y, 0), dSafeDist, trTriaL))
- return true ;
- if ( CDeSimpleSpheTria( Point3d( 0, 0, vtDiag.z), dSafeDist, trTriaL))
- return true ;
- if ( CDeSimpleSpheTria( Point3d( vtDiag.x, 0, vtDiag.z), dSafeDist, trTriaL))
- return true ;
- if ( CDeSimpleSpheTria( Point3d( vtDiag.x, vtDiag.y, vtDiag.z), dSafeDist, trTriaL))
- return true ;
- if ( CDeSimpleSpheTria( Point3d( 0, vtDiag.y, vtDiag.z), dSafeDist, trTriaL))
- return true ;
-
- // Cilindri centrati sui dodici spigoli
- frTmp.Set( Point3d( 0, 0, 0), X_AX) ;
- if ( CDeSimpleCylTria( frTmp, dSafeDist, vtDiag.x, trTriaL))
- return true ;
- frTmp.Set( Point3d( 0, vtDiag.y, 0), X_AX) ;
- if ( CDeSimpleCylTria( frTmp, dSafeDist, vtDiag.x, trTriaL))
- return true ;
- frTmp.Set( Point3d( 0, 0, 0), Y_AX) ;
- if ( CDeSimpleCylTria( frTmp, dSafeDist, vtDiag.y, trTriaL))
- return true ;
- frTmp.Set( Point3d( vtDiag.x, 0, 0), Y_AX) ;
- if ( CDeSimpleCylTria( frTmp, dSafeDist, vtDiag.y, trTriaL))
- return true ;
- frTmp.Set( Point3d( 0, 0, vtDiag.z), X_AX) ;
- if ( CDeSimpleCylTria( frTmp, dSafeDist, vtDiag.x, trTriaL))
- return true ;
- frTmp.Set( Point3d( 0, vtDiag.y, vtDiag.z), X_AX) ;
- if ( CDeSimpleCylTria( frTmp, dSafeDist, vtDiag.x, trTriaL))
- return true ;
- frTmp.Set( Point3d( 0, 0, vtDiag.z), Y_AX) ;
- if ( CDeSimpleCylTria( frTmp, dSafeDist, vtDiag.y, trTriaL))
- return true ;
- frTmp.Set( Point3d( vtDiag.x, 0, vtDiag.z), Y_AX) ;
- if ( CDeSimpleCylTria( frTmp, dSafeDist, vtDiag.y, trTriaL))
- return true ;
- frTmp.Set( Point3d( 0., 0., 0.), Z_AX) ;
- if ( CDeSimpleCylTria( frTmp, dSafeDist, vtDiag.z, trTriaL))
- return true ;
- frTmp.Set( Point3d( vtDiag.x, 0., 0.), Z_AX) ;
- if ( CDeSimpleCylTria( frTmp, dSafeDist, vtDiag.z, trTriaL))
- return true ;
- frTmp.Set( Point3d( vtDiag.x, vtDiag.y, 0.), Z_AX) ;
- if ( CDeSimpleCylTria( frTmp, dSafeDist, vtDiag.z, trTriaL))
- return true ;
- frTmp.Set( Point3d( 0., vtDiag.y, 0.), Z_AX) ;
- if ( CDeSimpleCylTria( frTmp, dSafeDist, vtDiag.z, trTriaL))
- return true ;
-#else
// Capsule centrati sui dodici spigoli
if ( CDeSimpleCapsTria( Point3d( 0, 0, 0), Point3d( vtDiag.x, 0, 0), dSafeDist, trTriaL))
return true ;
@@ -279,7 +222,6 @@ CDeBoxTria( const Frame3d& frBox, const Vector3d& vtDiag, double dSafeDist, cons
return true ;
if ( CDeSimpleCapsTria( Point3d( 0, vtDiag.y, 0), Point3d( 0, vtDiag.y, vtDiag.z), dSafeDist, trTriaL))
return true ;
-#endif
return false ;
}
diff --git a/CDeCapsTria.cpp b/CDeCapsTria.cpp
index 5daf951..4212adc 100644
--- a/CDeCapsTria.cpp
+++ b/CDeCapsTria.cpp
@@ -16,6 +16,7 @@
#include "CDeCapsTria.h"
#include "CDeSpheTria.h"
#include "ProjPlane.h"
+#include "IntersLineCaps.h"
#include "/EgtDev/Include/EGkPolygon3d.h"
#include "/EgtDev/Include/EGkIntersLinePlane.h"
#include "/EgtDev/Include/EGkDistPointTria.h"
@@ -31,6 +32,7 @@ CDeSimpleCapsTria( const Point3d& ptP1, const Point3d& ptP2, double dR, const Tr
// Dati della capsule come sfera che si muove
Point3d ptC = ptP1 ;
+ Point3d ptE = ptP2 ;
Vector3d vtDir = ptP2 - ptP1 ;
double dLen = vtDir.Len() ;
if ( dLen < EPS_SMALL)
@@ -39,6 +41,13 @@ CDeSimpleCapsTria( const Point3d& ptP1, const Point3d& ptP2, double dR, const Tr
if ( vtDir * trTria.GetN() > 0) {
vtDir.Invert() ;
ptC = ptP2 ;
+ ptE = ptP1 ;
+ }
+ // Se sfera finale dista dal piano come o meno del raggio, devo verificarla direttamente (il retro è escluso dal calcolo standard)
+ double dDistE = DistPointPlane( ptE, trTria.GetPlane()) ;
+ if ( abs( dDistE) <= dR) {
+ if ( CDeSimpleSpheTria( ptE, dR, trTria))
+ return true ;
}
// Determinazione primo possibile punto di contatto della sfera con il piano
Point3d ptD = ptC - trTria.GetN() * dR ;
@@ -48,15 +57,20 @@ CDeSimpleCapsTria( const Point3d& ptP1, const Point3d& ptP2, double dR, const Tr
// Se non c'è intersezione passante
if ( nLpRes != ILPT_YES) {
// se il centro dista dal piano non meno del raggio, allora non c'è sicuramente collisione
- double dDist = DistPointPlane( ptP, trTria.GetPlane()) ;
- if ( abs( dDist) >= dR)
+ double dDistM = DistPointPlane( Media( ptP1, ptP2), trTria.GetPlane()) ;
+ if ( abs( dDistM) >= dR)
return false ;
- // !!! DA FARE !!!!
- // si deve intersecare l'asse del capsule con i cilindri centrati sui lati del triangolo
- // se intersezione inferiore a dLen allora collisione
- // altrimenti si deve intersecare l'asse del capsule con le sfere centrate sui vertici del triangolo
- // se intersezione inferiore a dLen allora collisione
- // per ora salto
+ // interseco l'asse del capsule con capsule di pari raggio con asse i lati del triangolo
+ double dU1 = INFINITO, dU2 = -INFINITO ;
+ for ( int i = 0 ; i < 3 ; ++ i) {
+ double dInt1, dInt2 ;
+ if ( IntersLineCaps( ptC, vtDir, trTria.GetP( i), trTria.GetP( ( i + 1) % 3), dR, dInt1, dInt2)) {
+ dU1 = min( dU1, dInt1) ;
+ dU2 = max( dU2, dInt2) ;
+ if ( ! ( dU1 >= dLen || dU2 <= 0))
+ return true ;
+ }
+ }
return false ;
}
// Determino la posizione dell'intersezione rispetto al triangolo
@@ -65,7 +79,7 @@ CDeSimpleCapsTria( const Point3d& ptP1, const Point3d& ptP2, double dR, const Tr
double dSqDist ;
if ( dptDist.GetSqDist( dSqDist) && dSqDist < 4 * SQ_EPS_SMALL) {
double dPos = ( ptP - ptD) * vtDir ;
- return ( dPos > -dR && dPos < dLen) ;
+ return ( dPos > 0 && dPos < dLen) ;
}
// Altrimenti, recupero il punto del triangolo più vicino all'intersezione
Point3d ptQ ;
@@ -75,7 +89,7 @@ CDeSimpleCapsTria( const Point3d& ptP1, const Point3d& ptP2, double dR, const Tr
if ( nLsRes != ILST_SEC)
return false ;
double dPos = ( ptQ - ptI1) * vtDir ;
- return ( dPos > -dR && dPos < dLen) ;
+ return ( dPos > 0 && dPos < dLen) ;
}
return false ;
diff --git a/CDeRectPrismoidTria.cpp b/CDeRectPrismoidTria.cpp
index 9eefc88..1464549 100644
--- a/CDeRectPrismoidTria.cpp
+++ b/CDeRectPrismoidTria.cpp
@@ -14,6 +14,7 @@
//--------------------------- Include ----------------------------------------
#include "stdafx.h"
#include "CDeRectPrismoidTria.h"
+#include "CDeCapsTria.h"
#include "CDeBoxTria.h"
#include "CDeCylTria.h"
#include "CDeSpheTria.h"
@@ -141,9 +142,13 @@ CDeRectPrismoidTria( const Frame3d& frPrismoid, double dLenghtBaseX, double dLen
dHeight < EPS_SMALL || ! trTria.IsValid())
return false ;
+ // Porto il triangolo nel riferimento del prismoide
+ Triangle3d trTriaL = trTria ;
+ trTriaL.ToLoc( frPrismoid) ;
+
// Se distanza di sicurezza nulla
if ( dSafeDist < EPS_SMALL)
- return CDeSimpleRectPrismoidTria( frPrismoid, dLenghtBaseX, dLenghtBaseY, dLenghtTopX, dLenghtTopY, dHeight, trTria) ;
+ return CDeSimpleRectPrismoidTria( Frame3d(), dLenghtBaseX, dLenghtBaseY, dLenghtTopX, dLenghtTopY, dHeight, trTriaL) ;
// Verifiche con offset esteso
double dHDiffX = ( dLenghtBaseX - dLenghtTopX) / 2 ;
@@ -156,37 +161,37 @@ CDeRectPrismoidTria( const Frame3d& frPrismoid, double dLenghtBaseX, double dLen
double dSecAy = sqrt( 1 + dTgAy * dTgAy) ;
double dOffsBaseY = dSafeDist * ( dSecAy + dTgAy) ;
double dOffsTopY = dSafeDist * ( dSecAy - dTgAy) ;
- Frame3d frFrame = frPrismoid ; frFrame.Translate( - dSafeDist * frFrame.VersZ()) ;
- if ( ! CDeSimpleRectPrismoidTria( frFrame, dLenghtBaseX + 2 * dOffsBaseX, dLenghtBaseY + 2 * dOffsBaseY,
- dLenghtTopX + 2 * dOffsTopX, dLenghtTopY + 2 * dOffsTopY, dHeight + 2 * dSafeDist, trTria))
+ Frame3d frTmp( Point3d( 0, 0, -dSafeDist)) ;
+ if ( ! CDeSimpleRectPrismoidTria( frTmp, dLenghtBaseX + 2 * dOffsBaseX, dLenghtBaseY + 2 * dOffsBaseY,
+ dLenghtTopX + 2 * dOffsTopX, dLenghtTopY + 2 * dOffsTopY, dHeight + 2 * dSafeDist, trTriaL))
return false ;
// Offset fine
// Box sotto
- frFrame = frPrismoid ; frFrame.Translate( - dSafeDist * frFrame.VersZ()) ;
- if ( CDeSimpleBoxTria( frFrame, Vector3d( dLenghtBaseX, dLenghtBaseY, dSafeDist), trTria))
+ frTmp.ChangeOrig( Point3d( 0, 0, -dSafeDist)) ;
+ if ( CDeSimpleBoxTria( frTmp, Vector3d( dLenghtBaseX, dLenghtBaseY, dSafeDist), trTriaL))
return true ;
// Box sopra
- frFrame = frPrismoid ; frFrame.Translate( dHeight * frFrame.VersZ()) ;
- if ( CDeSimpleBoxTria( frFrame, Vector3d( dLenghtTopX, dLenghtTopY, dSafeDist), trTria))
+ frTmp.ChangeOrig( Point3d( 0, 0, dHeight)) ;
+ if ( CDeSimpleBoxTria( frTmp, Vector3d( dLenghtTopX, dLenghtTopY, dSafeDist), trTriaL))
return true ;
// Prismoide allungato in X
double dHypoX = sqrt( dHDiffX * dHDiffX + dHeight * dHeight) ;
double dOffsX = dSafeDist * dHeight / dHypoX ;
double dMoveXZ = dSafeDist * dHDiffX / dHypoX ;
- frFrame = frPrismoid ; frFrame.Translate( dMoveXZ * frFrame.VersZ()) ;
- if ( CDeSimpleRectPrismoidTria( frFrame, dLenghtBaseX + 2 * dOffsX, dLenghtBaseY,
- dLenghtTopX + 2 * dOffsX, dLenghtTopY, dHeight, trTria))
+ frTmp.ChangeOrig( Point3d( 0, 0, dMoveXZ)) ;
+ if ( CDeSimpleRectPrismoidTria( frTmp, dLenghtBaseX + 2 * dOffsX, dLenghtBaseY,
+ dLenghtTopX + 2 * dOffsX, dLenghtTopY, dHeight, trTriaL))
return true ;
// Prismoide allungato in Y
double dHypoY = sqrt( dHDiffY * dHDiffY + dHeight * dHeight) ;
double dOffsY = dSafeDist * dHeight / dHypoY ;
double dMoveYZ = dSafeDist * dHDiffY / dHypoY ;
- frFrame = frPrismoid ; frFrame.Translate( dMoveYZ * frFrame.VersZ()) ;
- if ( CDeSimpleRectPrismoidTria( frFrame, dLenghtBaseX, dLenghtBaseY + 2 * dOffsY,
- dLenghtTopX, dLenghtTopY + 2 * dOffsY, dHeight, trTria))
+ frTmp.ChangeOrig( Point3d( 0, 0, dMoveYZ)) ;
+ if ( CDeSimpleRectPrismoidTria( frTmp, dLenghtBaseX, dLenghtBaseY + 2 * dOffsY,
+ dLenghtTopX, dLenghtTopY + 2 * dOffsY, dHeight, trTriaL))
return true ;
- // Sfere centrate nei vertici
+ // Vertici
double dHalfBaseX = dLenghtBaseX / 2 ;
double dHalfBaseY = dLenghtBaseY / 2 ;
double dHalfTopX = dLenghtTopX / 2 ;
@@ -199,55 +204,30 @@ CDeRectPrismoidTria( const Frame3d& frPrismoid, double dLenghtBaseX, double dLen
Point3d( dHalfTopX, -dHalfTopY, dHeight),
Point3d( dHalfTopX, dHalfTopY, dHeight),
Point3d( -dHalfTopX, dHalfTopY, dHeight)} ;
- for ( auto& ptV : vVert) {
- ptV.ToGlob( frPrismoid) ;
- if ( CDeSimpleSpheTria( ptV, dSafeDist, trTria))
- return true ;
- }
- // Cilindri con i segmenti come asse
- frFrame.Set( vVert[0], frPrismoid.VersX()) ;
- if ( CDeSimpleCylTria( frFrame, dSafeDist, dLenghtBaseX, trTria))
+ // Capsule centrati sui dodici spigoli
+ if ( CDeSimpleCapsTria( vVert[0], vVert[1], dSafeDist, trTriaL))
return true ;
- frFrame.Set( vVert[1], frPrismoid.VersY()) ;
- if ( CDeSimpleCylTria( frFrame, dSafeDist, dLenghtBaseY, trTria))
+ if ( CDeSimpleCapsTria( vVert[1], vVert[2], dSafeDist, trTriaL))
return true ;
- frFrame.Set( vVert[2], -frPrismoid.VersX()) ;
- if ( CDeSimpleCylTria( frFrame, dSafeDist, dLenghtBaseX, trTria))
+ if ( CDeSimpleCapsTria( vVert[2], vVert[3], dSafeDist, trTriaL))
return true ;
- frFrame.Set( vVert[3], -frPrismoid.VersY()) ;
- if ( CDeSimpleCylTria( frFrame, dSafeDist, dLenghtBaseY, trTria))
+ if ( CDeSimpleCapsTria( vVert[3], vVert[0], dSafeDist, trTriaL))
return true ;
- frFrame.Set( vVert[4], frPrismoid.VersX()) ;
- if (CDeSimpleCylTria( frFrame, dSafeDist, dLenghtTopX, trTria))
+ if ( CDeSimpleCapsTria( vVert[4], vVert[5], dSafeDist, trTriaL))
return true ;
- frFrame.Set( vVert[5], frPrismoid.VersY()) ;
- if ( CDeSimpleCylTria( frFrame, dSafeDist, dLenghtTopY, trTria))
+ if ( CDeSimpleCapsTria( vVert[5], vVert[6], dSafeDist, trTriaL))
return true ;
- frFrame.Set( vVert[6], -frPrismoid.VersX()) ;
- if ( CDeSimpleCylTria( frFrame, dSafeDist, dLenghtTopX, trTria))
+ if ( CDeSimpleCapsTria( vVert[6], vVert[7], dSafeDist, trTriaL))
return true ;
- frFrame.Set( vVert[7], -frPrismoid.VersY()) ;
- if ( CDeSimpleCylTria( frFrame, dSafeDist, dLenghtTopY, trTria))
+ if ( CDeSimpleCapsTria( vVert[7], vVert[4], dSafeDist, trTriaL))
return true ;
- Vector3d vtSeg04 = vVert[4] - vVert[0] ;
- double dLenSeg04 = vtSeg04.Len() ;
- frFrame.Set( vVert[0], vtSeg04) ;
- if ( CDeSimpleCylTria( frFrame, dSafeDist, dLenSeg04, trTria))
+ if ( CDeSimpleCapsTria( vVert[0], vVert[4], dSafeDist, trTriaL))
return true ;
- Vector3d vtSeg15 = vVert[5] - vVert[1] ;
- double dLenSeg15 = vtSeg15.Len() ;
- frFrame.Set( vVert[1], vtSeg15) ;
- if ( CDeSimpleCylTria( frFrame, dSafeDist, dLenSeg15, trTria))
+ if ( CDeSimpleCapsTria( vVert[1], vVert[5], dSafeDist, trTriaL))
return true ;
- Vector3d vtSeg26 = vVert[6] - vVert[2] ;
- double dLenSeg26 = vtSeg26.Len() ;
- frFrame.Set( vVert[2], vtSeg26) ;
- if ( CDeSimpleCylTria( frFrame, dSafeDist, dLenSeg26, trTria))
+ if ( CDeSimpleCapsTria( vVert[2], vVert[6], dSafeDist, trTriaL))
return true ;
- Vector3d vtSeg37 = vVert[7] - vVert[3] ;
- double dLenSeg37 = vtSeg37.Len();
- frFrame.Set( vVert[3], vtSeg37) ;
- if ( CDeSimpleCylTria( frFrame, dSafeDist, dLenSeg37, trTria))
+ if ( CDeSimpleCapsTria( vVert[3], vVert[7], dSafeDist, trTriaL))
return true ;
return false ;
diff --git a/EgtGeomKernel.rc b/EgtGeomKernel.rc
index f04937a..fdb2bec 100644
Binary files a/EgtGeomKernel.rc and b/EgtGeomKernel.rc differ
diff --git a/EgtGeomKernel.vcxproj b/EgtGeomKernel.vcxproj
index 07e3f01..6feb619 100644
--- a/EgtGeomKernel.vcxproj
+++ b/EgtGeomKernel.vcxproj
@@ -331,6 +331,7 @@ copy $(TargetPath) \EgtProg\Dll64
+
@@ -601,6 +602,7 @@ copy $(TargetPath) \EgtProg\Dll64
+
diff --git a/EgtGeomKernel.vcxproj.filters b/EgtGeomKernel.vcxproj.filters
index 6e688e2..d9b5749 100644
--- a/EgtGeomKernel.vcxproj.filters
+++ b/EgtGeomKernel.vcxproj.filters
@@ -477,6 +477,9 @@
File di origine\GeoInters
+
+ File di origine\GeoInters
+
@@ -1115,6 +1118,9 @@
File di intestazione
+
+ File di intestazione
+
diff --git a/IntersLineCaps.cpp b/IntersLineCaps.cpp
new file mode 100644
index 0000000..0b1553f
--- /dev/null
+++ b/IntersLineCaps.cpp
@@ -0,0 +1,58 @@
+//----------------------------------------------------------------------------
+// EgalTech 2023-2023
+//----------------------------------------------------------------------------
+// File : IntersLineCaps.cpp Data : 22.05.23 Versione : 2.5e3
+// Contenuto : Implementazione della intersezione linea/capsule.
+//
+//
+//
+// Modifiche : 22.05.23 DS Creazione modulo.
+//
+//
+//----------------------------------------------------------------------------
+
+//--------------------------- Include ----------------------------------------
+#include "stdafx.h"
+#include "IntersLineCaps.h"
+#include "DistLineLine.h"
+#include "/EgtDev/Include/EGkIntersLineSphere.h"
+
+using namespace std ;
+
+
+//----------------------------------------------------------------------------
+// Linea e capsule sono nel medesimo riferimento.
+// Il capsule è definito con centri delle due estremità, e raggio.
+// In caso di intersezione viene restituito true e i parametri in dU1 e dU2.
+//----------------------------------------------------------------------------
+bool
+IntersLineCaps( const Point3d& ptL, const Vector3d& vtL,
+ const Point3d& ptCaps1, const Point3d& ptCaps2, double dRad,
+ double& dU1, double& dU2)
+{
+ // Determino versore e lunghezza asse Capsule
+ Vector3d vtCaps = ptCaps2 - ptCaps1 ;
+ double dLen = vtCaps.Len() ;
+ if ( dLen < EPS_SMALL) {
+ Point3d ptInt1, ptInt2 ;
+ if ( IntersLineSphere( ptL, vtL, Media( ptCaps1, ptCaps2), dRad, ptInt1, ptInt2) != ILST_SEC)
+ return false ;
+ dU1 = ( ptInt1 - ptL) * vtL ;
+ dU2 = ( ptInt2 - ptL) * vtL ;
+ return true ;
+ }
+ vtCaps /= dLen ;
+ // Distanza tra la linea e il segmento asse del capsule
+ DistLineLine dstLL( ptL, vtL, 1, ptCaps1, vtCaps, dLen, false, true) ;
+ double dSqDist ;
+ if ( dstLL.GetSqDist( dSqDist) && dSqDist >= dRad * dRad)
+ return false ;
+ // Calcolo i punti di intersezione
+ Point3d ptRef, ptTmp ;
+ dstLL.GetMinDistPoints( ptRef, ptTmp) ;
+ double dSqDelta = dRad * dRad - dSqDist ;
+ double dDist = sqrt( dSqDelta) ;
+ dU1 = ( ptRef - ptL) * vtL - dDist ;
+ dU2 = dU1 + 2 * dDist ;
+ return true ;
+}
diff --git a/IntersLineCaps.h b/IntersLineCaps.h
new file mode 100644
index 0000000..0e6aeae
--- /dev/null
+++ b/IntersLineCaps.h
@@ -0,0 +1,25 @@
+//----------------------------------------------------------------------------
+// EgalTech 2023-2023
+//----------------------------------------------------------------------------
+// File : IntersLineCaps.h Data : 22.05.23 Versione : 2.5e4
+// Contenuto : Dichiarazione funzioni base per intersezione linea/capsule.
+//
+//
+//
+// Modifiche : 22.05.23 DS Creazione modulo.
+//
+//
+//----------------------------------------------------------------------------
+
+#pragma once
+
+#include "/EgtDev/Include/EGkPoint3d.h"
+
+//----------------------------------------------------------------------------
+// Linea e capsule sono nel medesimo riferimento.
+// Il capsule è definito con centri delle due estremità, e raggio.
+// In caso di intersezione viene restituito true e i parametri in dU1 e dU2.
+//----------------------------------------------------------------------------
+bool IntersLineCaps( const Point3d& ptL, const Vector3d& vtL,
+ const Point3d& ptCaps1, const Point3d& ptCaps2, double dRad,
+ double& dU1, double& dU2) ;
diff --git a/IntersLineCyl.cpp b/IntersLineCyl.cpp
index c78b3b7..dac9242 100644
--- a/IntersLineCyl.cpp
+++ b/IntersLineCyl.cpp
@@ -14,6 +14,7 @@
//--------------------------- Include ----------------------------------------
#include "stdafx.h"
#include "IntersLineCyl.h"
+#include "/EgtDev/Include/EGkFrame3d.h"
#include "/EgtDev/Include/ENkPolynomialRoots.h"
using namespace std ;
@@ -116,3 +117,45 @@ IntersLineCyl( const Point3d& ptL, const Vector3d& vtL,
else
return false ;
}
+
+//----------------------------------------------------------------------------
+// Linea e cilindro sono nel medesimo riferimento.
+// Il cilindro è definito con centro della base, asse, raggio e altezza.
+// In caso di intersezione viene restituito true e i parametri in dU1 e dU2.
+//----------------------------------------------------------------------------
+bool
+IntersLineCyl( const Point3d& ptL, const Vector3d& vtL,
+ const Point3d& ptCyl, const Vector3d& vtCyl, double dRad, double dHeight,
+ double& dU1, double& dU2)
+{
+ // Riferimento intrinseco del cilindro
+ Frame3d frCyl ;
+ if ( ! frCyl.Set( ptCyl, vtCyl))
+ return false ;
+ // Ora eseguo i conti nel riferimento intrinseco
+ return IntersLineCyl( GetToLoc( ptL, frCyl), GetToLoc( vtL, frCyl), dRad, dHeight, dU1, dU2) ;
+}
+
+//----------------------------------------------------------------------------
+// Linea e cilindro sono nel medesimo riferimento.
+// Il cilindro è definito con centri delle due basi, e raggio.
+// In caso di intersezione viene restituito true e i parametri in dU1 e dU2.
+//----------------------------------------------------------------------------
+bool
+IntersLineCyl( const Point3d& ptL, const Vector3d& vtL,
+ const Point3d& ptCyl1, const Point3d& ptCyl2, double dRad,
+ double& dU1, double& dU2)
+{
+ // Determino asse ed altezza del cilindro
+ Vector3d vtCyl = ptCyl2 - ptCyl1 ;
+ double dHeight = vtCyl.Len() ;
+ if ( dHeight < EPS_SMALL)
+ return false ;
+ vtCyl /= dHeight ;
+ // Riferimento intrinseco del cilindro
+ Frame3d frCyl ;
+ if ( ! frCyl.Set( ptCyl1, vtCyl))
+ return false ;
+ // Ora eseguo i conti nel riferimento intrinseco
+ return IntersLineCyl( GetToLoc( ptL, frCyl), GetToLoc( vtL, frCyl), dRad, dHeight, dU1, dU2) ;
+}
diff --git a/IntersLineCyl.h b/IntersLineCyl.h
index 4448739..fd14e4b 100644
--- a/IntersLineCyl.h
+++ b/IntersLineCyl.h
@@ -20,10 +20,9 @@
// Il cilindro è centrato sull'asse Z e appoggiato sul piano XY.
// Con intersezione viene restituito true e i parametri in dU1 e dU2.
//----------------------------------------------------------------------------
-bool
-IntersLineCyl( const Point3d& ptL, const Vector3d& vtL,
- double dRad, double dHeight,
- double& dU1, double& dU2) ;
+bool IntersLineCyl( const Point3d& ptL, const Vector3d& vtL,
+ double dRad, double dHeight,
+ double& dU1, double& dU2) ;
//----------------------------------------------------------------------------
inline bool
@@ -33,3 +32,21 @@ TestIntersLineCyl( const Point3d& ptL, const Vector3d& vtL,
double dU1, dU2 ;
return IntersLineCyl( ptL, vtL, dRad, dHeight, dU1, dU2) ;
}
+
+//----------------------------------------------------------------------------
+// Linea e cilindro sono nel medesimo riferimento.
+// Il cilindro è definito con centro della base, asse raggio e altezza.
+// In caso di intersezione viene restituito true e i parametri in dU1 e dU2.
+//----------------------------------------------------------------------------
+bool IntersLineCyl( const Point3d& ptL, const Vector3d& vtL,
+ const Point3d& ptCyl, const Vector3d& vtCyl, double dRad, double dHeight,
+ double& dU1, double& dU2) ;
+
+//----------------------------------------------------------------------------
+// Linea e cilindro sono nel medesimo riferimento.
+// Il cilindro è definito con centri delle due basi, e raggio.
+// In caso di intersezione viene restituito true e i parametri in dU1 e dU2.
+//----------------------------------------------------------------------------
+bool IntersLineCyl( const Point3d& ptL, const Vector3d& vtL,
+ const Point3d& ptCyl1, const Point3d& ptCyl2, double dRad,
+ double& dU1, double& dU2) ;