diff --git a/SceneSelect.cpp b/SceneSelect.cpp index 5831b3e..6ae18cb 100644 --- a/SceneSelect.cpp +++ b/SceneSelect.cpp @@ -361,7 +361,27 @@ Scene::GetPointFromSelect( int nSelId, const Point3d& ptView, Point3d& ptSel, in double dLenMir = 4 * dBlRad ; // cerco i triangoli intersecati dalla linea di mira ILSIVECTOR vInfo ; - if ( ! IntersLineSurfTm( ptMir, vtDir, dLenMir, *pStm, vInfo) || vInfo.size() == 0) + if ( ! IntersLineSurfTm( ptMir, vtDir, dLenMir, *pStm, vInfo)) + return false ; + // se non trovato alcunchè, cerco le linee che partono dagli angoli e dai punti medi dei lati del rettangolo di mira + VCT3DVECTOR vVtWind = { {0.51, 0.51, 0}, {0, 0.51, 0}, {-0.51, 0.51, 0}, {-0.51, 0, 0}, + {-0.51, -0.51, 0}, {0, -0.51, 0}, {0.51, -0.51, 0}, {0.51, 0, 0}, + {0.25, 0.51, 0}, {-0.25, 0.51, 0}, {-0.51, 0.25, 0}, {-0.51, -0.25, 0}, + {-0.25, -0.51, 0}, {0.25, -0.51, 0}, {0.51, -0.25, 0}, {0.51, 0.25, 0}} ; + for ( int i = 0 ; i < int( vVtWind.size()) && vInfo.empty() ; ++ i) { + // determino punto su vertice del rettangolo di selezione + Point3d ptWinZ2 = ptWinZ + vVtWind[i].x * m_nSelH * X_AX + vVtWind[i].y * m_nSelW * Y_AX ; + // ne ricavo punto di mira + Point3d ptMir2 ; + if ( ! UnProject( ptWinZ2, ptMir2)) + return false ; + ptMir2.ToLoc( frEnt) ; + ptMir2 -= vtDir * 2 * dBlRad ; + // interseco con la superficie + if ( ! IntersLineSurfTm( ptMir2, vtDir, dLenMir, *pStm, vInfo)) + return false ; + } + if ( vInfo.empty()) return false ; // recupero il primo punto ptSel = GetToGlob( vInfo[0].ptI, frEnt) ; diff --git a/SceneSnap.cpp b/SceneSnap.cpp index d99b535..9728c3a 100644 --- a/SceneSnap.cpp +++ b/SceneSnap.cpp @@ -670,12 +670,14 @@ Scene::FindSurfTMSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Fram ILSIVECTOR vInfo ; if ( ! IntersLineSurfTm( ptMir, vtDir, dLenMir, *pStm, vInfo)) return false ; - // se non trovato alcunchè, cerco le linee che partono dagli angoli del rettangolo di mira - Vector3d vtWinD( -1, -1, 0) ; - for ( int i = 0 ; i < 4 && vInfo.size() == 0 ; ++ i) { + // se non trovato alcunchè, cerco le linee che partono dagli angoli e dai punti medi dei lati del rettangolo di mira + VCT3DVECTOR vVtWind = { {0.51, 0.51, 0}, {0, 0.51, 0}, {-0.51, 0.51, 0}, {-0.51, 0, 0}, + {-0.51, -0.51, 0}, {0, -0.51, 0}, {0.51, -0.51, 0}, {0.51, 0, 0}, + {0.25, 0.51, 0}, {-0.25, 0.51, 0}, {-0.51, 0.25, 0}, {-0.51, -0.25, 0}, + {-0.25, -0.51, 0}, {0.25, -0.51, 0}, {0.51, -0.25, 0}, {0.51, 0.25, 0}} ; + for ( int i = 0 ; i < int( vVtWind.size()) && vInfo.empty() ; ++ i) { // determino punto su vertice del rettangolo di selezione - Point3d ptWinZ2 = ptWinZ + vtWinD.x * m_nSelH * X_AX + vtWinD.y * m_nSelW * Y_AX ; - vtWinD.Rotate( Z_AX, 0, 1) ; + Point3d ptWinZ2 = ptWinZ + vVtWind[i].x * m_nSelH * X_AX + vVtWind[i].y * m_nSelW * Y_AX ; // ne ricavo punto di mira Point3d ptMir2 ; if ( ! UnProject( ptWinZ2, ptMir2)) @@ -686,7 +688,7 @@ Scene::FindSurfTMSnapPoint( int nSnap, const Point3d& ptWin, int nId, const Fram if ( ! IntersLineSurfTm( ptMir2, vtDir, dLenMir, *pStm, vInfo)) return false ; } - if ( vInfo.size() == 0) + if ( vInfo.empty()) return false ; // elaborazione a seconda del tipo di snap