ROOT logo
/**************************************************************************
* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
*                                                                        *
* Author: The ALICE Off-line Project.                                    *
* Contributors are mentioned in the code where appropriate.              *
*                                                                        *
* Permission to use, copy, modify and distribute this software and its   *
* documentation strictly for non-commercial purposes is hereby granted   *
* without fee, provided that the above copyright notice appears in all   *
* copies and that both the copyright notice and this permission notice   *
* appear in the supporting documentation. The authors make no claims     *
* about the suitability of this software for any purpose. It is          *
* provided "as is" without express or implied warranty.                  *
**************************************************************************/

// $Id$

/// \class AliMUONPolygon
///
/// A simple planar polygon, with a given orientation
///
/// \author Laurent Aphecetche, Subatech

#include "AliMUONPolygon.h"

#include "AliLog.h"
#include "Riostream.h"
#include "TMath.h"

using std::cout;
using std::endl;
///\cond CLASSIMP
ClassImp(AliMUONPolygon)
///\endcond

//_____________________________________________________________________________
AliMUONPolygon::AliMUONPolygon(Int_t nvertices) 
: TObject(),
fN(nvertices),
fX(new Double_t[fN]),
fY(new Double_t[fN])
{
  /// Ctor with a predefined number of vertices.
}

//_____________________________________________________________________________
AliMUONPolygon::AliMUONPolygon(Double_t xpos, Double_t ypos, Double_t halfsizex, Double_t halfsizey)
: TObject(),
fN(5),
fX(new Double_t[fN]),
fY(new Double_t[fN])
{
  /// Ctor. Polygon will be a rectangle.
  
  
  double xmin(xpos-halfsizex);
  double xmax(xpos+halfsizex);
  double ymin(ypos-halfsizey);
  double ymax(ypos+halfsizey);

  SetVertex(0,xmin,ymin);
  SetVertex(1,xmax,ymin);
  SetVertex(2,xmax,ymax);
  SetVertex(3,xmin,ymax);
  
  Close();
}


//_____________________________________________________________________________
AliMUONPolygon::~AliMUONPolygon()
{
  /// dtor
  delete[] fX;
  delete[] fY;
}

//______________________________________________________________________________
AliMUONPolygon::AliMUONPolygon(const AliMUONPolygon& rhs) 
: TObject(rhs), 
fN(rhs.fN),
fX(0x0),
fY(0x0)
{
  /// Copy constructor.
  
  if ( fN > 0 ) 
  {
    fX = new Double_t[fN];
    fY = new Double_t[fN];
    
    for ( Int_t i = 0; i < fN; ++i )
    {
      fX[i] = rhs.fX[i];
      fY[i] = rhs.fY[i];
    }
    
  }
  
}

//______________________________________________________________________________
AliMUONPolygon&
AliMUONPolygon::operator=(const AliMUONPolygon& rhs)
{
  /// Assignment operator
  if ( this != &rhs ) 
  {
    static_cast<TObject&>(*this)=rhs;

    delete[] fX;
    delete[] fY;
    
    fX = 0;
    fY = 0;
    
    fN = rhs.fN;
    
    if ( fN > 0 ) 
    {
      fX = new Double_t[fN];
      fY = new Double_t[fN];
      
      for ( Int_t i = 0; i < fN; ++i )
      {
        fX[i] = rhs.fX[i];
        fY[i] = rhs.fY[i];
      }
      
    }
  }
  return *this;
}

//______________________________________________________________________________
Bool_t
AliMUONPolygon::Contains(Double_t x, Double_t y) const
{
  /// Whether the polygon contains point (x,y)
  
  // Note that the polygon must be a closed polygon (1st and last point
  // must be identical), which should be the case here.

  return TMath::IsInside(x,y,fN,fX,fY);
}

//_____________________________________________________________________________
void
AliMUONPolygon::Close()
{
  /// Make that last point = first point
  
  SetVertex(fN-1,X(0),Y(0));
}

//_____________________________________________________________________________
void AliMUONPolygon::Print(Option_t*) const
{
  /// Printout
  cout << Form("AliMUONPolygon : %3d vertices. Signed Area=%e",NumberOfVertices(),SignedArea()) << endl;
  for ( Int_t i = 0; i < NumberOfVertices(); ++i )
  {
    cout << Form("%10.5f,%10.5f",X(i),Y(i)) << endl;
  }
}

//_____________________________________________________________________________
Double_t 
AliMUONPolygon::SignedArea() const
{
  /// Compute the signed area of this polygon
  /// Algorithm from F. Feito, J.C. Torres and A. Urena,
  /// Comput. & Graphics, Vol. 19, pp. 595-600, 1995
  
  Double_t area(0.0);
  
  for ( Int_t i = 0; i < NumberOfVertices()-1; ++i ) 
  {
    area += X(i)*Y(i+1) - X(i+1)*Y(i);
  }
 
  return area;
}

