1 // Copyright: Matra-Datavision 1995
2 // File: Select2D_SensitiveArc.cxx
3 // Created: Tue May 23 13:22:33 1995
4 // Author: Robert COUBLANC
9 #include <Select2D_SensitiveArc.ixx>
10 #include <Bnd_Box2d.hxx>
11 #include <gp_Pnt2d.hxx>
12 #include <gp_Vec2d.hxx>
13 #include <Precision.hxx>
19 //==================================================
20 // Function: Constructor
22 //==================================================
24 Select2D_SensitiveArc::
25 Select2D_SensitiveArc(const Handle(SelectBasics_EntityOwner)& OwnerId,
26 const gp_Ax2d& OriginAxis,
27 const Standard_Real Angle,
28 const Standard_Real Radius,
29 const Standard_Integer NbPoints):
30 Select2D_SensitiveEntity(OwnerId),
37 if(myangle<=Precision::Confusion()) myangle=2*M_PI;
41 //=====================================================
44 //=====================================================
46 void Select2D_SensitiveArc::
47 Areas (SelectBasics_ListOfBox2d& boxes)
50 Standard_Real deteta =myangle/mynbpt;
53 gp_Pnt2d P1 = myax2d.Location().Translated(gp_Vec2d(myax2d.Direction())*myradius);
56 for(Standard_Integer i=1;i<=mynbpt;i++){
57 abox.Add(P1.Rotated(myax2d.Location(),deteta*i));}
62 //=====================================================
65 //=====================================================
66 Standard_Boolean Select2D_SensitiveArc::
67 Matches (const Standard_Real X,
68 const Standard_Real Y,
69 const Standard_Real aTol,
72 Standard_Real TheTol = HasOwnTolerance()? myOwnTolerance : aTol;
75 Standard_Real Angle = (gp_Dir2d(gp_Vec2d(myax2d.Location(),Pick))).Angle(myax2d.Direction());
76 if(Angle<0 && Angle>myangle) return Standard_False;
79 DMin =myax2d.Location().Distance(Pick);
80 if (DMin>myradius-TheTol&&DMin<=myradius+TheTol) return Standard_True;
82 return Standard_False;
85 Standard_Boolean Select2D_SensitiveArc::
86 Matches (const Standard_Real XMin,
87 const Standard_Real YMin,
88 const Standard_Real XMax,
89 const Standard_Real YMax,
90 const Standard_Real aTol)
92 Standard_Real TheTol = HasOwnTolerance()? myOwnTolerance : aTol;
93 if(mynbpt<1) return Standard_True; //to avoid problems...
95 Standard_Real deteta = myangle/mynbpt;
97 BoundBox.Update(XMin-TheTol,YMin-TheTol,XMax+TheTol,YMax+TheTol);
98 gp_Pnt2d ExtPt = myax2d.Location().Translated(gp_Vec2d(myax2d.Direction())*myradius);
100 if(BoundBox.IsOut(ExtPt)) return Standard_False;
102 for (Standard_Integer I=1;I<=mynbpt;I++)
104 if(BoundBox.IsOut(ExtPt.Rotated(myax2d.Location(),deteta*I))) return Standard_False;
106 return Standard_True;