diff --git a/EgtGraphics.rc b/EgtGraphics.rc index 9293092..7a75508 100644 Binary files a/EgtGraphics.rc and b/EgtGraphics.rc differ diff --git a/SceneSnap.cpp b/SceneSnap.cpp index 55310e3..7aca017 100644 --- a/SceneSnap.cpp +++ b/SceneSnap.cpp @@ -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 ;