ROOT logo
// $Id: ParaSurf.h 2198 2009-05-11 22:22:41Z matevz $

// Copyright (C) 1999-2008, Matevz Tadel. All rights reserved.
// This file is part of GLED, released under GNU General Public License version 2.
// For the licensing terms see $GLEDSYS/LICENSE or http://www.gnu.org/.

#ifndef Var1_ParaSurf_H
#define Var1_ParaSurf_H

#include <Glasses/ZGlass.h>

class ZTrans;
class HTransF;
class GravData;
class TriMesh;

class TRandom;

namespace Opcode
{
class Plane;
class Point;
class Ray;
}


class ParaSurf : public ZGlass
{
  MAC_RNR_FRIENDS(ParaSurf);

private:
  void _init();

protected:
  Float_t  mMinF;    // X{G} 7 ValOut(-join=>1)
  Float_t  mMaxF;    // X{G} 7 ValOut()
  Float_t  mMinG;    // X{G} 7 ValOut(-join=>1)
  Float_t  mMaxG;    // X{G} 7 ValOut()
  Float_t  mMinH;    // X{G} 7 ValOut(-join=>1)
  Float_t  mMaxH;    // X{G} 7 ValOut()
  Float_t  mMeanH;   // X{G} 7 ValOut(-join=>1)
  Float_t  mSigmaH;  // X{G} 7 ValOut()

  Float_t  mGravAtSurface; // X{GS} 7 Value(-range=>[0,20,1,1000])

  Float_t  mEpsilon;     // X{G}

  static const Float_t  sEpsilonFac;
  static const Float_t  sPi, sTwoPi, sPiHalf;;

public:
  ParaSurf(const Text_t* n="ParaSurf", const Text_t* t=0) :
    ZGlass(n,t) { _init(); }
  virtual ~ParaSurf() {}

  virtual void FindMinMaxFGH(TriMesh* mesh);  // X{E} C{1} 7 MCWButt()
  virtual void FindMinMaxH  (TriMesh* mesh);  // X{E} C{1} 7 MCWButt()

  void RandomizeH(TriMesh* mesh,
                  Float_t  fg_chr_len, Float_t h_chr_len,
                  Float_t  alpha=0.8,  Bool_t  accum_dh=false,
                  Float_t  n_pass=1); // X{E} C{1} 7 MCWButt()

  Float_t GetDeltaH() const { return mMaxH - mMinH; }

  void GetMinFGH(Float_t fgh[3]) const { fgh[0] = mMinF; fgh[1] = mMinG; fgh[2] = mMinH; }
  void GetMaxFGH(Float_t fgh[3]) const { fgh[0] = mMaxF; fgh[1] = mMaxG; fgh[2] = mMaxH; }

  Bool_t IsValidFGH(const Float_t f[3], Bool_t check_h=false);
  Bool_t IsValidPos(const Float_t x[3], Bool_t check_h=false);

  virtual void SetupEdgePlanes() {}

  virtual Float_t Surface() = 0;
  virtual Float_t CharacteristicLength();

  virtual void origin_fgh(Float_t* g);
  virtual void origin_pos(Float_t* x);
  virtual void origin_trans(HTransF& t);
  virtual void origin_trans(ZTrans & t);

  virtual void pos2fgh(const Float_t* x, Float_t* f) = 0;
  virtual void fgh2pos(const Float_t* f, Float_t* x) = 0;

  virtual void fgh2fdir(const Float_t* f, Float_t* d) = 0;
  virtual void fgh2gdir(const Float_t* f, Float_t* d) = 0;
  virtual void fgh2hdir(const Float_t* f, Float_t* d) = 0;
  virtual void fgh2trans(const Float_t* f, HTransF& t);
  virtual void fgh2trans(const Float_t* f, ZTrans & t);

  // for possible optimizations
  virtual void    pos2hdir(const Float_t* x, Float_t* d)     = 0;
  virtual Float_t pos2hray(const Float_t* x, Opcode::Ray& r) = 0;
  virtual void    pos2fghdir(const Float_t* x,
                             Float_t* fdir, Float_t* gdir, Float_t* hdir);

  // Gravity and MSL height data.
  virtual void    pos2grav(const Float_t* x, GravData& gd) {}

  // Subtract fgh values, taking care of U(1) variables (like angles).
  virtual void sub_fgh(Float_t* a, Float_t* b, Float_t* delta);

  // Put fg values into regular intervals.
  virtual void regularize_fg(Float_t* f);

  // These all return point with h=0, which might not be above surface.
  virtual void random_fgh(TRandom& rnd, Float_t* f) = 0;
  virtual void random_pos(TRandom& rnd, Float_t* x);
  virtual void random_trans(TRandom& rnd, HTransF& t);

