Adding protections
[u/mrichter/AliRoot.git] / MUON / AliMUONPolygon.cxx
1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 *                                                                        *
4 * Author: The ALICE Off-line Project.                                    *
5 * Contributors are mentioned in the code where appropriate.              *
6 *                                                                        *
7 * Permission to use, copy, modify and distribute this software and its   *
8 * documentation strictly for non-commercial purposes is hereby granted   *
9 * without fee, provided that the above copyright notice appears in all   *
10 * copies and that both the copyright notice and this permission notice   *
11 * appear in the supporting documentation. The authors make no claims     *
12 * about the suitability of this software for any purpose. It is          *
13 * provided "as is" without express or implied warranty.                  *
14 **************************************************************************/
15
16 // $Id$
17
18 /// \class AliMUONPolygon
19 ///
20 /// A simple planar polygon, with a given orientation
21 ///
22 /// \author Laurent Aphecetche, Subatech
23
24 #include "AliMUONPolygon.h"
25
26 #include "AliLog.h"
27 #include "Riostream.h"
28 #include "TMath.h"
29
30 ///\cond CLASSIMP
31 ClassImp(AliMUONPolygon)
32 ///\endcond
33
34 //_____________________________________________________________________________
35 AliMUONPolygon::AliMUONPolygon(Int_t nvertices) 
36 : TObject(),
37 fN(nvertices),
38 fX(new Double_t[fN]),
39 fY(new Double_t[fN])
40 {
41   /// Ctor with a predefined number of vertices.
42 }
43
44 //_____________________________________________________________________________
45 AliMUONPolygon::AliMUONPolygon(Double_t xpos, Double_t ypos, Double_t halfsizex, Double_t halfsizey)
46 : TObject(),
47 fN(5),
48 fX(new Double_t[fN]),
49 fY(new Double_t[fN])
50 {
51   /// Ctor. Polygon will be a rectangle.
52   
53   
54   double xmin(xpos-halfsizex);
55   double xmax(xpos+halfsizex);
56   double ymin(ypos-halfsizey);
57   double ymax(ypos+halfsizey);
58
59   SetVertex(0,xmin,ymin);
60   SetVertex(1,xmax,ymin);
61   SetVertex(2,xmax,ymax);
62   SetVertex(3,xmin,ymax);
63   
64   Close();
65 }
66
67
68 //_____________________________________________________________________________
69 AliMUONPolygon::~AliMUONPolygon()
70 {
71   /// dtor
72   delete[] fX;
73   delete[] fY;
74 }
75
76 //______________________________________________________________________________
77 AliMUONPolygon::AliMUONPolygon(const AliMUONPolygon& rhs) 
78 : TObject(rhs), 
79 fN(0),
80 fX(0x0),
81 fY(0x0)
82 {
83   /// Copy constructor.
84   
85   ((AliMUONPolygon&)rhs).Copy(*this);
86 }
87
88 //______________________________________________________________________________
89 AliMUONPolygon&
90 AliMUONPolygon::operator=(const AliMUONPolygon& rhs)
91 {
92   /// Assignment operator
93   if ( this != &rhs ) 
94   {
95     rhs.Copy(*this);
96   }
97   return *this;
98 }
99
100 //______________________________________________________________________________
101 Bool_t
102 AliMUONPolygon::Contains(Double_t x, Double_t y) const
103 {
104   /// Whether the polygon contains point (x,y)
105   
106   // Note that the polygon must be a closed polygon (1st and last point
107   // must be identical), which should be the case here.
108
109   return TMath::IsInside(x,y,fN,fX,fY);
110 }
111
112 //______________________________________________________________________________
113 void AliMUONPolygon::Copy(TObject& obj) const
114 {
115   /// Copy this to obj
116   
117   AliMUONPolygon& rhs = static_cast<AliMUONPolygon&>(obj);
118
119   Double_t* x(0x0);
120   Double_t* y(0x0);
121   
122   if ( fN > 0 )
123   {
124     x = new Double_t[fN];
125     y = new Double_t[fN];
126     
127     for ( Int_t i = 0; i < fN; ++i )
128     {
129       x[i] = fX[i];
130       y[i] = fY[i];
131     }
132   
133   }
134   
135   delete [] rhs.fX;
136   delete [] rhs.fY;
137   
138   rhs.fX = x;
139   rhs.fY = y;
140   rhs.fN = fN;  
141 }
142
143 //_____________________________________________________________________________
144 void
145 AliMUONPolygon::Close()
146 {
147   /// Make that last point = first point
148   
149   SetVertex(fN-1,X(0),Y(0));
150 }
151
152 //_____________________________________________________________________________
153 void AliMUONPolygon::Print(Option_t*) const
154 {
155   /// Printout
156   cout << Form("AliMUONPolygon : %3d vertices. Signed Area=%e",NumberOfVertices(),SignedArea()) << endl;
157   for ( Int_t i = 0; i < NumberOfVertices(); ++i )
158   {
159     cout << Form("%10.5f,%10.5f",X(i),Y(i)) << endl;
160   }
161 }
162
163 //_____________________________________________________________________________
164 Double_t 
165 AliMUONPolygon::SignedArea() const
166 {
167   /// Compute the signed area of this polygon
168   /// Algorithm from F. Feito, J.C. Torres and A. Urena,
169   /// Comput. & Graphics, Vol. 19, pp. 595-600, 1995
170   
171   Double_t area(0.0);
172   
173   for ( Int_t i = 0; i < NumberOfVertices()-1; ++i ) 
174   {
175     area += X(i)*Y(i+1) - X(i+1)*Y(i);
176   }
177  
178   return area;
179 }
180
181 //_____________________________________________________________________________
182 void 
183 AliMUONPolygon::ReverseOrientation()
184 {
185   /// Reverse the orientation of this polygon
186   Double_t* x = new Double_t[fN];
187   Double_t* y = new Double_t[fN];
188   
189   for ( Int_t i = fN-1; i >= 0; --i )
190   {
191     x[i] = X(fN-i-1);
192     y[i] = Y(fN-i-1);
193   }
194
195   delete[] fX;
196   delete[] fY;
197   
198   fX = x;
199   fY = y;
200 }
201
202 //_____________________________________________________________________________
203 void 
204 AliMUONPolygon::SetVertex(Int_t i, Double_t x, Double_t y)
205 {
206   /// Set one vertex
207   if ( i >= fN ) 
208   {
209     AliFatal("Wrong index");
210   }
211   fX[i] = x;
212   fY[i] = y;
213 }
214