2 // Created: Mon Sep 9 11:19:10 1991
3 // Author: Michel Chauvat
5 // Modified by skv - Tue Sep 9 15:10:35 2003 OCC620
15 #include <gp_Trsf.hxx>
17 static Standard_Real PIPI = PI + PI;
19 gp_Pnt ElSLib::PlaneValue (const Standard_Real U,
20 const Standard_Real V,
23 const gp_XYZ& XDir = Pos.XDirection().XYZ();
24 const gp_XYZ& YDir = Pos.YDirection().XYZ();
25 const gp_XYZ& PLoc = Pos.Location ().XYZ();
26 return gp_Pnt(U * XDir.X() + V * YDir.X() + PLoc.X(),
27 U * XDir.Y() + V * YDir.Y() + PLoc.Y(),
28 U * XDir.Z() + V * YDir.Z() + PLoc.Z());
31 gp_Pnt ElSLib::ConeValue (const Standard_Real U,
32 const Standard_Real V,
34 const Standard_Real Radius,
35 const Standard_Real SAngle)
37 const gp_XYZ& XDir = Pos.XDirection().XYZ();
38 const gp_XYZ& YDir = Pos.YDirection().XYZ();
39 const gp_XYZ& ZDir = Pos.Direction ().XYZ();
40 const gp_XYZ& PLoc = Pos.Location ().XYZ();
41 Standard_Real R = Radius + V * sin(SAngle);
42 Standard_Real A3 = V * cos(SAngle);
43 Standard_Real A1 = R * cos(U);
44 Standard_Real A2 = R * sin(U);
45 return gp_Pnt(A1 * XDir.X() + A2 * YDir.X() + A3 * ZDir.X() + PLoc.X(),
46 A1 * XDir.Y() + A2 * YDir.Y() + A3 * ZDir.Y() + PLoc.Y(),
47 A1 * XDir.Z() + A2 * YDir.Z() + A3 * ZDir.Z() + PLoc.Z());
50 gp_Pnt ElSLib::CylinderValue (const Standard_Real U,
51 const Standard_Real V,
53 const Standard_Real Radius)
55 // M(u,v) = C + Radius * ( Xdir * Cos(u) + Ydir * Sin(u)) + V * Zdir
56 // where C is the location point of the Axis2placement
57 // Xdir, Ydir ,Zdir are the directions of the local coordinates system
59 const gp_XYZ& XDir = Pos.XDirection().XYZ();
60 const gp_XYZ& YDir = Pos.YDirection().XYZ();
61 const gp_XYZ& ZDir = Pos.Direction ().XYZ();
62 const gp_XYZ& PLoc = Pos.Location ().XYZ();
63 Standard_Real A1 = Radius * cos(U);
64 Standard_Real A2 = Radius * sin(U);
65 return gp_Pnt(A1 * XDir.X() + A2 * YDir.X() + V * ZDir.X() + PLoc.X(),
66 A1 * XDir.Y() + A2 * YDir.Y() + V * ZDir.Y() + PLoc.Y(),
67 A1 * XDir.Z() + A2 * YDir.Z() + V * ZDir.Z() + PLoc.Z());
70 gp_Pnt ElSLib::SphereValue (const Standard_Real U,
71 const Standard_Real V,
73 const Standard_Real Radius)
76 // R * CosV (CosU * XDirection + SinU * YDirection) +
77 // R * SinV * Direction
79 const gp_XYZ& XDir = Pos.XDirection().XYZ();
80 const gp_XYZ& YDir = Pos.YDirection().XYZ();
81 const gp_XYZ& ZDir = Pos.Direction ().XYZ();
82 const gp_XYZ& PLoc = Pos.Location ().XYZ();
83 Standard_Real R = Radius * cos(V);
84 Standard_Real A3 = Radius * sin(V);
85 Standard_Real A1 = R * cos(U);
86 Standard_Real A2 = R * sin(U);
87 return gp_Pnt(A1 * XDir.X() + A2 * YDir.X() + A3 * ZDir.X() + PLoc.X(),
88 A1 * XDir.Y() + A2 * YDir.Y() + A3 * ZDir.Y() + PLoc.Y(),
89 A1 * XDir.Z() + A2 * YDir.Z() + A3 * ZDir.Z() + PLoc.Z());
92 gp_Pnt ElSLib::TorusValue (const Standard_Real U,
93 const Standard_Real V,
95 const Standard_Real MajorRadius,
96 const Standard_Real MinorRadius)
100 // (MajRadius+MinRadius*Cos(V)) * (Cos(U)*XDirection + Sin(U)*YDirection) +
101 // MinorRadius * Sin(V) * Direction
103 const gp_XYZ& XDir = Pos.XDirection().XYZ();
104 const gp_XYZ& YDir = Pos.YDirection().XYZ();
105 const gp_XYZ& ZDir = Pos.Direction ().XYZ();
106 const gp_XYZ& PLoc = Pos.Location ().XYZ();
107 Standard_Real R = MajorRadius + MinorRadius * cos(V);
108 Standard_Real A3 = MinorRadius * sin(V);
109 Standard_Real A1 = R * cos(U);
110 Standard_Real A2 = R * sin(U);
111 // Modified by skv - Tue Sep 9 15:10:34 2003 OCC620 Begin
112 Standard_Real eps = 10.*(MinorRadius + MajorRadius)*RealEpsilon();
123 // Modified by skv - Tue Sep 9 15:10:35 2003 OCC620 End
124 return gp_Pnt(A1 * XDir.X() + A2 * YDir.X() + A3 * ZDir.X() + PLoc.X(),
125 A1 * XDir.Y() + A2 * YDir.Y() + A3 * ZDir.Y() + PLoc.Y(),
126 A1 * XDir.Z() + A2 * YDir.Z() + A3 * ZDir.Z() + PLoc.Z());
129 gp_Vec ElSLib::PlaneDN (const Standard_Real,
132 const Standard_Integer Nu,
133 const Standard_Integer Nv)
135 if (Nu == 0 && Nv == 1) { return gp_Vec (Pos.YDirection()); }
136 else if (Nu == 1 && Nv == 0) { return gp_Vec (Pos.XDirection()); }
137 return gp_Vec (0., 0., 0.);
140 gp_Vec ElSLib::ConeDN (const Standard_Real U,
141 const Standard_Real V,
143 const Standard_Real Radius,
144 const Standard_Real SAngle,
145 const Standard_Integer Nu,
146 const Standard_Integer Nv)
148 gp_XYZ Xdir = Pos.XDirection().XYZ();
149 gp_XYZ Ydir = Pos.YDirection().XYZ();
150 Standard_Real Um = U + Nu * M_PI_2; // PI * 0.5
151 Xdir.Multiply(cos(Um));
152 Ydir.Multiply(sin(Um));
155 Xdir.Multiply(Radius + V * sin(SAngle));
156 if(Nu == 0) Xdir.Add(Pos.Location().XYZ());
160 Xdir.Multiply(sin(SAngle));
163 return gp_Vec(0.0,0.0,0.0);
166 gp_Vec ElSLib::CylinderDN (const Standard_Real U,
169 const Standard_Real Radius,
170 const Standard_Integer Nu,
171 const Standard_Integer Nv)
173 if (Nu + Nv < 1 || Nu < 0 || Nv < 0) { return gp_Vec(); }
175 Standard_Real RCosU = Radius * cos(U);
176 Standard_Real RSinU = Radius * sin(U);
177 gp_XYZ Xdir = Pos.XDirection().XYZ();
178 gp_XYZ Ydir = Pos.YDirection().XYZ();
179 if ((Nu + 6) % 4 == 0) {
180 Xdir.Multiply (-RCosU);
181 Ydir.Multiply (-RSinU);
183 else if ((Nu + 5) % 4 == 0) {
184 Xdir.Multiply ( RSinU);
185 Ydir.Multiply (-RCosU);
187 else if ((Nu + 3) % 4 == 0) {
188 Xdir.Multiply (-RSinU);
189 Ydir.Multiply ( RCosU);
191 else if (Nu % 4 == 0) {
192 Xdir.Multiply ( RCosU);
193 Ydir.Multiply ( RSinU);
196 return gp_Vec (Xdir);
198 else if (Nv == 1 && Nu == 0) { return gp_Vec (Pos.Direction()); }
199 else { return gp_Vec (0.0, 0.0, 0.0); }
202 gp_Vec ElSLib::SphereDN (const Standard_Real U,
203 const Standard_Real V,
205 const Standard_Real Radius,
206 const Standard_Integer Nu,
207 const Standard_Integer Nv)
209 if (Nu + Nv < 1 || Nu < 0 || Nv < 0) { return gp_Vec(); }
210 Standard_Real CosU = cos(U);
211 Standard_Real SinU = sin(U);
212 Standard_Real RCosV = Radius * cos(V);
213 const gp_XYZ& XDir = Pos.XDirection().XYZ();
214 const gp_XYZ& YDir = Pos.YDirection().XYZ();
215 const gp_XYZ& ZDir = Pos.Direction ().XYZ();
216 Standard_Real A1,A2,A3,X,Y,Z;
218 Standard_Real RSinV = Radius * sin(V);
219 if (IsOdd (Nv)) { A1 = - RSinV * CosU; A2 = - RSinV * SinU; A3 = RCosV; }
220 else { A1 = - RCosV * CosU; A2 = - RCosV * SinU; A3 = - RSinV; }
221 X = A1 * XDir.X() + A2 * YDir.X() + A3 * ZDir.X();
222 Y = A1 * XDir.Y() + A2 * YDir.Y() + A3 * ZDir.Y();
223 Z = A1 * XDir.Z() + A2 * YDir.Z() + A3 * ZDir.Z();
224 if (!( (Nv + 2) % 4 == 0 || (Nv + 3) % 4 == 0 ))
225 { X = - X; Y = - Y; Z = - Z; }
228 if (IsOdd (Nu)) { A1 = - RCosV * SinU; A2 = RCosV * CosU; }
229 else { A1 = RCosV * CosU; A2 = RCosV * SinU; }
230 X = A1 * XDir.X() + A2 * YDir.X();
231 Y = A1 * XDir.Y() + A2 * YDir.Y();
232 Z = A1 * XDir.Z() + A2 * YDir.Z();
233 if ( (Nu + 2) % 4 == 0 || (Nu + 1) % 4 == 0 )
234 { X = - X; Y = - Y; Z = - Z; }
237 Standard_Real RSinV = Radius * sin(V);
238 if (IsOdd (Nu)) { A1 = - SinU; A2 = CosU; }
239 else { A1 = - CosU; A2 = - SinU; }
240 if (IsOdd (Nv)) A3 = - RSinV;
242 X = (A1 * XDir.X() + A2 * YDir.X()) * A3;
243 Y = (A1 * XDir.Y() + A2 * YDir.Y()) * A3;
244 Z = (A1 * XDir.Z() + A2 * YDir.Z()) * A3;
245 if ((!((Nu + 2) % 4 == 0 || (Nu + 3) % 4 == 0) &&
246 ((Nv + 2) % 4 == 0 || (Nv + 3) % 4 == 0)) ||
247 (((Nu + 2) % 4 == 0 || (Nu + 3) % 4 == 0) &&
248 !((Nv + 2) % 4 == 0 || (Nv + 3) % 4 == 0)))
249 { X = - X; Y = - Y; Z = - Z; }
251 return gp_Vec(X,Y,Z);
254 gp_Vec ElSLib::TorusDN (const Standard_Real U,
255 const Standard_Real V,
257 const Standard_Real MajorRadius,
258 const Standard_Real MinorRadius,
259 const Standard_Integer Nu,
260 const Standard_Integer Nv)
262 if (Nu + Nv < 1 || Nu < 0 || Nv < 0) { return gp_Vec(); }
263 Standard_Real CosU = cos(U);
264 Standard_Real SinU = sin(U);
265 const gp_XYZ& XDir = Pos.XDirection().XYZ();
266 const gp_XYZ& YDir = Pos.YDirection().XYZ();
267 const gp_XYZ& ZDir = Pos.Direction ().XYZ();
268 Standard_Real A1,A2,A3,X=0,Y=0,Z=0;
269 // Modified by skv - Tue Sep 9 15:10:34 2003 OCC620 Begin
270 Standard_Real eps = 10.*(MinorRadius + MajorRadius)*RealEpsilon();
271 // Modified by skv - Tue Sep 9 15:10:34 2003 OCC620 End
273 Standard_Real R = MajorRadius + MinorRadius * cos(V);
274 if (IsOdd (Nu)) { A1 = - R * SinU; A2 = R * CosU; }
275 else { A1 = - R * CosU; A2 = - R * SinU; }
276 // Modified by skv - Tue Sep 9 15:10:34 2003 OCC620 Begin
282 // Modified by skv - Tue Sep 9 15:10:35 2003 OCC620 End
283 X = A1 * XDir.X() + A2 * YDir.X();
284 Y = A1 * XDir.Y() + A2 * YDir.Y();
285 Z = A1 * XDir.Z() + A2 * YDir.Z();
286 if (!((Nu + 2) % 4 == 0 || (Nu + 3) % 4 == 0))
287 { X = - X; Y = - Y; Z = - Z; }
290 Standard_Real RCosV = MinorRadius * cos(V);
291 Standard_Real RSinV = MinorRadius * sin(V);
292 if (IsOdd (Nv)) { A1 = - RSinV * CosU; A2 = - RSinV * SinU; A3 = RCosV; }
293 else { A1 = - RCosV * CosU; A2 = - RCosV * SinU; A3 = - RSinV; }
294 // Modified by skv - Tue Sep 9 15:10:34 2003 OCC620 Begin
303 // Modified by skv - Tue Sep 9 15:10:35 2003 OCC620 End
304 X = A1 * XDir.X() + A2 * YDir.X() + A3 * ZDir.X();
305 Y = A1 * XDir.Y() + A2 * YDir.Y() + A3 * ZDir.Y();
306 Z = A1 * XDir.Z() + A2 * YDir.Z() + A3 * ZDir.Z();
307 if (!((Nv + 2) % 4 == 0 || (Nv + 3) % 4 == 0))
308 { X = - X; Y = - Y; Z = - Z; }
313 Standard_Real RSinV = MinorRadius * sin(V);
314 A1 = RSinV * SinU; A2 = - RSinV * CosU;
315 // Modified by skv - Tue Sep 9 15:10:34 2003 OCC620 Begin
321 // Modified by skv - Tue Sep 9 15:10:35 2003 OCC620 End
322 X = A1 * XDir.X() + A2 * YDir.X();
323 Y = A1 * XDir.Y() + A2 * YDir.Y();
324 Z = A1 * XDir.Z() + A2 * YDir.Z();
326 else if (IsEven (Nu) && IsEven (Nv)) {
327 Standard_Real RCosV = MinorRadius * cos(V);
328 A1 = RCosV * CosU; A2 = RCosV * SinU;
329 // Modified by skv - Tue Sep 9 15:10:34 2003 OCC620 Begin
335 // Modified by skv - Tue Sep 9 15:10:35 2003 OCC620 End
336 X = A1 * XDir.X() + A2 * YDir.X();
337 Y = A1 * XDir.Y() + A2 * YDir.Y();
338 Z = A1 * XDir.Z() + A2 * YDir.Z();
340 else if (IsEven (Nv) && IsOdd (Nu)) {
341 Standard_Real RCosV = MinorRadius * cos(V);
342 A1 = RCosV * SinU; A2 = - RCosV * CosU;
343 // Modified by skv - Tue Sep 9 15:10:34 2003 OCC620 Begin
349 // Modified by skv - Tue Sep 9 15:10:35 2003 OCC620 End
350 X = A1 * XDir.X() + A2 * YDir.X();
351 Y = A1 * XDir.Y() + A2 * YDir.Y();
352 Z = A1 * XDir.Z() + A2 * YDir.Z();
353 if (((Nv + Nu + 3) % 4) == 0)
354 { X = - X; Y = - Y; Z = - Z; }
356 else if (IsOdd (Nv) && IsEven (Nu)) {
357 Standard_Real RSinV = MinorRadius * sin(V);
358 A1 = RSinV * CosU; A2 = RSinV * SinU;
359 // Modified by skv - Tue Sep 9 15:10:34 2003 OCC620 Begin
365 // Modified by skv - Tue Sep 9 15:10:35 2003 OCC620 End
366 X = A1 * XDir.X() + A2 * YDir.X();
367 Y = A1 * XDir.Y() + A2 * YDir.Y();
368 Z = A1 * XDir.Z() + A2 * YDir.Z();
369 if (((Nu + Nv + 3) % 4) == 0)
370 { X = - X; Y = - Y; Z = - Z; }
373 return gp_Vec (X,Y,Z);
376 void ElSLib::PlaneD0 (const Standard_Real U,
377 const Standard_Real V,
381 const gp_XYZ& XDir = Pos.XDirection().XYZ();
382 const gp_XYZ& YDir = Pos.YDirection().XYZ();
383 const gp_XYZ& PLoc = Pos.Location ().XYZ();
384 P.SetX(U * XDir.X() + V * YDir.X() + PLoc.X());
385 P.SetY(U * XDir.Y() + V * YDir.Y() + PLoc.Y());
386 P.SetZ(U * XDir.Z() + V * YDir.Z() + PLoc.Z());
389 void ElSLib::ConeD0 (const Standard_Real U,
390 const Standard_Real V,
392 const Standard_Real Radius,
393 const Standard_Real SAngle,
396 const gp_XYZ& XDir = Pos.XDirection().XYZ();
397 const gp_XYZ& YDir = Pos.YDirection().XYZ();
398 const gp_XYZ& ZDir = Pos.Direction ().XYZ();
399 const gp_XYZ& PLoc = Pos.Location ().XYZ();
400 Standard_Real R = Radius + V * sin(SAngle);
401 Standard_Real A3 = V * cos(SAngle);
402 Standard_Real A1 = R * cos(U);
403 Standard_Real A2 = R * sin(U);
404 P.SetX(A1 * XDir.X() + A2 * YDir.X() + A3 * ZDir.X() + PLoc.X());
405 P.SetY(A1 * XDir.Y() + A2 * YDir.Y() + A3 * ZDir.Y() + PLoc.Y());
406 P.SetZ(A1 * XDir.Z() + A2 * YDir.Z() + A3 * ZDir.Z() + PLoc.Z());
409 void ElSLib::CylinderD0 (const Standard_Real U,
410 const Standard_Real V,
412 const Standard_Real Radius,
415 const gp_XYZ& XDir = Pos.XDirection().XYZ();
416 const gp_XYZ& YDir = Pos.YDirection().XYZ();
417 const gp_XYZ& ZDir = Pos.Direction ().XYZ();
418 const gp_XYZ& PLoc = Pos.Location ().XYZ();
419 Standard_Real A1 = Radius * cos(U);
420 Standard_Real A2 = Radius * sin(U);
421 P.SetX(A1 * XDir.X() + A2 * YDir.X() + V * ZDir.X() + PLoc.X());
422 P.SetY(A1 * XDir.Y() + A2 * YDir.Y() + V * ZDir.Y() + PLoc.Y());
423 P.SetZ(A1 * XDir.Z() + A2 * YDir.Z() + V * ZDir.Z() + PLoc.Z());
426 void ElSLib::SphereD0 (const Standard_Real U,
427 const Standard_Real V,
429 const Standard_Real Radius, gp_Pnt& P)
431 const gp_XYZ& XDir = Pos.XDirection().XYZ();
432 const gp_XYZ& YDir = Pos.YDirection().XYZ();
433 const gp_XYZ& ZDir = Pos.Direction ().XYZ();
434 const gp_XYZ& PLoc = Pos.Location ().XYZ();
435 Standard_Real R = Radius * cos(V);
436 Standard_Real A3 = Radius * sin(V);
437 Standard_Real A1 = R * cos(U);
438 Standard_Real A2 = R * sin(U);
439 P.SetX(A1 * XDir.X() + A2 * YDir.X() + A3 * ZDir.X() + PLoc.X());
440 P.SetY(A1 * XDir.Y() + A2 * YDir.Y() + A3 * ZDir.Y() + PLoc.Y());
441 P.SetZ(A1 * XDir.Z() + A2 * YDir.Z() + A3 * ZDir.Z() + PLoc.Z());
444 void ElSLib::TorusD0 (const Standard_Real U,
445 const Standard_Real V,
447 const Standard_Real MajorRadius,
448 const Standard_Real MinorRadius,
451 const gp_XYZ& XDir = Pos.XDirection().XYZ();
452 const gp_XYZ& YDir = Pos.YDirection().XYZ();
453 const gp_XYZ& ZDir = Pos.Direction ().XYZ();
454 const gp_XYZ& PLoc = Pos.Location ().XYZ();
455 Standard_Real R = MajorRadius + MinorRadius * cos(V);
456 Standard_Real A3 = MinorRadius * sin(V);
457 Standard_Real A1 = R * cos(U);
458 Standard_Real A2 = R * sin(U);
459 // Modified by skv - Tue Sep 9 15:10:34 2003 OCC620 Begin
460 Standard_Real eps = 10.*(MinorRadius + MajorRadius)*RealEpsilon();
470 // Modified by skv - Tue Sep 9 15:10:35 2003 OCC620 End
471 P.SetX(A1 * XDir.X() + A2 * YDir.X() + A3 * ZDir.X() + PLoc.X());
472 P.SetY(A1 * XDir.Y() + A2 * YDir.Y() + A3 * ZDir.Y() + PLoc.Y());
473 P.SetZ(A1 * XDir.Z() + A2 * YDir.Z() + A3 * ZDir.Z() + PLoc.Z());
476 void ElSLib::PlaneD1 (const Standard_Real U,
477 const Standard_Real V,
483 const gp_XYZ& XDir = Pos.XDirection().XYZ();
484 const gp_XYZ& YDir = Pos.YDirection().XYZ();
485 const gp_XYZ& PLoc = Pos.Location ().XYZ();
486 P.SetX(U * XDir.X() + V * YDir.X() + PLoc.X());
487 P.SetY(U * XDir.Y() + V * YDir.Y() + PLoc.Y());
488 P.SetZ(U * XDir.Z() + V * YDir.Z() + PLoc.Z());
497 void ElSLib::ConeD1 (const Standard_Real U,
498 const Standard_Real V,
500 const Standard_Real Radius,
501 const Standard_Real SAngle,
506 // Z = V * Cos(SAngle)
507 // M(U,V) = Location() + V * Cos(SAngle) * ZDirection() +
508 // (Radius + V*Sin(SAng)) * (Cos(U) * XDirection() + Sin(U) * YDirection())
511 //(Radius + V*Sin(SAng)) * (-Sin(U) * XDirection() + Cos(U) * YDirection())
514 // Direction() *Cos(SAngle) + Sin(SAng) * (Cos(U) * XDirection() +
515 // Sin(U) * YDirection())
517 const gp_XYZ& XDir = Pos.XDirection().XYZ();
518 const gp_XYZ& YDir = Pos.YDirection().XYZ();
519 const gp_XYZ& ZDir = Pos.Direction ().XYZ();
520 const gp_XYZ& PLoc = Pos.Location ().XYZ();
521 Standard_Real CosU = cos(U);
522 Standard_Real SinU = sin(U);
523 Standard_Real CosA = cos(SAngle);
524 Standard_Real SinA = sin(SAngle);
525 Standard_Real R = Radius + V * SinA;
526 Standard_Real A3 = V * CosA;
527 Standard_Real A1 = R * CosU;
528 Standard_Real A2 = R * SinU;
529 Standard_Real R1 = SinA * CosU;
530 Standard_Real R2 = SinA * SinU;
531 P .SetX( A1 * XDir.X() + A2 * YDir.X() + A3 * ZDir.X() + PLoc.X());
532 P .SetY( A1 * XDir.Y() + A2 * YDir.Y() + A3 * ZDir.Y() + PLoc.Y());
533 P .SetZ( A1 * XDir.Z() + A2 * YDir.Z() + A3 * ZDir.Z() + PLoc.Z());
534 Vu.SetX(- A2 * XDir.X() + A1 * YDir.X());
535 Vu.SetY(- A2 * XDir.Y() + A1 * YDir.Y());
536 Vu.SetZ(- A2 * XDir.Z() + A1 * YDir.Z());
537 Vv.SetX( R1 * XDir.X() + R2 * YDir.X() + CosA * ZDir.X());
538 Vv.SetY( R1 * XDir.Y() + R2 * YDir.Y() + CosA * ZDir.Y());
539 Vv.SetZ( R1 * XDir.Z() + R2 * YDir.Z() + CosA * ZDir.Z());
542 void ElSLib::CylinderD1 (const Standard_Real U,
543 const Standard_Real V,
545 const Standard_Real Radius,
550 const gp_XYZ& XDir = Pos.XDirection().XYZ();
551 const gp_XYZ& YDir = Pos.YDirection().XYZ();
552 const gp_XYZ& ZDir = Pos.Direction ().XYZ();
553 const gp_XYZ& PLoc = Pos.Location ().XYZ();
554 Standard_Real A1 = Radius * cos(U);
555 Standard_Real A2 = Radius * sin(U);
556 P .SetX( A1 * XDir.X() + A2 * YDir.X() + V * ZDir.X() + PLoc.X());
557 P .SetY( A1 * XDir.Y() + A2 * YDir.Y() + V * ZDir.Y() + PLoc.Y());
558 P .SetZ( A1 * XDir.Z() + A2 * YDir.Z() + V * ZDir.Z() + PLoc.Z());
559 Vu.SetX(- A2 * XDir.X() + A1 * YDir.X());
560 Vu.SetY(- A2 * XDir.Y() + A1 * YDir.Y());
561 Vu.SetZ(- A2 * XDir.Z() + A1 * YDir.Z());
567 void ElSLib::SphereD1 (const Standard_Real U,
568 const Standard_Real V,
570 const Standard_Real Radius,
575 // Vxy = CosU * XDirection + SinU * YDirection
576 // DVxy = -SinU * XDirection + CosU * YDirection
578 // P(U,V) = Location + R * CosV * Vxy + R * SinV * Direction
580 // Vu = R * CosV * DVxy
582 // Vv = -R * SinV * Vxy + R * CosV * Direction
584 const gp_XYZ& XDir = Pos.XDirection().XYZ();
585 const gp_XYZ& YDir = Pos.YDirection().XYZ();
586 const gp_XYZ& ZDir = Pos.Direction ().XYZ();
587 const gp_XYZ& PLoc = Pos.Location ().XYZ();
588 Standard_Real CosU = cos(U);
589 Standard_Real SinU = sin(U);
590 Standard_Real R1 = Radius * cos(V);
591 Standard_Real R2 = Radius * sin(V);
592 Standard_Real A1 = R1 * CosU;
593 Standard_Real A2 = R1 * SinU;
594 Standard_Real A3 = R2 * CosU;
595 Standard_Real A4 = R2 * SinU;
596 P .SetX( A1 * XDir.X() + A2 * YDir.X() + R2 * ZDir.X() + PLoc.X());
597 P .SetY( A1 * XDir.Y() + A2 * YDir.Y() + R2 * ZDir.Y() + PLoc.Y());
598 P .SetZ( A1 * XDir.Z() + A2 * YDir.Z() + R2 * ZDir.Z() + PLoc.Z());
599 Vu.SetX(- A2 * XDir.X() + A1 * YDir.X());
600 Vu.SetY(- A2 * XDir.Y() + A1 * YDir.Y());
601 Vu.SetZ(- A2 * XDir.Z() + A1 * YDir.Z());
602 Vv.SetX(- A3 * XDir.X() - A4 * YDir.X() + R1 * ZDir.X());
603 Vv.SetY(- A3 * XDir.Y() - A4 * YDir.Y() + R1 * ZDir.Y());
604 Vv.SetZ(- A3 * XDir.Z() - A4 * YDir.Z() + R1 * ZDir.Z());
607 void ElSLib::TorusD1 ( const Standard_Real U,
608 const Standard_Real V,
610 const Standard_Real MajorRadius,
611 const Standard_Real MinorRadius,
619 // (MajorRadius+MinorRadius*Cos(V)) *
620 // (Cos(U)*XDirection + Sin(U)*YDirection) +
621 // MinorRadius * Sin(V) * Direction
623 //Vv = -MinorRadius * Sin(V) * (Cos(U)*XDirection + Sin(U)*YDirection) +
624 // MinorRadius * Cos(V) * Direction
627 // (MajorRadius+MinorRadius*Cos(V)) *
628 // (-Sin(U)*XDirection + Cos(U)*YDirection)
630 const gp_XYZ& XDir = Pos.XDirection().XYZ();
631 const gp_XYZ& YDir = Pos.YDirection().XYZ();
632 const gp_XYZ& ZDir = Pos.Direction ().XYZ();
633 const gp_XYZ& PLoc = Pos.Location ().XYZ();
634 Standard_Real CosU = cos(U);
635 Standard_Real SinU = sin(U);
636 Standard_Real R1 = MinorRadius * cos(V);
637 Standard_Real R2 = MinorRadius * sin(V);
638 Standard_Real R = MajorRadius + R1;
639 Standard_Real A1 = R * CosU;
640 Standard_Real A2 = R * SinU;
641 Standard_Real A3 = R2 * CosU;
642 Standard_Real A4 = R2 * SinU;
643 // Modified by skv - Tue Sep 9 15:10:34 2003 OCC620 Begin
644 Standard_Real eps = 10.*(MinorRadius + MajorRadius)*RealEpsilon();
657 // Modified by skv - Tue Sep 9 15:10:35 2003 OCC620 End
658 P .SetX( A1 * XDir.X() + A2 * YDir.X() + R2 * ZDir.X() + PLoc.X());
659 P .SetY( A1 * XDir.Y() + A2 * YDir.Y() + R2 * ZDir.Y() + PLoc.Y());
660 P .SetZ( A1 * XDir.Z() + A2 * YDir.Z() + R2 * ZDir.Z() + PLoc.Z());
661 Vu.SetX(- A2 * XDir.X() + A1 * YDir.X());
662 Vu.SetY(- A2 * XDir.Y() + A1 * YDir.Y());
663 Vu.SetZ(- A2 * XDir.Z() + A1 * YDir.Z());
664 Vv.SetX(- A3 * XDir.X() - A4 * YDir.X() + R1 * ZDir.X());
665 Vv.SetY(- A3 * XDir.Y() - A4 * YDir.Y() + R1 * ZDir.Y());
666 Vv.SetZ(- A3 * XDir.Z() - A4 * YDir.Z() + R1 * ZDir.Z());
669 void ElSLib::ConeD2 (const Standard_Real U,
670 const Standard_Real V,
672 const Standard_Real Radius,
673 const Standard_Real SAngle,
681 // Z = V * Cos(SAngle)
682 // M(U,V) = Location() + V * Cos(SAngle) * Direction() +
683 // (Radius + V*Sin(SAng)) * (Cos(U) * XDirection() + Sin(U) * YDirection())
686 //(Radius + V*Sin(SAng)) * (-Sin(U) * XDirection() + Cos(U) * YDirection())
689 // Direction() *Cos(SAngle) + Sin(SAng) * (Cos(U) * XDirection() +
690 // Sin(U) * YDirection())
693 //(Radius + V*Sin(SAng)) * (-Cos(U) * XDirection() - Sin(U) * YDirection())
698 //Sin(SAng) * (-Sin(U) * XDirection() + Cos(U) * YDirection())
700 const gp_XYZ& XDir = Pos.XDirection().XYZ();
701 const gp_XYZ& YDir = Pos.YDirection().XYZ();
702 const gp_XYZ& ZDir = Pos.Direction ().XYZ();
703 const gp_XYZ& PLoc = Pos.Location ().XYZ();
704 Standard_Real CosU = cos(U);
705 Standard_Real SinU = sin(U);
706 Standard_Real CosA = cos(SAngle);
707 Standard_Real SinA = sin(SAngle);
708 Standard_Real R = Radius + V * SinA;
709 Standard_Real A3 = V * CosA;
710 Standard_Real A1 = R * CosU;
711 Standard_Real A2 = R * SinU;
712 Standard_Real R1 = SinA * CosU;
713 Standard_Real R2 = SinA * SinU;
714 Standard_Real Som1X = A1 * XDir.X() + A2 * YDir.X();
715 Standard_Real Som1Y = A1 * XDir.Y() + A2 * YDir.Y();
716 Standard_Real Som1Z = A1 * XDir.Z() + A2 * YDir.Z();
717 P .SetX( Som1X + A3 * ZDir.X() + PLoc.X());
718 P .SetY( Som1Y + A3 * ZDir.Y() + PLoc.Y());
719 P .SetZ( Som1Z + A3 * ZDir.Z() + PLoc.Z());
720 Vu .SetX(- A2 * XDir.X() + A1 * YDir.X());
721 Vu .SetY(- A2 * XDir.Y() + A1 * YDir.Y());
722 Vu .SetZ(- A2 * XDir.Z() + A1 * YDir.Z());
723 Vv .SetX( R1 * XDir.X() + R2 * YDir.X() + CosA * ZDir.X());
724 Vv .SetY( R1 * XDir.Y() + R2 * YDir.Y() + CosA * ZDir.Y());
725 Vv .SetZ( R1 * XDir.Z() + R2 * YDir.Z() + CosA * ZDir.Z());
732 Vuv.SetX(- R2 * XDir.X() + R1 * YDir.X());
733 Vuv.SetY(- R2 * XDir.Y() + R1 * YDir.Y());
734 Vuv.SetZ(- R2 * XDir.Z() + R1 * YDir.Z());
737 void ElSLib::CylinderD2 (const Standard_Real U,
738 const Standard_Real V,
740 const Standard_Real Radius,
748 const gp_XYZ& XDir = Pos.XDirection().XYZ();
749 const gp_XYZ& YDir = Pos.YDirection().XYZ();
750 const gp_XYZ& ZDir = Pos.Direction ().XYZ();
751 const gp_XYZ& PLoc = Pos.Location ().XYZ();
752 Standard_Real A1 = Radius * cos(U);
753 Standard_Real A2 = Radius * sin(U);
754 Standard_Real Som1X = A1 * XDir.X() + A2 * YDir.X();
755 Standard_Real Som1Y = A1 * XDir.Y() + A2 * YDir.Y();
756 Standard_Real Som1Z = A1 * XDir.Z() + A2 * YDir.Z();
757 P .SetX( Som1X + V * ZDir.X() + PLoc.X());
758 P .SetY( Som1Y + V * ZDir.Y() + PLoc.Y());
759 P .SetZ( Som1Z + V * ZDir.Z() + PLoc.Z());
760 Vu .SetX(- A2 * XDir.X() + A1 * YDir.X());
761 Vu .SetY(- A2 * XDir.Y() + A1 * YDir.Y());
762 Vu .SetZ(- A2 * XDir.Z() + A1 * YDir.Z());
777 void ElSLib::SphereD2 (const Standard_Real U,
778 const Standard_Real V,
780 const Standard_Real Radius,
788 // Vxy = CosU * XDirection + SinU * YDirection
789 // DVxy = -SinU * XDirection + CosU * YDirection
791 // P(U,V) = Location + R * CosV * Vxy + R * SinV * Direction
793 // Vu = R * CosV * DVxy
795 // Vuu = - R * CosV * Vxy
797 // Vv = -R * SinV * Vxy + R * CosV * Direction
799 // Vvv = -R * CosV * Vxy - R * SinV * Direction
801 // Vuv = - R * SinV * DVxy
803 const gp_XYZ& XDir = Pos.XDirection().XYZ();
804 const gp_XYZ& YDir = Pos.YDirection().XYZ();
805 const gp_XYZ& ZDir = Pos.Direction ().XYZ();
806 const gp_XYZ& PLoc = Pos.Location ().XYZ();
807 Standard_Real CosU = cos(U);
808 Standard_Real SinU = sin(U);
809 Standard_Real R1 = Radius * cos(V);
810 Standard_Real R2 = Radius * sin(V);
811 Standard_Real A1 = R1 * CosU;
812 Standard_Real A2 = R1 * SinU;
813 Standard_Real A3 = R2 * CosU;
814 Standard_Real A4 = R2 * SinU;
815 Standard_Real Som1X = A1 * XDir.X() + A2 * YDir.X();
816 Standard_Real Som1Y = A1 * XDir.Y() + A2 * YDir.Y();
817 Standard_Real Som1Z = A1 * XDir.Z() + A2 * YDir.Z();
818 Standard_Real R2ZX = R2 * ZDir.X();
819 Standard_Real R2ZY = R2 * ZDir.Y();
820 Standard_Real R2ZZ = R2 * ZDir.Z();
821 P .SetX( Som1X + R2ZX + PLoc.X());
822 P .SetY( Som1Y + R2ZY + PLoc.Y());
823 P .SetZ( Som1Z + R2ZZ + PLoc.Z());
824 Vu .SetX(- A2 * XDir.X() + A1 * YDir.X());
825 Vu .SetY(- A2 * XDir.Y() + A1 * YDir.Y());
826 Vu .SetZ(- A2 * XDir.Z() + A1 * YDir.Z());
827 Vv .SetX(- A3 * XDir.X() - A4 * YDir.X() + R1 * ZDir.X());
828 Vv .SetY(- A3 * XDir.Y() - A4 * YDir.Y() + R1 * ZDir.Y());
829 Vv .SetZ(- A3 * XDir.Z() - A4 * YDir.Z() + R1 * ZDir.Z());
833 Vvv.SetX(- Som1X - R2ZX);
834 Vvv.SetY(- Som1Y - R2ZY);
835 Vvv.SetZ(- Som1Z - R2ZZ);
836 Vuv.SetX( A4 * XDir.X() - A3 * YDir.X());
837 Vuv.SetY( A4 * XDir.Y() - A3 * YDir.Y());
838 Vuv.SetZ( A4 * XDir.Z() - A3 * YDir.Z());
841 void ElSLib::TorusD2 (const Standard_Real U,
842 const Standard_Real V,
844 const Standard_Real MajorRadius,
845 const Standard_Real MinorRadius,
855 // (MajorRadius+MinorRadius*Cos(V)) *
856 // (Cos(U)*XDirection + Sin(U)*YDirection) +
857 // MinorRadius * Sin(V) * Direction
859 //Vv = -MinorRadius * Sin(V) * (Cos(U)*XDirection + Sin(U)*YDirection) +
860 // MinorRadius * Cos(V) * Direction
863 // (MajorRadius+MinorRadius*Cos(V)) *
864 // (-Sin(U)*XDirection + Cos(U)*YDirection)
867 //Vvv = -MinorRadius * Cos(V) * (Cos(U)*XDirection + Sin(U)*YDirection)
868 // -MinorRadius * Sin(V) * Direction
871 // -(MajorRadius+MinorRadius*Cos(V)) *
872 // (Cos(U)*XDirection + Sin(U)*YDirection)
874 //Vuv = MinorRadius * Sin(V) * (Sin(U)*XDirection - Cos(U)*YDirection)
876 const gp_XYZ& XDir = Pos.XDirection().XYZ();
877 const gp_XYZ& YDir = Pos.YDirection().XYZ();
878 const gp_XYZ& ZDir = Pos.Direction ().XYZ();
879 const gp_XYZ& PLoc = Pos.Location ().XYZ();
880 Standard_Real CosU = cos(U);
881 Standard_Real SinU = sin(U);
882 Standard_Real R1 = MinorRadius * cos(V);
883 Standard_Real R2 = MinorRadius * sin(V);
884 Standard_Real R = MajorRadius + R1;
885 Standard_Real A1 = R * CosU;
886 Standard_Real A2 = R * SinU;
887 Standard_Real A3 = R2 * CosU;
888 Standard_Real A4 = R2 * SinU;
889 Standard_Real A5 = R1 * CosU;
890 Standard_Real A6 = R1 * SinU;
891 // Modified by skv - Tue Sep 9 15:10:34 2003 OCC620 Begin
892 Standard_Real eps = 10.*(MinorRadius + MajorRadius)*RealEpsilon();
911 // Modified by skv - Tue Sep 9 15:10:35 2003 OCC620 End
912 Standard_Real Som1X = A1 * XDir.X() + A2 * YDir.X();
913 Standard_Real Som1Y = A1 * XDir.Y() + A2 * YDir.Y();
914 Standard_Real Som1Z = A1 * XDir.Z() + A2 * YDir.Z();
915 Standard_Real R2ZX = R2 * ZDir.X();
916 Standard_Real R2ZY = R2 * ZDir.Y();
917 Standard_Real R2ZZ = R2 * ZDir.Z();
918 P .SetX( Som1X + R2ZX + PLoc.X());
919 P .SetY( Som1Y + R2ZY + PLoc.Y());
920 P .SetZ( Som1Z + R2ZZ + PLoc.Z());
921 Vu .SetX(- A2 * XDir.X() + A1 * YDir.X());
922 Vu .SetY(- A2 * XDir.Y() + A1 * YDir.Y());
923 Vu .SetZ(- A2 * XDir.Z() + A1 * YDir.Z());
924 Vv .SetX(- A3 * XDir.X() - A4 * YDir.X() + R1 * ZDir.X());
925 Vv .SetY(- A3 * XDir.Y() - A4 * YDir.Y() + R1 * ZDir.Y());
926 Vv .SetZ(- A3 * XDir.Z() - A4 * YDir.Z() + R1 * ZDir.Z());
930 Vvv.SetX(- A5 * XDir.X() - A6 * YDir.X() - R2ZX);
931 Vvv.SetY(- A5 * XDir.Y() - A6 * YDir.Y() - R2ZY);
932 Vvv.SetZ(- A5 * XDir.Z() - A6 * YDir.Z() - R2ZZ);
933 Vuv.SetX( A4 * XDir.X() - A3 * YDir.X());
934 Vuv.SetY( A4 * XDir.Y() - A3 * YDir.Y());
935 Vuv.SetZ( A4 * XDir.Z() - A3 * YDir.Z());
938 void ElSLib::ConeD3 (const Standard_Real U,
939 const Standard_Real V,
941 const Standard_Real Radius,
942 const Standard_Real SAngle,
944 gp_Vec& Vu, gp_Vec& Vv,
945 gp_Vec& Vuu, gp_Vec& Vvv, gp_Vec& Vuv,
946 gp_Vec& Vuuu, gp_Vec& Vvvv,
947 gp_Vec& Vuuv, gp_Vec& Vuvv)
949 // Z = V * Cos(SAngle)
950 // M(U,V) = Location() + V * Cos(SAngle) * Direction() +
951 // (Radius + V*Sin(SAng)) * (Cos(U) * XDirection() + Sin(U) * YDirection())
954 //(Radius + V*Sin(SAng)) * (-Sin(U) * XDirection() + Cos(U) * YDirection())
957 // Direction() *Cos(SAngle) + Sin(SAng) * (Cos(U) * XDirection() +
958 // Sin(U) * YDirection())
961 //(Radius + V*Sin(SAng)) * (-Cos(U) * XDirection() - Sin(U) * YDirection())
966 //Sin(SAng) * (-Sin(U) * XDirection() + Cos(U) * YDirection())
969 //(Radius + V*Sin(SAng)) * (Sin(U) * XDirection() - Cos(U) * YDirection())
975 // DUUV = Sin(SAng) * (-Cos(U)*XDirection()-Sin(U) * YDirection()) +
978 const gp_XYZ& XDir = Pos.XDirection().XYZ();
979 const gp_XYZ& YDir = Pos.YDirection().XYZ();
980 const gp_XYZ& ZDir = Pos.Direction ().XYZ();
981 const gp_XYZ& PLoc = Pos.Location ().XYZ();
982 Standard_Real CosU = cos(U);
983 Standard_Real SinU = sin(U);
984 Standard_Real CosA = cos(SAngle);
985 Standard_Real SinA = sin(SAngle);
986 Standard_Real R = Radius + V * SinA;
987 Standard_Real A3 = V * CosA;
988 Standard_Real A1 = R * CosU;
989 Standard_Real A2 = R * SinU;
990 Standard_Real R1 = SinA * CosU;
991 Standard_Real R2 = SinA * SinU;
992 Standard_Real Som1X = A1 * XDir.X() + A2 * YDir.X();
993 Standard_Real Som1Y = A1 * XDir.Y() + A2 * YDir.Y();
994 Standard_Real Som1Z = A1 * XDir.Z() + A2 * YDir.Z();
995 Standard_Real Som2X = R1 * XDir.X() + R2 * YDir.X();
996 Standard_Real Som2Y = R1 * XDir.Y() + R2 * YDir.Y();
997 Standard_Real Som2Z = R1 * XDir.Z() + R2 * YDir.Z();
998 Standard_Real Dif1X = A2 * XDir.X() - A1 * YDir.X();
999 Standard_Real Dif1Y = A2 * XDir.Y() - A1 * YDir.Y();
1000 Standard_Real Dif1Z = A2 * XDir.Z() - A1 * YDir.Z();
1001 P .SetX( Som1X + A3 * ZDir.X() + PLoc.X());
1002 P .SetY( Som1Y + A3 * ZDir.Y() + PLoc.Y());
1003 P .SetZ( Som1Z + A3 * ZDir.Z() + PLoc.Z());
1007 Vv .SetX( Som2X + CosA * ZDir.X());
1008 Vv .SetY( Som2Y + CosA * ZDir.Y());
1009 Vv .SetZ( Som2Z + CosA * ZDir.Z());
1016 Vuv .SetX(- R2 * XDir.X() + R1 * YDir.X());
1017 Vuv .SetY(- R2 * XDir.Y() + R1 * YDir.Y());
1018 Vuv .SetZ(- R2 * XDir.Z() + R1 * YDir.Z());
1033 void ElSLib::CylinderD3 (const Standard_Real U,
1034 const Standard_Real V,
1036 const Standard_Real Radius,
1038 gp_Vec& Vu, gp_Vec& Vv,
1039 gp_Vec& Vuu, gp_Vec& Vvv, gp_Vec& Vuv,
1040 gp_Vec& Vuuu, gp_Vec& Vvvv,
1041 gp_Vec& Vuuv, gp_Vec& Vuvv)
1043 const gp_XYZ& XDir = Pos.XDirection().XYZ();
1044 const gp_XYZ& YDir = Pos.YDirection().XYZ();
1045 const gp_XYZ& ZDir = Pos.Direction ().XYZ();
1046 const gp_XYZ& PLoc = Pos.Location ().XYZ();
1047 Standard_Real A1 = Radius * cos(U);
1048 Standard_Real A2 = Radius * sin(U);
1049 Standard_Real Som1X = A1 * XDir.X() + A2 * YDir.X();
1050 Standard_Real Som1Y = A1 * XDir.Y() + A2 * YDir.Y();
1051 Standard_Real Som1Z = A1 * XDir.Z() + A2 * YDir.Z();
1052 Standard_Real Dif1X = A2 * XDir.X() - A1 * YDir.X();
1053 Standard_Real Dif1Y = A2 * XDir.Y() - A1 * YDir.Y();
1054 Standard_Real Dif1Z = A2 * XDir.Z() - A1 * YDir.Z();
1055 P .SetX( Som1X + V * ZDir.X() + PLoc.X());
1056 P .SetY( Som1Y + V * ZDir.Y() + PLoc.Y());
1057 P .SetZ( Som1Z + V * ZDir.Z() + PLoc.Z());
1061 Vv .SetX( ZDir.X());
1062 Vv .SetY( ZDir.Y());
1063 Vv .SetZ( ZDir.Z());
1087 void ElSLib::SphereD3 (const Standard_Real U,
1088 const Standard_Real V,
1090 const Standard_Real Radius,
1092 gp_Vec& Vu, gp_Vec& Vv,
1093 gp_Vec& Vuu, gp_Vec& Vvv, gp_Vec& Vuv,
1094 gp_Vec& Vuuu, gp_Vec& Vvvv,
1095 gp_Vec& Vuuv, gp_Vec& Vuvv)
1098 // Vxy = CosU * XDirection + SinU * YDirection
1099 // DVxy = -SinU * XDirection + CosU * YDirection
1101 // P(U,V) = Location + R * CosV * Vxy + R * SinV * Direction
1103 // Vu = R * CosV * DVxy
1105 // Vuu = - R * CosV * Vxy
1109 // Vv = -R * SinV * Vxy + R * CosV * Direction
1111 // Vvv = -R * CosV * Vxy - R * SinV * Direction
1115 // Vuv = - R * SinV * DVxy
1117 // Vuuv = R * SinV * Vxy
1119 // Vuvv = - R * CosV * DVxy = Vuuu = -Vu
1121 const gp_XYZ& XDir = Pos.XDirection().XYZ();
1122 const gp_XYZ& YDir = Pos.YDirection().XYZ();
1123 const gp_XYZ& ZDir = Pos.Direction ().XYZ();
1124 const gp_XYZ& PLoc = Pos.Location ().XYZ();
1125 Standard_Real CosU = cos(U);
1126 Standard_Real SinU = sin(U);
1127 Standard_Real R1 = Radius * cos(V);
1128 Standard_Real R2 = Radius * sin(V);
1129 Standard_Real A1 = R1 * CosU;
1130 Standard_Real A2 = R1 * SinU;
1131 Standard_Real A3 = R2 * CosU;
1132 Standard_Real A4 = R2 * SinU;
1133 Standard_Real Som1X = A1 * XDir.X() + A2 * YDir.X();
1134 Standard_Real Som1Y = A1 * XDir.Y() + A2 * YDir.Y();
1135 Standard_Real Som1Z = A1 * XDir.Z() + A2 * YDir.Z();
1136 Standard_Real Som3X = A3 * XDir.X() + A4 * YDir.X();
1137 Standard_Real Som3Y = A3 * XDir.Y() + A4 * YDir.Y();
1138 Standard_Real Som3Z = A3 * XDir.Z() + A4 * YDir.Z();
1139 Standard_Real Dif1X = A2 * XDir.X() - A1 * YDir.X();
1140 Standard_Real Dif1Y = A2 * XDir.Y() - A1 * YDir.Y();
1141 Standard_Real Dif1Z = A2 * XDir.Z() - A1 * YDir.Z();
1142 Standard_Real R1ZX = R1 * ZDir.X();
1143 Standard_Real R1ZY = R1 * ZDir.Y();
1144 Standard_Real R1ZZ = R1 * ZDir.Z();
1145 Standard_Real R2ZX = R2 * ZDir.X();
1146 Standard_Real R2ZY = R2 * ZDir.Y();
1147 Standard_Real R2ZZ = R2 * ZDir.Z();
1148 P .SetX( Som1X + R2ZX + PLoc.X());
1149 P .SetY( Som1Y + R2ZY + PLoc.Y());
1150 P .SetZ( Som1Z + R2ZZ + PLoc.Z());
1154 Vv .SetX(- Som3X + R1ZX);
1155 Vv .SetY(- Som3Y + R1ZY);
1156 Vv .SetZ(- Som3Z + R1ZZ);
1160 Vvv .SetX(- Som1X - R2ZX);
1161 Vvv .SetY(- Som1Y - R2ZY);
1162 Vvv .SetZ(- Som1Z - R2ZZ);
1163 Vuv .SetX( A4 * XDir.X() - A3 * YDir.X());
1164 Vuv .SetY( A4 * XDir.Y() - A3 * YDir.Y());
1165 Vuv .SetZ( A4 * XDir.Z() - A3 * YDir.Z());
1169 Vvvv.SetX( Som3X - R1ZX);
1170 Vvvv.SetY( Som3Y - R1ZY);
1171 Vvvv.SetZ( Som3Z - R1ZZ);
1180 void ElSLib::TorusD3 (const Standard_Real U,
1181 const Standard_Real V,
1183 const Standard_Real MajorRadius,
1184 const Standard_Real MinorRadius,
1186 gp_Vec& Vu, gp_Vec& Vv,
1187 gp_Vec& Vuu, gp_Vec& Vvv, gp_Vec& Vuv,
1188 gp_Vec& Vuuu, gp_Vec& Vvvv,
1189 gp_Vec& Vuuv, gp_Vec& Vuvv)
1194 // (MajorRadius+MinorRadius*Cos(V)) *
1195 // (Cos(U)*XDirection + Sin(U)*YDirection) +
1196 // MinorRadius * Sin(V) * Direction
1198 //Vv = -MinorRadius * Sin(V) * (Cos(U)*XDirection + Sin(U)*YDirection) +
1199 // MinorRadius * Cos(V) * Direction
1201 //Vvv = -MinorRadius * Cos(V) * (Cos(U)*XDirection + Sin(U)*YDirection)
1202 // -MinorRadius * Sin(V) * Direction
1207 // (MajorRadius+MinorRadius*Cos(V)) *
1208 // (-Sin(U)*XDirection + Cos(U)*YDirection)
1211 // -(MajorRadius+MinorRadius*Cos(V)) *
1212 // (Cos(U)*XDirection + Sin(U)*YDirection)
1216 //Vuv = MinorRadius * Sin(V) * (Sin(U)*XDirection - Cos(U)*YDirection)
1218 //Vuvv = MinorRadius * Cos(V) * (Sin(U)*XDirection - Cos(U)*YDirection)
1220 //Vuuv = MinorRadius * Sin(V) * (Cos(U)*XDirection + Sin(U)*YDirection)
1222 const gp_XYZ& XDir = Pos.XDirection().XYZ();
1223 const gp_XYZ& YDir = Pos.YDirection().XYZ();
1224 const gp_XYZ& ZDir = Pos.Direction ().XYZ();
1225 const gp_XYZ& PLoc = Pos.Location ().XYZ();
1226 Standard_Real CosU = cos(U);
1227 Standard_Real SinU = sin(U);
1228 Standard_Real R1 = MinorRadius * cos(V);
1229 Standard_Real R2 = MinorRadius * sin(V);
1230 Standard_Real R = MajorRadius + R1;
1231 Standard_Real A1 = R * CosU;
1232 Standard_Real A2 = R * SinU;
1233 Standard_Real A3 = R2 * CosU;
1234 Standard_Real A4 = R2 * SinU;
1235 Standard_Real A5 = R1 * CosU;
1236 Standard_Real A6 = R1 * SinU;
1237 // Modified by skv - Tue Sep 9 15:10:34 2003 OCC620 Begin
1238 Standard_Real eps = 10.*(MinorRadius + MajorRadius)*RealEpsilon();
1257 // Modified by skv - Tue Sep 9 15:10:35 2003 OCC620 End
1258 Standard_Real Som1X = A1 * XDir.X() + A2 * YDir.X();
1259 Standard_Real Som1Y = A1 * XDir.Y() + A2 * YDir.Y();
1260 Standard_Real Som1Z = A1 * XDir.Z() + A2 * YDir.Z();
1261 Standard_Real Som3X = A3 * XDir.X() + A4 * YDir.X();
1262 Standard_Real Som3Y = A3 * XDir.Y() + A4 * YDir.Y();
1263 Standard_Real Som3Z = A3 * XDir.Z() + A4 * YDir.Z();
1264 Standard_Real Dif1X = A2 * XDir.X() - A1 * YDir.X();
1265 Standard_Real Dif1Y = A2 * XDir.Y() - A1 * YDir.Y();
1266 Standard_Real Dif1Z = A2 * XDir.Z() - A1 * YDir.Z();
1267 Standard_Real R1ZX = R1 * ZDir.X();
1268 Standard_Real R1ZY = R1 * ZDir.Y();
1269 Standard_Real R1ZZ = R1 * ZDir.Z();
1270 Standard_Real R2ZX = R2 * ZDir.X();
1271 Standard_Real R2ZY = R2 * ZDir.Y();
1272 Standard_Real R2ZZ = R2 * ZDir.Z();
1273 P .SetX( Som1X + R2ZX + PLoc.X());
1274 P .SetY( Som1Y + R2ZY + PLoc.Y());
1275 P .SetZ( Som1Z + R2ZZ + PLoc.Z());
1279 Vv .SetX(- Som3X + R1ZX);
1280 Vv .SetY(- Som3Y + R1ZY);
1281 Vv .SetZ(- Som3Z + R1ZZ);
1285 Vvv .SetX(- A5 * XDir.X() - A6 * YDir.X() - R2ZX);
1286 Vvv .SetY(- A5 * XDir.Y() - A6 * YDir.Y() - R2ZY);
1287 Vvv .SetZ(- A5 * XDir.Z() - A6 * YDir.Z() - R2ZZ);
1288 Vuv .SetX( A4 * XDir.X() - A3 * YDir.X());
1289 Vuv .SetY( A4 * XDir.Y() - A3 * YDir.Y());
1290 Vuv .SetZ( A4 * XDir.Z() - A3 * YDir.Z());
1294 Vvvv.SetX( Som3X - R1ZX);
1295 Vvvv.SetY( Som3Y - R1ZY);
1296 Vvvv.SetZ( Som3Z - R1ZZ);
1300 Vuvv.SetX( A6 * XDir.X() - A5 * YDir.X() );
1301 Vuvv.SetY( A6 * XDir.Y() - A5 * YDir.Y() );
1302 Vuvv.SetZ( A6 * XDir.Z() - A5 * YDir.Z() );
1305 //=======================================================================
1306 //function : PlaneParameters
1308 //=======================================================================
1310 void ElSLib::PlaneParameters (const gp_Ax3& Pos,
1316 T.SetTransformation (Pos);
1317 gp_Pnt Ploc = P.Transformed (T);
1322 //=======================================================================
1323 //function : CylindreParameters
1325 //=======================================================================
1327 void ElSLib::CylinderParameters (const gp_Ax3& Pos,
1328 const Standard_Real,
1334 T.SetTransformation (Pos);
1335 gp_Pnt Ploc = P.Transformed (T);
1336 U = atan2(Ploc.Y(),Ploc.X());
1337 if (U < -1.e-16) U += PIPI;
1338 else if (U < 0) U = 0;
1342 //=======================================================================
1343 //function : ConeParameters
1345 //=======================================================================
1347 void ElSLib::ConeParameters(const gp_Ax3& Pos,
1348 const Standard_Real Radius,
1349 const Standard_Real SAngle,
1355 T.SetTransformation (Pos);
1356 gp_Pnt Ploc = P.Transformed (T);
1358 if(Ploc.X() ==0.0 && Ploc.Y()==0.0 ) {
1361 else if ( -Radius > Ploc.Z()* Tan(SAngle) ) {
1362 // the point is at the wrong side of the apex
1363 U = atan2(-Ploc.Y(), -Ploc.X());
1366 U = atan2(Ploc.Y(),Ploc.X());
1368 if (U < -1.e-16) U += PIPI;
1369 else if (U < 0) U = 0;
1371 // Evaluate V as follows :
1372 // P0 = Cone.Value(U,0)
1373 // P1 = Cone.Value(U,1)
1374 // V = P0 P1 . P0 Ploc
1375 // After simplification obtain:
1376 // V = Sin(Sang) * ( x cosU + y SinU - R) + z * Cos(Sang)
1377 // Method that permits to find V of the projected point if the point
1378 // is not actually on the cone.
1380 V = sin(SAngle) * ( Ploc.X() * cos(U) + Ploc.Y() * sin(U) - Radius)
1381 + cos(SAngle) * Ploc.Z();
1384 //=======================================================================
1385 //function : SphereParameters
1387 //=======================================================================
1389 void ElSLib::SphereParameters(const gp_Ax3& Pos,
1390 const Standard_Real,
1396 T.SetTransformation (Pos);
1397 gp_Pnt Ploc = P.Transformed (T);
1398 Standard_Real x, y, z;
1399 Ploc.Coord (x, y, z);
1400 Standard_Real l = sqrt (x * x + y * y);
1401 if (l < gp::Resolution()) { // point on axis Z of the sphere
1403 V = M_PI_2; // PI * 0.5
1405 V = - M_PI_2; // PI * 0.5
1411 if (U < -1.e-16) U += PIPI;
1412 else if (U < 0) U = 0;
1416 //=======================================================================
1417 //function : TorusParameters
1419 //=======================================================================
1421 void ElSLib::TorusParameters(const gp_Ax3& Pos,
1422 const Standard_Real MajorRadius,
1423 const Standard_Real MinorRadius,
1429 Tref.SetTransformation (Pos);
1430 gp_Pnt Ploc = P.Transformed (Tref);
1431 Standard_Real x, y, z;
1432 Ploc.Coord (x, y, z);
1434 // all that to process case of Major < Minor.
1436 if (MajorRadius < MinorRadius){
1437 Standard_Real cosu = cos(U);
1438 Standard_Real sinu = sin(U);
1439 Standard_Real z2 = z * z;
1440 Standard_Real MinR2 = MinorRadius * MinorRadius;
1441 Standard_Real RCosU = MajorRadius * cosu;
1442 Standard_Real RSinU = MajorRadius * sinu;
1443 Standard_Real xm = x - RCosU;
1444 Standard_Real ym = y - RSinU;
1445 Standard_Real xp = x + RCosU;
1446 Standard_Real yp = y + RSinU;
1447 Standard_Real D1 = xm * xm + ym * ym + z2 - MinR2;
1448 Standard_Real D2 = xp * xp + yp * yp + z2 - MinR2;
1449 Standard_Real AD1 = D1;
1450 if (AD1 < 0) AD1 = - AD1;
1451 Standard_Real AD2 = D2;
1452 if (AD2 < 0) AD2 = - AD2;
1453 if (AD2 < AD1) U += PI;
1455 if (U < -1.e-16) U += PIPI;
1456 else if (U < 0) U = 0;
1457 Standard_Real cosu = cos(U);
1458 Standard_Real sinu = sin(U);
1459 gp_Dir dx(cosu,sinu,0.);
1460 gp_Dir dP(x - MajorRadius * cosu,
1461 y - MajorRadius * sinu,
1463 V = dx.AngleWithRef(dP,dx^gp::DZ());
1464 if (V < -1.e-16) V += PIPI;
1465 else if (V < 0) V = 0;
1468 //=======================================================================
1469 //function : PlaneUIso
1471 //=======================================================================
1473 gp_Lin ElSLib::PlaneUIso(const gp_Ax3& Pos,
1474 const Standard_Real U)
1476 gp_Lin L(Pos.Location(),Pos.YDirection());
1477 gp_Vec Ve(Pos.XDirection());
1483 //=======================================================================
1484 //function : CylinderUIso
1486 //=======================================================================
1488 gp_Lin ElSLib::CylinderUIso(const gp_Ax3& Pos,
1489 const Standard_Real Radius,
1490 const Standard_Real U)
1494 CylinderD1(U,0.,Pos,Radius,P,DU,DV);
1499 //=======================================================================
1500 //function : ConeUIso
1502 //=======================================================================
1504 gp_Lin ElSLib::ConeUIso(const gp_Ax3& Pos,
1505 const Standard_Real Radius,
1506 const Standard_Real SAngle,
1507 const Standard_Real U)
1511 ConeD1(U,0,Pos,Radius,SAngle,P,DU,DV);
1516 //=======================================================================
1517 //function : SphereUIso
1519 //=======================================================================
1521 gp_Circ ElSLib::SphereUIso(const gp_Ax3& Pos,
1522 const Standard_Real Radius,
1523 const Standard_Real U)
1525 gp_Vec dx = Pos.XDirection();
1526 gp_Vec dy = Pos.YDirection();
1527 gp_Dir dz = Pos.Direction ();
1528 gp_Dir cx = cos(U) * dx + sin(U) * dy;
1529 gp_Ax2 axes(Pos.Location(),
1532 gp_Circ Circ(axes,Radius);
1536 //=======================================================================
1537 //function : TorusUIso
1539 //=======================================================================
1541 gp_Circ ElSLib::TorusUIso(const gp_Ax3& Pos,
1542 const Standard_Real MajorRadius,
1543 const Standard_Real MinorRadius,
1544 const Standard_Real U)
1546 gp_Vec dx = Pos.XDirection();
1547 gp_Vec dy = Pos.YDirection();
1548 gp_Dir dz = Pos.Direction ();
1549 gp_Dir cx = cos(U) * dx + sin(U) * dy;
1550 gp_Ax2 axes(Pos.Location(),
1556 gp_Circ Circ(axes,MinorRadius);
1560 //=======================================================================
1561 //function : PlaneVIso
1563 //=======================================================================
1565 gp_Lin ElSLib::PlaneVIso(const gp_Ax3& Pos,
1566 const Standard_Real V)
1568 gp_Lin L(Pos.Location(),Pos.XDirection());
1569 gp_Vec Ve(Pos.YDirection());
1575 //=======================================================================
1576 //function : CylinderVIso
1578 //=======================================================================
1580 gp_Circ ElSLib::CylinderVIso(const gp_Ax3& Pos,
1581 const Standard_Real Radius,
1582 const Standard_Real V)
1584 gp_Ax2 axes = Pos.Ax2();
1585 gp_Vec Ve(Pos.Direction());
1588 gp_Circ C(axes,Radius);
1592 //=======================================================================
1593 //function : ConeVIso
1595 //=======================================================================
1597 gp_Circ ElSLib::ConeVIso(const gp_Ax3& Pos,
1598 const Standard_Real Radius,
1599 const Standard_Real SAngle,
1600 const Standard_Real V)
1603 gp_Vec Ve(Pos.Direction());
1604 Ve.Multiply(V * cos(SAngle));
1606 Standard_Real R = Radius + V * sin(SAngle);
1612 gp_Circ C(axes.Ax2(),R);
1616 //=======================================================================
1617 //function : SphereVIso
1619 //=======================================================================
1621 gp_Circ ElSLib::SphereVIso(const gp_Ax3& Pos,
1622 const Standard_Real Radius,
1623 const Standard_Real V)
1625 gp_Ax2 axes = Pos.Ax2();
1626 gp_Vec Ve(Pos.Direction());
1627 Ve.Multiply(Radius * sin(V));
1629 Standard_Real radius = Radius * cos(V);
1630 gp_Circ Circ(axes,radius);
1634 //=======================================================================
1635 //function : TorusVIso
1637 //=======================================================================
1639 gp_Circ ElSLib::TorusVIso(const gp_Ax3& Pos,
1640 const Standard_Real MajorRadius,
1641 const Standard_Real MinorRadius,
1642 const Standard_Real V)
1644 gp_Ax3 axes = Pos.Ax2();
1645 gp_Vec Ve(Pos.Direction());
1646 Ve.Multiply(MinorRadius * sin(V));
1648 Standard_Real R = MajorRadius + MinorRadius * cos(V);
1654 gp_Circ Circ(axes.Ax2(),R);