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
|
#include <IntAna2d_Conic.ixx>
IntAna2d_Conic::IntAna2d_Conic (const gp_Lin2d& L) {
a = 0.0;
b = 0.0;
c = 0.0;
L.Coefficients(d,e,f);
f = 2*f;
}
IntAna2d_Conic::IntAna2d_Conic (const gp_Circ2d& C) {
C.Coefficients(a,b,c,d,e,f);
}
IntAna2d_Conic::IntAna2d_Conic (const gp_Elips2d& E) {
E.Coefficients(a,b,c,d,e,f);
}
IntAna2d_Conic::IntAna2d_Conic (const gp_Parab2d& P) {
P.Coefficients(a,b,c,d,e,f);
}
IntAna2d_Conic::IntAna2d_Conic (const gp_Hypr2d& H) {
H.Coefficients(a,b,c,d,e,f);
}
void IntAna2d_Conic::NewCoefficients(Standard_Real& A,Standard_Real& B,Standard_Real& C
,Standard_Real& D,Standard_Real& E,Standard_Real& F
,const gp_Ax2d& Dir1) const {
Standard_Real t11,t12,t13; // x = t11 X + t12 Y + t13
Standard_Real t21,t22,t23; // y = t21 X + t22 Y + t23
Standard_Real A1,B1,C1,D1,E1,F1;
// P0(x,y)=A x x + B y y + ... + F =0 (x,y "absolute" coordinates)
// and P1(X(x,y),Y(x,y))=P0(x,y)
// with P1(X,Y)= A1 X X + B1 Y Y + 2 C1 X Y + 2 D1 X + 2 E1 Y + F1
// = A x x + B y y + 2 C x y + 2 D x + 2 E y + f
Dir1.Direction().Coord(t11,t21);
Dir1.Location().Coord(t13,t23);
t22=t11;
t12=-t21;
A1=(t11*(A*t11 + 2*C*t21) + B*t21*t21);
B1=(t12*(A*t12 + 2*C*t22) + B*t22*t22);
C1=(t12*(A*t11 + C*t21) + t22*(C*t11 + B*t21));
D1=(t11*(D + A*t13) + t21*(E + C*t13) + t23*(C*t11 + B*t21));
E1=(t12*(D + A*t13) + t22*(E + C*t13) + t23*(C*t12 + B*t22));
F1=F + t13*(2.0*D + A*t13) + t23*(2.0*E + 2.0*C*t13 + B*t23);
A=A1; B=B1; C=C1; D=D1; E=E1; F=F1;
}
Standard_Real IntAna2d_Conic::Value (const Standard_Real X, const Standard_Real Y) const {
Standard_Real _a,_b,_c,_d,_e,_f;
this->Coefficients(_a,_b,_c,_d,_e,_f);
return (_a*X*X + _b*Y*Y + 2.*_c*X*Y + 2.*_d*X + 2.*_e*Y +_f);
}
gp_XY IntAna2d_Conic::Grad (const Standard_Real X, const Standard_Real Y) const {
Standard_Real _a,_b,_c,_d,_e,_f;
this->Coefficients(_a,_b,_c,_d,_e,_f);
return gp_XY(2.*_a*X + 2.*_c*Y + 2.*_d, 2.*_b*Y + 2.*_c*X + 2.*_e);
}
void IntAna2d_Conic::ValAndGrad (const Standard_Real X, const Standard_Real Y,
Standard_Real& Val, gp_XY& Grd) const {
Standard_Real la,lb,lc,ld,le,lf;
this->Coefficients(la,lb,lc,ld,le,lf);
Grd.SetCoord(2.*la*X + 2.*lc*Y + 2.*ld, 2.*lb*Y + 2.*lc*X + 2.*le);
Val = la*X*X + lb*Y*Y + 2.*lc*X*Y + 2.*ld*X + 2.*le*Y +lf;
}
void IntAna2d_Conic::Coefficients(Standard_Real& A,Standard_Real& B,Standard_Real& C,
Standard_Real& D,Standard_Real& E,Standard_Real& F) const
{
A=a; B=b; C=c; D=d; E=e; F=f;
}
|