EgtGeomKernel :
- nelle TriMesh calcolo normali di vertici con peso da angoli - in Zmap pezza per movimenti 5assi sul tip (da correggere veramente).
This commit is contained in:
+36
-5
@@ -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
|
||||
|
||||
@@ -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 ;
|
||||
|
||||
@@ -1697,6 +1697,9 @@ VolZmap::Comp_5AxisMilling( int nGrid, const Point3d& ptS, const Point3d& ptE, c
|
||||
PtrOwner<CurveBezier> cBezTipEndF1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTipEndF1, nDegU, bRat)));
|
||||
PtrOwner<CurveBezier> cBezTipStartF2(GetBasicCurveBezier(ArcToBezierCurve(&cArcTipStartF2, nDegU, bRat)));
|
||||
PtrOwner<CurveBezier> 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<CurveBezier> cBezTipEndB1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTipEndB1, nDegU, bRat)));
|
||||
PtrOwner<CurveBezier> cBezTipStartB2(GetBasicCurveBezier(ArcToBezierCurve(&cArcTipStartB2, nDegU, bRat)));
|
||||
PtrOwner<CurveBezier> 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<CurveBezier> cBezTopEndF1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopEndF1, nDegU, bRat)));
|
||||
PtrOwner<CurveBezier> cBezTopStartF2(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopStartF2, nDegU, bRat)));
|
||||
PtrOwner<CurveBezier> 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<CurveBezier> cBezTopEndB1(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopEndB1, nDegU, bRat)));
|
||||
PtrOwner<CurveBezier> cBezTopStartB2(GetBasicCurveBezier(ArcToBezierCurve(&cArcTopStartB2, nDegU, bRat)));
|
||||
PtrOwner<CurveBezier> 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
|
||||
|
||||
Reference in New Issue
Block a user