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

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

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