//_____________________________________________________________________________
void 
AliMUONPolygon::ReverseOrientation()
{
  /// Reverse the orientation of this polygon
  Double_t* x = new Double_t[fN];
  Double_t* y = new Double_t[fN];
  
  for ( Int_t i = fN-1; i >= 0; --i )
  {
    x[i] = X(fN-i-1);
    y[i] = Y(fN-i-1);
  }

  delete[] fX;
  delete[] fY;
  
  fX = x;
  fY = y;
}

//_____________________________________________________________________________
void 
AliMUONPolygon::SetVertex(Int_t i, Double_t x, Double_t y)
{
  /// Set one vertex
  if ( i >= fN ) 
  {
    AliFatal("Wrong index");
  }
  fX[i] = x;
  fY[i] = y;
}

 AliMUONPolygon.cxx:1
 AliMUONPolygon.cxx:2
 AliMUONPolygon.cxx:3
 AliMUONPolygon.cxx:4
 AliMUONPolygon.cxx:5
 AliMUONPolygon.cxx:6
 AliMUONPolygon.cxx:7
 AliMUONPolygon.cxx:8
 AliMUONPolygon.cxx:9
 AliMUONPolygon.cxx:10
 AliMUONPolygon.cxx:11
 AliMUONPolygon.cxx:12
 AliMUONPolygon.cxx:13
 AliMUONPolygon.cxx:14
 AliMUONPolygon.cxx:15
 AliMUONPolygon.cxx:16
 AliMUONPolygon.cxx:17
 AliMUONPolygon.cxx:18
 AliMUONPolygon.cxx:19
 AliMUONPolygon.cxx:20
 AliMUONPolygon.cxx:21
 AliMUONPolygon.cxx:22
 AliMUONPolygon.cxx:23
 AliMUONPolygon.cxx:24
 AliMUONPolygon.cxx:25
 AliMUONPolygon.cxx:26
 AliMUONPolygon.cxx:27
 AliMUONPolygon.cxx:28
 AliMUONPolygon.cxx:29
 AliMUONPolygon.cxx:30
 AliMUONPolygon.cxx:31
 AliMUONPolygon.cxx:32
 AliMUONPolygon.cxx:33
 AliMUONPolygon.cxx:34
 AliMUONPolygon.cxx:35
 AliMUONPolygon.cxx:36
 AliMUONPolygon.cxx:37
 AliMUONPolygon.cxx:38
 AliMUONPolygon.cxx:39
 AliMUONPolygon.cxx:40
 AliMUONPolygon.cxx:41
 AliMUONPolygon.cxx:42
 AliMUONPolygon.cxx:43
 AliMUONPolygon.cxx:44
 AliMUONPolygon.cxx:45
 AliMUONPolygon.cxx:46
 AliMUONPolygon.cxx:47
 AliMUONPolygon.cxx:48
 AliMUONPolygon.cxx:49
 AliMUONPolygon.cxx:50
 AliMUONPolygon.cxx:51
 AliMUONPolygon.cxx:52
 AliMUONPolygon.cxx:53
 AliMUONPolygon.cxx:54
 AliMUONPolygon.cxx:55
 AliMUONPolygon.cxx:56
 AliMUONPolygon.cxx:57
 AliMUONPolygon.cxx:58
 AliMUONPolygon.cxx:59
 AliMUONPolygon.cxx:60
 AliMUONPolygon.cxx:61
 AliMUONPolygon.cxx:62
 AliMUONPolygon.cxx:63
 AliMUONPolygon.cxx:64
 AliMUONPolygon.cxx:65
 AliMUONPolygon.cxx:66
 AliMUONPolygon.cxx:67
 AliMUONPolygon.cxx:68
 AliMUONPolygon.cxx:69
 AliMUONPolygon.cxx:70
 AliMUONPolygon.cxx:71
 AliMUONPolygon.cxx:72
 AliMUONPolygon.cxx:73
 AliMUONPolygon.cxx:74
 AliMUONPolygon.cxx:75
 AliMUONPolygon.cxx:76
 AliMUONPolygon.cxx:77
 AliMUONPolygon.cxx:78
 AliMUONPolygon.cxx:79
 AliMUONPolygon.cxx:80
 AliMUONPolygon.cxx:81
 AliMUONPolygon.cxx:82
 AliMUONPolygon.cxx:83
 AliMUONPolygon.cxx:84
 AliMUONPolygon.cxx:85
 AliMUONPolygon.cxx:86
 AliMUONPolygon.cxx:87
 AliMUONPolygon.cxx:88
 AliMUONPolygon.cxx:89
 AliMUONPolygon.cxx:90
 AliMUONPolygon.cxx:91
 AliMUONPolygon.cxx:92
 AliMUONPolygon.cxx:93
 AliMUONPolygon.cxx:94
 AliMUONPolygon.cxx:95
 AliMUONPolygon.cxx:96
 AliMUONPolygon.cxx:97
 AliMUONPolygon.cxx:98
 AliMUONPolygon.cxx:99
 AliMUONPolygon.cxx:100
 AliMUONPolygon.cxx:101
 AliMUONPolygon.cxx:102
 AliMUONPolygon.cxx:103
 AliMUONPolygon.cxx:104
 AliMUONPolygon.cxx:105
 AliMUONPolygon.cxx:106
 AliMUONPolygon.cxx:107
 AliMUONPolygon.cxx:108
 AliMUONPolygon.cxx:109
 AliMUONPolygon.cxx:110
 AliMUONPolygon.cxx:111
 AliMUONPolygon.cxx:112
 AliMUONPolygon.cxx:113
 AliMUONPolygon.cxx:114
 AliMUONPolygon.cxx:115
 AliMUONPolygon.cxx:116
 AliMUONPolygon.cxx:117
 AliMUONPolygon.cxx:118
 AliMUONPolygon.cxx:119
 AliMUONPolygon.cxx:120
 AliMUONPolygon.cxx:121
 AliMUONPolygon.cxx:122
 AliMUONPolygon.cxx:123
 AliMUONPolygon.cxx:124
 AliMUONPolygon.cxx:125
 AliMUONPolygon.cxx:126
 AliMUONPolygon.cxx:127
 AliMUONPolygon.cxx:128
 AliMUONPolygon.cxx:129
 AliMUONPolygon.cxx:130
 AliMUONPolygon.cxx:131
 AliMUONPolygon.cxx:132
 AliMUONPolygon.cxx:133
 AliMUONPolygon.cxx:134
 AliMUONPolygon.cxx:135
 AliMUONPolygon.cxx:136
 AliMUONPolygon.cxx:137
 AliMUONPolygon.cxx:138
 AliMUONPolygon.cxx:139
 AliMUONPolygon.cxx:140
 AliMUONPolygon.cxx:141
 AliMUONPolygon.cxx:142
 AliMUONPolygon.cxx:143
 AliMUONPolygon.cxx:144
 AliMUONPolygon.cxx:145
 AliMUONPolygon.cxx:146
 AliMUONPolygon.cxx:147
 AliMUONPolygon.cxx:148
 AliMUONPolygon.cxx:149
 AliMUONPolygon.cxx:150
 AliMUONPolygon.cxx:151
 AliMUONPolygon.cxx:152
 AliMUONPolygon.cxx:153
 AliMUONPolygon.cxx:154
 AliMUONPolygon.cxx:155
 AliMUONPolygon.cxx:156
 AliMUONPolygon.cxx:157
 AliMUONPolygon.cxx:158
 AliMUONPolygon.cxx:159
 AliMUONPolygon.cxx:160
 AliMUONPolygon.cxx:161
 AliMUONPolygon.cxx:162
 AliMUONPolygon.cxx:163
 AliMUONPolygon.cxx:164
 AliMUONPolygon.cxx:165
 AliMUONPolygon.cxx:166
 AliMUONPolygon.cxx:167
 AliMUONPolygon.cxx:168
 AliMUONPolygon.cxx:169
 AliMUONPolygon.cxx:170
 AliMUONPolygon.cxx:171
 AliMUONPolygon.cxx:172
 AliMUONPolygon.cxx:173
 AliMUONPolygon.cxx:174
 AliMUONPolygon.cxx:175
 AliMUONPolygon.cxx:176
 AliMUONPolygon.cxx:177
 AliMUONPolygon.cxx:178
 AliMUONPolygon.cxx:179
 AliMUONPolygon.cxx:180
 AliMUONPolygon.cxx:181
 AliMUONPolygon.cxx:182
 AliMUONPolygon.cxx:183
 AliMUONPolygon.cxx:184
 AliMUONPolygon.cxx:185
 AliMUONPolygon.cxx:186
 AliMUONPolygon.cxx:187
 AliMUONPolygon.cxx:188
 AliMUONPolygon.cxx:189
 AliMUONPolygon.cxx:190
 AliMUONPolygon.cxx:191
 AliMUONPolygon.cxx:192
 AliMUONPolygon.cxx:193
 AliMUONPolygon.cxx:194
 AliMUONPolygon.cxx:195
 AliMUONPolygon.cxx:196
 AliMUONPolygon.cxx:197
 AliMUONPolygon.cxx:198
 AliMUONPolygon.cxx:199
 AliMUONPolygon.cxx:200
 AliMUONPolygon.cxx:201
 AliMUONPolygon.cxx:202
 AliMUONPolygon.cxx:203
 AliMUONPolygon.cxx:204
 AliMUONPolygon.cxx:205
 AliMUONPolygon.cxx:206
 AliMUONPolygon.cxx:207
 AliMUONPolygon.cxx:208
 AliMUONPolygon.cxx:209
 AliMUONPolygon.cxx:210
 AliMUONPolygon.cxx:211
 AliMUONPolygon.cxx:212
 AliMUONPolygon.cxx:213
 AliMUONPolygon.cxx:214
 AliMUONPolygon.cxx:215
 AliMUONPolygon.cxx:216
 AliMUONPolygon.cxx:217
 AliMUONPolygon.cxx:218