#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;
Float_t mMaxF;
Float_t mMinG;
Float_t mMaxG;
Float_t mMinH;
Float_t mMaxH;
Float_t mMeanH;
Float_t mSigmaH;
Float_t mGravAtSurface;
Float_t mEpsilon;
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);
virtual void FindMinMaxH (TriMesh* mesh);
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);
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);
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);
virtual void pos2grav(const Float_t* x, GravData& gd) {}
virtual void sub_fgh(Float_t* a, Float_t* b, Float_t* delta);
virtual void regularize_fg(Float_t* f);
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) {}
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);
};
#endif