static
gp_Ax2 DirToAx2(const gp_Pnt& P,const gp_Dir& D);
+static
+ void RefineDir(gp_Dir& aDir);
//=======================================================================
//class :
gp_Dir V2=Axe2.Direction();
gp_Pnt P1=Axe1.Location();
gp_Pnt P2=Axe2.Location();
-
+ //
+ RefineDir(V1);
+ RefineDir(V2);
thecoplanar= Standard_False;
thenormal = Standard_False;
Standard_Real denom2 = denom*denom;
Standard_Real ddenom = 1. - denom2;
- denom = ( Abs(ddenom) <= 1.e-9 ) ? 1.e-9 : ddenom;
+ //denom = ( Abs(ddenom) <= 1.e-9 ) ? 1.e-9 : ddenom;
+ denom = ( Abs(ddenom) <= 1.e-16 ) ? 1.e-16 : ddenom;
Standard_Real par1 = dist1/denom;
Standard_Real par2 = -dist2/denom;
IntAna_QuadQuadGeo::IntAna_QuadQuadGeo( const gp_Pln& P
,const gp_Cylinder& Cl
,const Standard_Real Tolang
- ,const Standard_Real Tol)
+ ,const Standard_Real Tol
+ ,const Standard_Real H)
: done(Standard_False),
nbint(0),
typeres(IntAna_Empty),
myPChar(0,0,0)
{
InitTolerances();
- Perform(P,Cl,Tolang,Tol);
+ Perform(P,Cl,Tolang,Tol,H);
}
//=======================================================================
//function : Perform
//purpose :
//=======================================================================
void IntAna_QuadQuadGeo::Perform( const gp_Pln& P
- ,const gp_Cylinder& Cl
- ,const Standard_Real Tolang
- ,const Standard_Real Tol)
+ ,const gp_Cylinder& Cl
+ ,const Standard_Real Tolang
+ ,const Standard_Real Tol
+ ,const Standard_Real H)
{
done = Standard_False;
Standard_Real dist,radius;
}
nbint = 0;
- IntAna_IntConicQuad inter(axec,P,tolang);
+ IntAna_IntConicQuad inter(axec,P,tolang,Tol,H);
if (inter.IsParallel()) {
// Le resultat de l intersection Plan-Cylindre est de type droite.
param1bis = radius;
}
}
- if(typeres == IntAna_Ellipse) {
- if( param1>100000.0*param1bis
- || param1bis>100000.0*param1) {
- done = Standard_False;
- return;
- }
- }
+
done = Standard_True;
}
//=======================================================================
Standard_Real DistA1A2=A1A2.Distance();
gp_Dir DA1=Con1.Position().Direction();
gp_Vec O1O2(Con1.Apex(),Con2.Apex());
- Standard_Real O1O2_DA1=gp_Vec(DA1).Dot(O1O2);
-
- gp_Vec O1_Proj_A2(O1O2.X()-O1O2_DA1*DA1.X(),
- O1O2.Y()-O1O2_DA1*DA1.Y(),
- O1O2.Z()-O1O2_DA1*DA1.Z());
+ gp_Dir O1O2n(O1O2); // normalization of the vector before projection
+ Standard_Real O1O2_DA1=gp_Vec(DA1).Dot(gp_Vec(O1O2n));
+
+ gp_Vec O1_Proj_A2(O1O2n.X()-O1O2_DA1*DA1.X(),
+ O1O2n.Y()-O1O2_DA1*DA1.Y(),
+ O1O2n.Z()-O1O2_DA1*DA1.Z());
gp_Dir DB1=gp_Dir(O1_Proj_A2);
-
+
Standard_Real yO1O2=O1O2.Dot(gp_Vec(DA1));
Standard_Real ABSTG1 = Abs(tg1);
Standard_Real X2 = (DistA1A2/ABSTG1 - yO1O2)*0.5;
const gp_Cone& Con,
const Standard_Real)
{
+
+ //
done=Standard_True;
+ //
AxeOperator A1A2(Con.Axis(),Sph.Position().Axis());
gp_Pnt Pt=Sph.Location();
+ //
if((A1A2.Intersect() && (Pt.Distance(A1A2.PtIntersect())==0.0))
|| A1A2.Same()) {
gp_Pnt ConApex= Con.Apex();
{
return myPChar;
}
-
+//=======================================================================
+//function : RefineDir
+//purpose :
+//=======================================================================
+void RefineDir(gp_Dir& aDir)
+{
+ Standard_Integer k, m, n;
+ Standard_Real aC[3];
+ //
+ aDir.Coord(aC[0], aC[1], aC[2]);
+ //
+ m=0;
+ n=0;
+ for (k=0; k<3; ++k) {
+ if (aC[k]==1. || aC[k]==-1.) {
+ ++m;
+ }
+ else if (aC[k]!=0.) {
+ ++n;
+ }
+ }
+ //
+ if (m && n) {
+ Standard_Real aEps, aR1, aR2, aNum;
+ //
+ aEps=RealEpsilon();
+ aR1=1.-aEps;
+ aR2=1.+aEps;
+ //
+ for (k=0; k<3; ++k) {
+ m=(aC[k]>0.);
+ aNum=(m)? aC[k] : -aC[k];
+ if (aNum>aR1 && aNum<aR2) {
+ if (m) {
+ aC[k]=1.;
+ }
+ else {
+ aC[k]=-1.;
+ }
+ //
+ aC[(k+1)%3]=0.;
+ aC[(k+2)%3]=0.;
+ break;
+ }
+ }
+ aDir.SetCoord(aC[0], aC[1], aC[2]);
+ }
+}