ROBAST logo
/******************************************************************************
 * Copyright (C) 2006-, Akira Okumura                                         *
 * All rights reserved.                                                       *
 *****************************************************************************/

///////////////////////////////////////////////////////////////////////////////
//
// AGeoBezierPgon
//
// Geometry class for Pgon-like volume, but the side surfaces are defined by
// a Bezier curve (http://en.wikipedia.org/wiki/Bˇzier_curve)
//
///////////////////////////////////////////////////////////////////////////////

#include "AGeoBezierPgon.h"

ClassImp(AGeoBezierPgon);

//_____________________________________________________________________________
AGeoBezierPgon::AGeoBezierPgon() : TGeoPgon() {
  // Default constructor
}

//_____________________________________________________________________________
AGeoBezierPgon::AGeoBezierPgon(Double_t phi, Double_t dphi, Int_t nedges,
                               Int_t nz, Double_t r1, Double_t r2, Double_t dz)
    : TGeoPgon(phi, dphi, nedges, nz), fLength(dz * 2), fR1(r1), fR2(r2) {
  fNcontrol = 0;
}

//_____________________________________________________________________________
AGeoBezierPgon::AGeoBezierPgon(const char* name, Double_t phi, Double_t dphi,
                               Int_t nedges, Int_t nz, Double_t r1, Double_t r2,
                               Double_t dz)
    : TGeoPgon(name, phi, dphi, nedges, nz), fLength(dz * 2), fR1(r1), fR2(r2) {
  fNcontrol = 0;
}

//_____________________________________________________________________________
AGeoBezierPgon::~AGeoBezierPgon() {
  // destructor
}
//_____________________________________________________________________________
void AGeoBezierPgon::Bezier(Double_t t, Double_t& r, Double_t& z) {
  TVector2 P0(0, 0);
  TVector2 B;
  if (fNcontrol == 0) {
    TVector2 P1(1, 1);
    B = (1 - t) * P0 + t * P1;
  } else if (fNcontrol == 1) {
    TVector2 P2(1, 1);
    B = (1 - t) * (1 - t) * P0 + 2 * (1 - t) * t * fP1 + t * t * P2;
  } else if (fNcontrol == 2) {
    TVector2 P3(1, 1);
    B = (1 - t) * (1 - t) * (1 - t) * P0 + 3 * (1 - t) * (1 - t) * t * fP1 +
        3 * (1 - t) * t * t * fP2 + t * t * t * P3;
  }

  r = fR2 + B.X() * (fR1 - fR2);
  z = -fLength / 2. + B.Y() * fLength;
}

//_____________________________________________________________________________
void AGeoBezierPgon::SetControlPoints(Double_t r1, Double_t z1) {
  // Set the relative coordinates of control point 1
  // (r1, z1) must be given in relative coordinates against P0 and P2
  // For example, when (r1, z1) = (0.6, 0.7), the coordinates of P1 is
  // (R, Z) = (R2 + 0.6*(R1 - R2), -DZ + 0.7*(+DZ - (-DZ)))
  // The Bezier curve becomes quadratic
  //
  // Z
  // ^
  // |<--R1-->P2 (R1, +DZ)
  // |        /
  // |       /  P1
  // |      /
  // +-----P0---------> R
  // |<-R2-> (R2, -DZ)
  fNcontrol = 1;
  fP1.Set(r1, z1);
  fP2.Set(0., 0.);
  SetSections();
}

//_____________________________________________________________________________
void AGeoBezierPgon::SetControlPoints(Double_t r1, Double_t z1, Double_t r2,
                                      Double_t z2) {
  // Set the relative coordinates of control points 1 and 2
  // The Bezier curve becomes cubic
  fNcontrol = 2;
  fP1.Set(r1, z1);
  fP2.Set(r2, z2);
  SetSections();
}

