EgtGeomKernel 1.9l4 :
- fabs sostituito da abs - in Zmap razionalizzazione operazioni taglio spilloni - in SurfTriMesh UpdateFaceting senza più chiamate recursive.
This commit is contained in:
+9
-10
@@ -1712,8 +1712,8 @@ double
|
||||
TorusPointLeakDistGenMot( const Point3d& ptTorusCen, const Vector3d& vtTorusAx, double dMaxRad, double dMinRad,
|
||||
const Point3d& ptP, const Vector3d& vtMove)
|
||||
{
|
||||
std::vector<bool> vbType ;
|
||||
std::vector<double> vdPar ;
|
||||
BOOLVECTOR vbType ;
|
||||
DBLVECTOR vdPar ;
|
||||
// Intersezione fra semi-retta e corona torica
|
||||
int nIntType = LinCompTorusExtInt( ptP, - vtMove, 1, Ray, ptTorusCen, vtTorusAx, dMinRad, dMaxRad, vbType, vdPar) ;
|
||||
if ( nIntType == T_ERROR)
|
||||
@@ -2043,8 +2043,8 @@ double
|
||||
ConcaveTorusPointLeakDistGenMot( const Point3d& ptTorusCen, const Vector3d& vtTorusAx, double dMaxRad, double dMinRad,
|
||||
const Point3d& ptP, const Vector3d& vtMove)
|
||||
{
|
||||
std::vector<bool> vbType ;
|
||||
std::vector<double> vdPar ;
|
||||
BOOLVECTOR vbType ;
|
||||
DBLVECTOR vdPar ;
|
||||
// Intersezione fra semi-retta e corona torica
|
||||
int nIntType = LinCompTorusInnUpInt( ptP, - vtMove, 1, Ray, ptTorusCen, vtTorusAx, dMinRad, dMaxRad, vbType, vdPar) ;
|
||||
if ( nIntType == T_ERROR)
|
||||
@@ -2414,21 +2414,19 @@ double
|
||||
DiskSegmentLeakDistGenMot( double dDiskRad, const Point3d& ptSeg, const Vector3d& vtSeg, double dSegLen,
|
||||
const Vector3d& vtMove)
|
||||
{
|
||||
// Quadrato del raggio
|
||||
double dSqRad = ( dDiskRad - EPS_SMALL) * ( dDiskRad - EPS_SMALL) ;
|
||||
// Il caso in cui il segmento è parallelo al versore del moto è gestito dalla
|
||||
// routine per il calcolo della distanza di allontanamento dei punti.
|
||||
if ( AreSameOrOppositeVectorApprox( vtMove, vtSeg))
|
||||
return 0. ;
|
||||
|
||||
vector <double> vdCoef(3) ;
|
||||
vector <double> vdRoots ;
|
||||
|
||||
// Siamo nel caso in cui il movimento è generico rispetto all'asse del disco, quindi
|
||||
// sicuramente vtMove.z > 0, quindi esiste il rapporto dObCoef
|
||||
double dObCoef = vtMove.x / vtMove.z ;
|
||||
double dSqCoef = dObCoef * dObCoef ;
|
||||
// Quadrato del raggio
|
||||
double dSqRad = ( dDiskRad - EPS_SMALL) * ( dDiskRad - EPS_SMALL) ;
|
||||
// Setto i coeficienti dell'equazione
|
||||
DBLVECTOR vdCoef(3) ;
|
||||
vdCoef[0] = dSqCoef * ptSeg.z * ptSeg.z + ptSeg.x * ptSeg.x + ptSeg.y * ptSeg.y
|
||||
- 2 * dObCoef * ptSeg.z * ptSeg.x - dSqRad ;
|
||||
vdCoef[1] = 2 * ( dSqCoef * vtSeg.z * ptSeg.z + vtSeg.x * ptSeg.x + vtSeg.y * ptSeg.y
|
||||
@@ -2438,9 +2436,10 @@ DiskSegmentLeakDistGenMot( double dDiskRad, const Point3d& ptSeg, const Vector3d
|
||||
// Numero di soluzioni: l'equazione ammette o due soluzioni (eventualmente
|
||||
// coincidenti) oppure nessuna o infinite se la la retta
|
||||
// appartiene alla superficie
|
||||
double dLenCoef = sqrt( 1 + dSqCoef) ;
|
||||
DBLVECTOR vdRoots ;
|
||||
int nRoot = PolynomialRoots( 2, vdCoef, vdRoots) ;
|
||||
|
||||
double dLenCoef = sqrt( 1 + dSqCoef) ;
|
||||
double dLeakDist = 0. ;
|
||||
for ( int n = 0 ; n < nRoot ; ++ n) {
|
||||
if ( vdRoots[n] > 0 && vdRoots[n] < dSegLen) {
|
||||
|
||||
Reference in New Issue
Block a user