diff --git a/SurfTriMesh.cpp b/SurfTriMesh.cpp index 16f22f2..4402b1e 100644 --- a/SurfTriMesh.cpp +++ b/SurfTriMesh.cpp @@ -852,6 +852,9 @@ SurfTriMesh::GetTempInt( int nTriaId, int& nTempInt) const bool SurfTriMesh::GetTriangleSmoothNormal( int nT, int nV, Vector3d& vtN) const { + // flag di pesatura con angolo al vertice + bool bAngWeighted = true ; + // recupero tutti i triangoli attorno al vertice bool bCirc ; INTVECTOR vT ; @@ -871,14 +874,21 @@ SurfTriMesh::GetTriangleSmoothNormal( int nT, int nV, Vector3d& vtN) const return false ; // medio le normali, finchè non incontro degli spigoli - vtN = m_vTria[nT].vtN ; + double dAngW = 1 ; + if ( bAngWeighted) + GetTriangleVertexAngle( nT, nV, dAngW) ; + vtN = dAngW * m_vTria[nT].vtN ; // parto dal triangolo e vado in direzione positiva int nLim = nPos ; for ( int i = NextIndAroundVertex( nPos, nTria, bCirc) ; i != nPos && i < int( vT.size()) ; i = NextIndAroundVertex( i, nTria, bCirc)) { - if ( m_vTria[vT[nPos]].vtN * m_vTria[vT[i]].vtN >= m_dCosSmAng) - vtN += m_vTria[vT[i]].vtN ; + if ( m_vTria[nT].vtN * m_vTria[vT[i]].vtN >= m_dCosSmAng) { + int nK ; double dAngW = 1 ; + if ( bAngWeighted && FindVertexInTria( m_vTria[nT].nIdVert[nV], vT[i], nK)) + GetTriangleVertexAngle( vT[i], nK, dAngW) ; + vtN += dAngW * m_vTria[vT[i]].vtN ; + } else break ; nLim = i ; @@ -887,8 +897,12 @@ SurfTriMesh::GetTriangleSmoothNormal( int nT, int nV, Vector3d& vtN) const for ( int i = PrevIndAroundVertex( nPos, nTria, bCirc) ; i != nLim && i >= 0 ; i = PrevIndAroundVertex( i, nTria, bCirc)) { - if ( m_vTria[vT[nPos]].vtN * m_vTria[vT[i]].vtN >= m_dCosSmAng) - vtN += m_vTria[vT[i]].vtN ; + if ( m_vTria[nT].vtN * m_vTria[vT[i]].vtN >= m_dCosSmAng) { + int nK ; double dAngW = 1 ; + if ( bAngWeighted && FindVertexInTria( m_vTria[nT].nIdVert[nV], vT[i], nK)) + GetTriangleVertexAngle( vT[i], nK, dAngW) ; + vtN += dAngW * m_vTria[vT[i]].vtN ; + } else break ; } @@ -897,6 +911,23 @@ SurfTriMesh::GetTriangleSmoothNormal( int nT, int nV, Vector3d& vtN) const return true ; } +//---------------------------------------------------------------------------- +bool +SurfTriMesh::GetTriangleVertexAngle( int nT, int nV, double& dAng) const +{ + // verifico esistenza del triangolo e validità vertice + if ( nT < 0 || nT >= GetTriangleSize() || m_vTria[nT].nIdVert[0] == SVT_DEL || nV < 0 || nV > 2) + return false ; + // determino i vettori dei due lati che partono dal vertice + Point3d ptVert = m_vVert[ m_vTria[nT].nIdVert[nV]].ptP ; + Point3d ptPrev = m_vVert[ m_vTria[nT].nIdVert[Prev( nV)]].ptP ; + Point3d ptNext = m_vVert[ m_vTria[nT].nIdVert[Next( nV)]].ptP ; + Vector3d vtPrev = ptPrev - ptVert ; + Vector3d vtNext = ptNext - ptVert ; + // determino l'angolo tra i due lati + return vtPrev.GetAngle( vtNext, dAng) ; +} + //---------------------------------------------------------------------------- SurfTriMesh* SurfTriMesh::CloneTriangle( int nT) const diff --git a/SurfTriMesh.h b/SurfTriMesh.h index 49b92a7..3ab9637 100644 --- a/SurfTriMesh.h +++ b/SurfTriMesh.h @@ -414,6 +414,7 @@ class SurfTriMesh : public ISurfTriMesh, public IGeoObjRW int NextIndAroundVertex( int nInd, int nSize, bool bCirc) const ; int PrevIndAroundVertex( int nInd, int nSize, bool bCirc) const ; bool GetTriangleSmoothNormal( int nT, int nV, Vector3d& vtN) const ; + bool GetTriangleVertexAngle( int nT, int nV, double& dAng) const ; bool MarchAlongLoop( int nT, int nV, int nTimeStamp, PolyLine& PL) const ; bool MarchOneTria( int& nT, int& nV, int nTimeStamp, PolyLine& PL, bool& bEnd) const ; bool VerifyPolylinesForTwoCurves( const PolyLine& PL1, const PolyLine& PL2) const ; diff --git a/VolZmapVolume.cpp b/VolZmapVolume.cpp index bd28b54..2fa726a 100644 --- a/VolZmapVolume.cpp +++ b/VolZmapVolume.cpp @@ -1697,6 +1697,9 @@ VolZmap::Comp_5AxisMilling( int nGrid, const Point3d& ptS, const Point3d& ptE, c PtrOwner cBezTipEndF1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTipEndF1, nDegU, bRat))); PtrOwner cBezTipStartF2(GetBasicCurveBezier(ArcToBezierCurve(&cArcTipStartF2, nDegU, bRat))); PtrOwner cBezTipEndF2(GetBasicCurveBezier(ArcToBezierCurve(&cArcTipEndF2, nDegU, bRat))); + // !!!! DA SISTEMARE !!!! + if ( IsNull( cBezTipStartF1) || IsNull( cBezTipEndF1) || IsNull( cBezTipStartF2) || IsNull( cBezTipEndF2)) + return true ; // archi inferiori back CurveArc cArcTipStartB1, cArcTipEndB1, cArcTipStartB2, cArcTipEndB2; cArcTipStartB1.SetC2PN(ptP1T, vPntTipStartBack[0], vPntTipStartBack[1], vtLs); @@ -1707,6 +1710,9 @@ VolZmap::Comp_5AxisMilling( int nGrid, const Point3d& ptS, const Point3d& ptE, c PtrOwner cBezTipEndB1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTipEndB1, nDegU, bRat))); PtrOwner cBezTipStartB2(GetBasicCurveBezier(ArcToBezierCurve(&cArcTipStartB2, nDegU, bRat))); PtrOwner cBezTipEndB2(GetBasicCurveBezier(ArcToBezierCurve(&cArcTipEndB2, nDegU, bRat))); + // !!!! DA SISTEMARE !!!! + if ( IsNull( cBezTipStartB1) || IsNull( cBezTipEndB1) || IsNull( cBezTipStartB2) || IsNull( cBezTipEndB2)) + return true ; // archi superiori front CurveArc cArcTopStartF1, cArcTopEndF1, cArcTopStartF2, cArcTopEndF2; cArcTopStartF1.SetC2PN(ptS, vPntTopStartFront[0], vPntTopStartFront[1], vtLs); @@ -1717,6 +1723,9 @@ VolZmap::Comp_5AxisMilling( int nGrid, const Point3d& ptS, const Point3d& ptE, c PtrOwner cBezTopEndF1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopEndF1, nDegU, bRat))); PtrOwner cBezTopStartF2(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopStartF2, nDegU, bRat))); PtrOwner cBezTopEndF2(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopEndF2, nDegU, bRat))); + // !!!! DA SISTEMARE !!!! + if ( IsNull( cBezTopStartF1) || IsNull( cBezTopEndF1) || IsNull( cBezTopStartF2) || IsNull( cBezTopEndF2)) + return true ; // archi superiori back CurveArc cArcTopStartB1, cArcTopEndB1, cArcTopStartB2, cArcTopEndB2; cArcTopStartB1.SetC2PN(ptS, vPntTopStartBack[0], vPntTopStartBack[1], vtLs); @@ -1727,6 +1736,9 @@ VolZmap::Comp_5AxisMilling( int nGrid, const Point3d& ptS, const Point3d& ptE, c PtrOwner cBezTopEndB1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopEndB1, nDegU, bRat))); PtrOwner cBezTopStartB2(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopStartB2, nDegU, bRat))); PtrOwner cBezTopEndB2(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopEndB2, nDegU, bRat))); + // !!!! DA SISTEMARE !!!! + if ( IsNull( cBezTopStartB1) || IsNull( cBezTopEndB1) || IsNull( cBezTopStartB2) || IsNull( cBezTopEndB2)) + return true ; if ( n5AxisType == Move5Axis::NO_BASE_INTERS || n5AxisType == Move5Axis::ACROSS) { // inferiori