//_____________________________________________________________________________
void AGeoBezierPgon::SetSections() {
  for (Int_t i = 0; i < fNz; i++) {
    Double_t t = Double_t(i) / (fNz - 1);
    Double_t r, z;
    Bezier(t, r, z);
    DefineSection(i, z, 0, r);
  }
}
 AGeoBezierPgon.cxx:1
 AGeoBezierPgon.cxx:2
 AGeoBezierPgon.cxx:3
 AGeoBezierPgon.cxx:4
 AGeoBezierPgon.cxx:5
 AGeoBezierPgon.cxx:6
 AGeoBezierPgon.cxx:7
 AGeoBezierPgon.cxx:8
 AGeoBezierPgon.cxx:9
 AGeoBezierPgon.cxx:10
 AGeoBezierPgon.cxx:11
 AGeoBezierPgon.cxx:12
 AGeoBezierPgon.cxx:13
 AGeoBezierPgon.cxx:14
 AGeoBezierPgon.cxx:15
 AGeoBezierPgon.cxx:16
 AGeoBezierPgon.cxx:17
 AGeoBezierPgon.cxx:18
 AGeoBezierPgon.cxx:19
 AGeoBezierPgon.cxx:20
 AGeoBezierPgon.cxx:21
 AGeoBezierPgon.cxx:22
 AGeoBezierPgon.cxx:23
 AGeoBezierPgon.cxx:24
 AGeoBezierPgon.cxx:25
 AGeoBezierPgon.cxx:26
 AGeoBezierPgon.cxx:27
 AGeoBezierPgon.cxx:28
 AGeoBezierPgon.cxx:29
 AGeoBezierPgon.cxx:30
 AGeoBezierPgon.cxx:31
 AGeoBezierPgon.cxx:32
 AGeoBezierPgon.cxx:33
 AGeoBezierPgon.cxx:34
 AGeoBezierPgon.cxx:35
 AGeoBezierPgon.cxx:36
 AGeoBezierPgon.cxx:37
 AGeoBezierPgon.cxx:38
 AGeoBezierPgon.cxx:39
 AGeoBezierPgon.cxx:40
 AGeoBezierPgon.cxx:41
 AGeoBezierPgon.cxx:42
 AGeoBezierPgon.cxx:43
 AGeoBezierPgon.cxx:44
 AGeoBezierPgon.cxx:45
 AGeoBezierPgon.cxx:46
 AGeoBezierPgon.cxx:47
 AGeoBezierPgon.cxx:48
 AGeoBezierPgon.cxx:49
 AGeoBezierPgon.cxx:50
 AGeoBezierPgon.cxx:51
 AGeoBezierPgon.cxx:52
 AGeoBezierPgon.cxx:53
 AGeoBezierPgon.cxx:54
 AGeoBezierPgon.cxx:55
 AGeoBezierPgon.cxx:56
 AGeoBezierPgon.cxx:57
 AGeoBezierPgon.cxx:58
 AGeoBezierPgon.cxx:59
 AGeoBezierPgon.cxx:60
 AGeoBezierPgon.cxx:61
 AGeoBezierPgon.cxx:62
 AGeoBezierPgon.cxx:63
 AGeoBezierPgon.cxx:64
 AGeoBezierPgon.cxx:65
 AGeoBezierPgon.cxx:66
 AGeoBezierPgon.cxx:67
 AGeoBezierPgon.cxx:68
 AGeoBezierPgon.cxx:69
 AGeoBezierPgon.cxx:70
 AGeoBezierPgon.cxx:71
 AGeoBezierPgon.cxx:72
 AGeoBezierPgon.cxx:73
 AGeoBezierPgon.cxx:74
 AGeoBezierPgon.cxx:75
 AGeoBezierPgon.cxx:76
 AGeoBezierPgon.cxx:77
 AGeoBezierPgon.cxx:78
 AGeoBezierPgon.cxx:79
 AGeoBezierPgon.cxx:80
 AGeoBezierPgon.cxx:81
 AGeoBezierPgon.cxx:82
 AGeoBezierPgon.cxx:83
 AGeoBezierPgon.cxx:84
 AGeoBezierPgon.cxx:85
 AGeoBezierPgon.cxx:86
 AGeoBezierPgon.cxx:87
 AGeoBezierPgon.cxx:88
 AGeoBezierPgon.cxx:89
 AGeoBezierPgon.cxx:90
 AGeoBezierPgon.cxx:91
 AGeoBezierPgon.cxx:92
 AGeoBezierPgon.cxx:93
 AGeoBezierPgon.cxx:94
 AGeoBezierPgon.cxx:95
 AGeoBezierPgon.cxx:96
 AGeoBezierPgon.cxx:97
 AGeoBezierPgon.cxx:98
 AGeoBezierPgon.cxx:99
 AGeoBezierPgon.cxx:100
 AGeoBezierPgon.cxx:101
 AGeoBezierPgon.cxx:102
 AGeoBezierPgon.cxx:103
 AGeoBezierPgon.cxx:104