EgtGraphics 2.1f2 :

- corretto punto notevole EndPoint per Zmap.
This commit is contained in:
Dario Sassi
2019-06-19 06:30:43 +00:00
parent 60fd504668
commit e9caceca72
2 changed files with 16 additions and 38 deletions
+16 -38
View File
@@ -35,6 +35,9 @@
using namespace std ;
//----------------------------------------------------------------------------
const double SRF_SMALL_SQDIST = 100 ;
//----------------------------------------------------------------------------
bool
Scene::GetGraphicSnapPoint( int nSnap, const Point3d& ptWin, int nW, int nH, Point3d& ptSel)
@@ -799,7 +802,7 @@ Scene::FindSurfTMSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Fram
}
// se trovato e modalità shading o hiddenline, la favorisco perchè davanti alle possibili successive
if ( bFound && ! ( bAlpha || m_nShowMode == SM_WIREFRAME))
if ( bFound && ! ( bAlpha || m_nShowMode == SM_WIREFRAME) && dMinSqDist < SRF_SMALL_SQDIST)
dMinSqDist = 0 ;
return bFound ;
@@ -905,7 +908,7 @@ Scene::FindSurfFRSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Fram
}
// se trovato e modalità shading o hiddenline, la favorisco perchè davanti alle possibili successive
if ( bFound && ! ( bAlpha || m_nShowMode == SM_WIREFRAME))
if ( bFound && ! ( bAlpha || m_nShowMode == SM_WIREFRAME) && dMinSqDist < SRF_SMALL_SQDIST)
dMinSqDist = 0 ;
return bFound ;
@@ -999,29 +1002,18 @@ Scene::FindVolZmapSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Fra
// con wireframe devo provare tutti i triangoli intersecati, con shading e hiddenline solo il primo
int nTtot = (( bAlpha || m_nShowMode == SM_WIREFRAME) ? int( vInfo.size()) : 1) ;
for ( int i = 0 ; i < nTtot ; ++ i) {
// punto di intersezione
Point3d ptInt = vInfo[i].ptI ;
// triangolo
Triangle3d& trTria = vInfo[i].trTria ;
// punto finale più vicino
Point3d ptEnd = trTria.GetP( 0) ;
if ( SqDist( trTria.GetP( 1), ptInt) < SqDist( ptEnd, ptInt))
ptEnd = trTria.GetP( 1) ;
if ( SqDist( trTria.GetP( 2), ptInt) < SqDist( ptEnd, ptInt))
ptEnd = trTria.GetP( 2) ;
Vector3d vtN = trTria.GetN() ;
// il punto di confronto è quello sulla linea di mira a minima distanza dal vertice
Point3d ptCfr = ptRef + (( ptEnd - ptRef) * vtDir) * vtDir ;
// determino la distanza e la confronto con il minimo
double dSqDist = SqDist( ptEnd, ptCfr) ;
if ( dSqDist < dMinSqDist) {
// recupero il vertice del triangolo più vicino alla linea di mira
int nVert ; double dSqDist ;
if ( GetTriaVertexNearestToLine( trTria, ptRef, vtDir, nVert, dSqDist) && dSqDist < dMinSqDist) {
bFound = true ;
dMinSqDist = dSqDist ;
m_nLastSnapId = nId ;
m_ptLastSnapPnt = ptEnd ;
m_ptLastSnapPnt = trTria.GetP( nVert) ;
m_ptLastSnapPnt.ToGlob( frEnt) ;
m_bLastSnapDirOk = true ;
m_vtLastSnapDir = vtN ;
m_vtLastSnapDir = trTria.GetN() ;
m_vtLastSnapDir.ToGlob( frEnt) ;
}
}
@@ -1032,31 +1024,18 @@ Scene::FindVolZmapSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Fra
// con wireframe devo provare tutti i triangoli intersecati, con shading e hiddenline solo il primo
int nTtot = (( bAlpha || m_nShowMode == SM_WIREFRAME) ? int( vInfo.size()) : 1) ;
for ( int i = 0 ; i < nTtot ; ++ i) {
// punto di intersezione
Point3d ptInt = vInfo[i].ptI ;
// triangolo
Triangle3d& trTria = vInfo[i].trTria ;
// punto medio più vicino
Point3d ptMid = Media( trTria.GetP( 0), trTria.GetP( 1)) ;
Point3d ptMid2 = Media( trTria.GetP( 1), trTria.GetP( 2)) ;
if ( SqDist( ptMid2, ptInt) < SqDist( ptMid, ptInt))
ptMid = ptMid2 ;
Point3d ptMid3 = Media( trTria.GetP( 2), trTria.GetP( 0)) ;
if ( SqDist( ptMid3, ptInt) < SqDist( ptMid, ptInt))
ptMid = ptMid3 ;
Vector3d vtN = trTria.GetN() ;
// il punto di confronto è quello sulla linea di mira a minima distanza dal punto medio
Point3d ptCfr = ptRef + (( ptMid - ptRef) * vtDir) * vtDir ;
// determino la distanza e la confronto con il minimo
double dSqDist = SqDist( ptMid, ptCfr) ;
if ( dSqDist < dMinSqDist) {
// recupero il punto medio del lato del triangolo più vicino alla linea di mira
Point3d ptMid ; double dSqDist ;
if ( GetTriaMidEdgeNearestToLine( trTria, ptRef, vtDir, ptMid, dSqDist) && dSqDist < dMinSqDist) {
bFound = true ;
dMinSqDist = dSqDist ;
m_nLastSnapId = nId ;
m_ptLastSnapPnt = ptMid ;
m_ptLastSnapPnt.ToGlob( frEnt) ;
m_bLastSnapDirOk = true ;
m_vtLastSnapDir = vtN ;
m_vtLastSnapDir = trTria.GetN() ;
m_vtLastSnapDir.ToGlob( frEnt) ;
}
}
@@ -1071,7 +1050,6 @@ Scene::FindVolZmapSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Fra
Triangle3d& trTria = vInfo[i].trTria ;
// centro più vicino
Point3d ptCen = trTria.GetCentroid() ;
Vector3d vtN = trTria.GetN() ;
// il punto di confronto è quello sulla linea di mira a minima distanza dal centro
Point3d ptCfr = ptRef + (( ptCen - ptRef) * vtDir) * vtDir ;
// determino la distanza e la confronto con il minimo
@@ -1083,7 +1061,7 @@ Scene::FindVolZmapSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Fra
m_ptLastSnapPnt = ptCen ;
m_ptLastSnapPnt.ToGlob( frEnt) ;
m_bLastSnapDirOk = true ;
m_vtLastSnapDir = vtN ;
m_vtLastSnapDir = trTria.GetN() ;
m_vtLastSnapDir.ToGlob( frEnt) ;
}
}
@@ -1115,7 +1093,7 @@ Scene::FindVolZmapSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Fra
}
// se trovato e modalità shading o hiddenline, la favorisco perchè davanti alle possibili successive
if ( bFound && ! ( bAlpha || m_nShowMode == SM_WIREFRAME))
if ( bFound && ! ( bAlpha || m_nShowMode == SM_WIREFRAME) && dMinSqDist < SRF_SMALL_SQDIST)
dMinSqDist = 0 ;
return bFound ;