ROOT logo
// $Id: AGeoBezierPcon.cxx 3 2010-11-26 17:17:31Z oxon $
// Author: Akira Okumura 2011/07/08

/******************************************************************************
 * 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;
  } // if

  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);
  } // i
}
 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
 AGeoBezierPcon.cxx:104
 AGeoBezierPcon.cxx:105
 AGeoBezierPcon.cxx:106
 AGeoBezierPcon.cxx:107
 AGeoBezierPcon.cxx:108
 AGeoBezierPcon.cxx:109
 AGeoBezierPcon.cxx:110
 AGeoBezierPcon.cxx:111
 AGeoBezierPcon.cxx:112
 AGeoBezierPcon.cxx:113