  virtual Int_t          n_edge_planes() { return 0; }
  virtual Opcode::Plane* edge_planes()   { return 0; }

  virtual Bool_t  support_wrap()         { return false; }
  virtual void    wrap(Float_t* x, Int_t plane, Float_t dist) {}

  // U(1) wrap-around foos
  static void    U1Wrap(Float_t& x)          { if (x > sPi) x -= sTwoPi; else if (x < -sPi) x += sTwoPi; }
  static Float_t U1Add(Float_t a, Float_t b) { Float_t x = a + b; U1Wrap(x); return x; }
  static Float_t U1Sub(Float_t a, Float_t b) { Float_t x = a - b; U1Wrap(x); return x; }

#include "ParaSurf.h7"
  ClassDef(ParaSurf, 1); // Parametric surface - abstract base-class.
}; // endclass ParaSurf


#endif
 ParaSurf.h:1
 ParaSurf.h:2
 ParaSurf.h:3
 ParaSurf.h:4
 ParaSurf.h:5
 ParaSurf.h:6
 ParaSurf.h:7
 ParaSurf.h:8
 ParaSurf.h:9
 ParaSurf.h:10
 ParaSurf.h:11
 ParaSurf.h:12
 ParaSurf.h:13
 ParaSurf.h:14
 ParaSurf.h:15
 ParaSurf.h:16
 ParaSurf.h:17
 ParaSurf.h:18
 ParaSurf.h:19
 ParaSurf.h:20
 ParaSurf.h:21
 ParaSurf.h:22
 ParaSurf.h:23
 ParaSurf.h:24
 ParaSurf.h:25
 ParaSurf.h:26
 ParaSurf.h:27
 ParaSurf.h:28
 ParaSurf.h:29
 ParaSurf.h:30
 ParaSurf.h:31
 ParaSurf.h:32
 ParaSurf.h:33
 ParaSurf.h:34
 ParaSurf.h:35
 ParaSurf.h:36
 ParaSurf.h:37
 ParaSurf.h:38
 ParaSurf.h:39
 ParaSurf.h:40
 ParaSurf.h:41
 ParaSurf.h:42
 ParaSurf.h:43
 ParaSurf.h:44
 ParaSurf.h:45
 ParaSurf.h:46
 ParaSurf.h:47
 ParaSurf.h:48
 ParaSurf.h:49
 ParaSurf.h:50
 ParaSurf.h:51
 ParaSurf.h:52
 ParaSurf.h:53
 ParaSurf.h:54
 ParaSurf.h:55
 ParaSurf.h:56
 ParaSurf.h:57
 ParaSurf.h:58
 ParaSurf.h:59
 ParaSurf.h:60
 ParaSurf.h:61
 ParaSurf.h:62
 ParaSurf.h:63
 ParaSurf.h:64
 ParaSurf.h:65
 ParaSurf.h:66
 ParaSurf.h:67
 ParaSurf.h:68
 ParaSurf.h:69
 ParaSurf.h:70
 ParaSurf.h:71
 ParaSurf.h:72
 ParaSurf.h:73
 ParaSurf.h:74
 ParaSurf.h:75
 ParaSurf.h:76
 ParaSurf.h:77
 ParaSurf.h:78
 ParaSurf.h:79
 ParaSurf.h:80
 ParaSurf.h:81
 ParaSurf.h:82
 ParaSurf.h:83
 ParaSurf.h:84
 ParaSurf.h:85
 ParaSurf.h:86
 ParaSurf.h:87
 ParaSurf.h:88
 ParaSurf.h:89
 ParaSurf.h:90
 ParaSurf.h:91
 ParaSurf.h:92
 ParaSurf.h:93
 ParaSurf.h:94
 ParaSurf.h:95
 ParaSurf.h:96
 ParaSurf.h:97
 ParaSurf.h:98
 ParaSurf.h:99
 ParaSurf.h:100
 ParaSurf.h:101
 ParaSurf.h:102
 ParaSurf.h:103
 ParaSurf.h:104
 ParaSurf.h:105
 ParaSurf.h:106
 ParaSurf.h:107
 ParaSurf.h:108
 ParaSurf.h:109
 ParaSurf.h:110
 ParaSurf.h:111
 ParaSurf.h:112
 ParaSurf.h:113
 ParaSurf.h:114
 ParaSurf.h:115
 ParaSurf.h:116
 ParaSurf.h:117
 ParaSurf.h:118
 ParaSurf.h:119
 ParaSurf.h:120
 ParaSurf.h:121
 ParaSurf.h:122
 ParaSurf.h:123
 ParaSurf.h:124
 ParaSurf.h:125
 ParaSurf.h:126
 ParaSurf.h:127