summaryrefslogtreecommitdiff
path: root/src/IntAna2d/IntAna2d_AnaIntersection_8.cxx
blob: 31367e8e49b844aa9fbbf95e2af60079d62411fb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
//============================================ IntAna2d_AnaIntersection_8.cxx
//============================================================================
#include <IntAna2d_AnaIntersection.jxx>

#include <IntAna2d_Outils.hxx>

      // -----------------------------------------------------------------
      // ------ Verification de la validite des points obtenus  ----------
      // --- Methode a implementer dans les autres routines si on constate
      // --- des problemes d'instabilite numerique sur
      // ---      * la construction des polynomes en t (t:parametre)
      // ---      * la resolution du polynome
      // ---      * le retour : parametre t -> point d'intersection
      // --- Probleme : A partir de quelle Tolerance un point n'est
      // ---            plus un point de la courbe. (f(x,y)=1e-10 ??)
      // ---            ne donne pas d'info. sur la dist. du pt a la courbe
      // -----------------------------------------------------------------
      // ------ Methode non implementee pour les autres Intersections
      // --- Si un probleme est constate : Dupliquer le code entre les
      // --- commentaires VERIF-VALID
      // -----------------------------------------------------------------

void IntAna2d_AnaIntersection::Perform(const gp_Hypr2d& H,
				       const IntAna2d_Conic& Conic)
  {
    Standard_Boolean HIsDirect = H.IsDirect();
    Standard_Real A,B,C,D,E,F;
    Standard_Real px0,px1,px2,px3,px4;
    Standard_Real minor_radius=H.MinorRadius();
    Standard_Real major_radius=H.MajorRadius();
    Standard_Integer i;
    Standard_Real tx,ty,S;

    done = Standard_False;
    nbp = 0;
    para = Standard_False;
    iden = Standard_False;
    empt = Standard_False;

    gp_Ax2d Axe_rep(H.XAxis());
    Conic.Coefficients(A,B,C,D,E,F);
    Conic.NewCoefficients(A,B,C,D,E,F,Axe_rep);
  
    Standard_Real A_major_radiusP2=A*major_radius*major_radius;
    Standard_Real B_minor_radiusP2=B*minor_radius*minor_radius;
    Standard_Real C_2_major_minor_radius=C*2.0*major_radius*minor_radius;

    // Parametre : t avec x=MajorRadius*Ch(t)  y=:minorRadius*Sh(t)
    // Le polynome est reecrit en Exp(t)
    // Suivent les Coeffs du polynome P multiplie par 4*Exp(t)^2

    px0=A_major_radiusP2 - C_2_major_minor_radius + B_minor_radiusP2;
    px1=4.0*(D*major_radius-E*minor_radius);
    px2=2.0*(A_major_radiusP2 + 2.0*F - B_minor_radiusP2);
    px3=4.0*(D*major_radius+E*minor_radius);
    px4=A_major_radiusP2 + C_2_major_minor_radius + B_minor_radiusP2;

    MyDirectPolynomialRoots Sol(px4,px3,px2,px1,px0);

    if(!Sol.IsDone()) {
      //-- cout<<" Done = False ds IntAna2d_AnaIntersection_8.cxx "<<endl;
      done=Standard_False;
      return;
    }
    else { 
      if(Sol.InfiniteRoots()) { 
	iden=Standard_True;
	done=Standard_True;
	return;
      }
      // On a X=(CosH(t)*major_radius)/2 , Y=(SinH(t)*minor_radius)/2
      //      la Resolution est en S=Exp(t)
      nbp=Sol.NbSolutions();
      Standard_Integer nb_sol_valides=0;
      for(i=1;i<=nbp;i++) {
	S=Sol.Value(i);
	if(S>RealEpsilon()) {
	  tx=0.5*major_radius*(S+1/S);	
	  ty=0.5*minor_radius*(S-1/S);

          //--- Est-on sur la bonne branche de l'Hyperbole
          //--------------- VERIF-VALIDITE-INTERSECTION ----------
	  //--- On Suppose que l'ecart sur la courbe1 est nul
          //--- (le point a ete obtenu par parametrage)
          //--- ??? la tolerance a ete fixee a 1e-10 ?????????????

#if 0 
          Standard_Real ecart_sur_courbe2;
          ecart_sur_courbe2=Conic.Value(tx,ty);
          if(ecart_sur_courbe2<=1e-10 && ecart_sur_courbe2>=-1e-10) {
	    nb_sol_valides++;
	    Coord_Ancien_Repere(tx,ty,Axe_rep);
	    lpnt[nb_sol_valides-1].SetValue(tx,ty,Log(S));
          }
#else 
	
	  nb_sol_valides++;
	  Coord_Ancien_Repere(tx,ty,Axe_rep);
	  S = Log(S);
	  if(!HIsDirect)
	    S = -S;
	  lpnt[nb_sol_valides-1].SetValue(tx,ty,S);
#endif
        }   
      }
      nbp=nb_sol_valides;
      Traitement_Points_Confondus(nbp,lpnt);
    }
    done=Standard_True;
  }