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

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

#include "AGeoBezierPcon.h"

ClassImp(AGeoBezierPcon);

//_____________________________________________________________________________
AGeoBezierPcon::AGeoBezierPcon() : TGeoPcon() {
  // Default constructor
}

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

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

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