EgtGeomKernel 1.6b5 :
- migliorata triangolazione per isole che toccano contorno esterno.
This commit is contained in:
+25
-11
@@ -18,10 +18,6 @@
|
||||
#include "\EgtDev\Include\EGkPolyLine.h"
|
||||
#include "\EgtDev\Include\EGkPlane3d.h"
|
||||
|
||||
#include "DllMain.h"
|
||||
#include "/EgtDev/Include/EGkStringUtils3d.h"
|
||||
#include "/EgtDev/Include/EgtLogger.h"
|
||||
|
||||
using namespace std ;
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
@@ -602,7 +598,7 @@ Triangulate::CalcTriangleAspectRatio( const Point3d& ptPa, const Point3d& ptPb,
|
||||
if ( dTwoArea < EPS_SMALL * EPS_SMALL)
|
||||
return INFINITO ;
|
||||
else
|
||||
return ( std::max( dSqDistA, std::max( dSqDistB, dSqDistC)) / dTwoArea) ;
|
||||
return ( (std::max)( dSqDistA, (std::max)( dSqDistB, dSqDistC)) / dTwoArea) ;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
@@ -811,8 +807,14 @@ Triangulate::GetOuterPntToJoin( const PNTVECTOR& vPt, const Point3d& ptP, int& n
|
||||
// mi metto nel piano principale
|
||||
switch (m_nPlane) {
|
||||
default : // PL_XY
|
||||
// se i punti coincidono
|
||||
if ( fabs( vPt[i].x - ptP.x) < EPS_SMALL && fabs( vPt[i].y - ptP.y) < EPS_SMALL) {
|
||||
dMinDist = 0 ;
|
||||
nI = i ;
|
||||
ptInt = vPt[i] ;
|
||||
}
|
||||
// se punto esattamente sul raggio e raggio interno al settore
|
||||
if ( vPt[i].x > ptP.x && fabs( vPt[i].y - ptP.y) < EPS_SMALL &&
|
||||
else if ( vPt[i].x > ptP.x && fabs( vPt[i].y - ptP.y) < EPS_SMALL &&
|
||||
PointInSector( ptP, vPt[h], vPt[i], vPt[j])) {
|
||||
// se distanza minore della minima, nuovo minimo
|
||||
if ( ( vPt[i].x - ptP.x) < dMinDist) {
|
||||
@@ -827,7 +829,7 @@ Triangulate::GetOuterPntToJoin( const PNTVECTOR& vPt, const Point3d& ptP, int& n
|
||||
double dCoeff = ( ptP.y - vPt[i].y) / ( vPt[j].y - vPt[i].y) ;
|
||||
double dX = vPt[i].x + ( vPt[j].x - vPt[i].x) * dCoeff ;
|
||||
// se sta sul raggio e distanza minore della minima
|
||||
if ( dX > ptP.x && ( dX - ptP.x) < dMinDist) {
|
||||
if ( dX > ptP.x - EPS_SMALL && ( dX - ptP.x) < dMinDist) {
|
||||
dMinDist = dX - ptP.x ;
|
||||
nI = ( vPt[i].x >= vPt[j].x) ? i : j ;
|
||||
double dZ = vPt[i].z + ( vPt[j].z - vPt[i].z) * dCoeff ;
|
||||
@@ -836,8 +838,14 @@ Triangulate::GetOuterPntToJoin( const PNTVECTOR& vPt, const Point3d& ptP, int& n
|
||||
}
|
||||
break ;
|
||||
case PL_YZ :
|
||||
// se i punti coincidono
|
||||
if ( fabs( vPt[i].y - ptP.y) < EPS_SMALL && fabs( vPt[i].z - ptP.z) < EPS_SMALL) {
|
||||
dMinDist = 0 ;
|
||||
nI = i ;
|
||||
ptInt = vPt[i] ;
|
||||
}
|
||||
// se punto esattamente sul raggio e raggio interno al settore
|
||||
if ( vPt[i].y > ptP.y && fabs( vPt[i].z - ptP.z) < EPS_SMALL &&
|
||||
else if ( vPt[i].y > ptP.y && fabs( vPt[i].z - ptP.z) < EPS_SMALL &&
|
||||
PointInSector( ptP, vPt[h], vPt[i], vPt[j])) {
|
||||
// se distanza minore della minima, nuovo minimo
|
||||
if ( ( vPt[i].y - ptP.y) < dMinDist) {
|
||||
@@ -852,7 +860,7 @@ Triangulate::GetOuterPntToJoin( const PNTVECTOR& vPt, const Point3d& ptP, int& n
|
||||
double dCoeff = ( ptP.z - vPt[i].z) / ( vPt[j].z - vPt[i].z) ;
|
||||
double dY = vPt[i].y + ( vPt[j].y - vPt[i].y) * dCoeff ;
|
||||
// se sta sul raggio e distanza minore della minima
|
||||
if ( dY > ptP.y && ( dY - ptP.y) < dMinDist) {
|
||||
if ( dY > ptP.y - EPS_SMALL && ( dY - ptP.y) < dMinDist) {
|
||||
dMinDist = dY - ptP.y ;
|
||||
nI = ( vPt[i].y >= vPt[j].y) ? i : j ;
|
||||
double dX = vPt[i].x + ( vPt[j].x - vPt[i].x) * dCoeff ;
|
||||
@@ -861,8 +869,14 @@ Triangulate::GetOuterPntToJoin( const PNTVECTOR& vPt, const Point3d& ptP, int& n
|
||||
}
|
||||
break ;
|
||||
case PL_ZX :
|
||||
// se i punti coincidono
|
||||
if ( fabs( vPt[i].z - ptP.z) < EPS_SMALL && fabs( vPt[i].x - ptP.x) < EPS_SMALL) {
|
||||
dMinDist = 0 ;
|
||||
nI = i ;
|
||||
ptInt = vPt[i] ;
|
||||
}
|
||||
// se punto esattamente sul raggio e raggio interno al settore
|
||||
if ( vPt[i].z > ptP.z && fabs( vPt[i].x - ptP.x) < EPS_SMALL &&
|
||||
else if ( vPt[i].z > ptP.z && fabs( vPt[i].x - ptP.x) < EPS_SMALL &&
|
||||
PointInSector( ptP, vPt[h], vPt[i], vPt[j])) {
|
||||
// se distanza minore della minima, nuovo minimo
|
||||
if ( ( vPt[i].z - ptP.z) < dMinDist) {
|
||||
@@ -877,7 +891,7 @@ Triangulate::GetOuterPntToJoin( const PNTVECTOR& vPt, const Point3d& ptP, int& n
|
||||
double dCoeff = ( ptP.x - vPt[i].x) / ( vPt[j].x - vPt[i].x) ;
|
||||
double dZ = vPt[i].z + ( vPt[j].z - vPt[i].z) * dCoeff ;
|
||||
// se sta sul raggio e distanza minore della minima
|
||||
if ( dZ > ptP.z && ( dZ - ptP.z) < dMinDist) {
|
||||
if ( dZ > ptP.z - EPS_SMALL && ( dZ - ptP.z) < dMinDist) {
|
||||
dMinDist = dZ - ptP.z ;
|
||||
nI = ( vPt[i].z >= vPt[j].z) ? i : j ;
|
||||
double dY = vPt[i].y + ( vPt[j].y - vPt[i].y) * dCoeff ;
|
||||
|
||||
Reference in New Issue
Block a user