ROOT logo
// $Id: PSTriangle.cxx 2325 2010-01-07 22:45:36Z 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/.

//__________________________________________________________________________
// PSTriangle
//
//

#include "PSTriangle.h"
#include "PSTriangle.c7"
#include <Stones/GravData.h>

#include <Opcode/Opcode.h>

#include <TRandom.h>

ClassImp(PSTriangle);

/**************************************************************************/

void PSTriangle::_init()
{
  mX0 = -0.5f; mY0 = -Opcode::SQRT3/6.0f;
  mX1 =  0.5f; mY1 =  mY0;
  mX2 =  0.0f; mY2 =  Opcode::SQRT3/3.0f;

  mEdgePlanes = new Opcode::Plane[3];
}

PSTriangle::PSTriangle(const Text_t* n, const Text_t* t) :
  ParaSurf(n,t)
{
  _init();
}

PSTriangle::~PSTriangle()
{
  delete [] mEdgePlanes;
}

/**************************************************************************/

void PSTriangle::Scale(Float_t s)
{
  mX0 *= s; mY0 *= s;
  mX1 *= s; mY1 *= s;
  mX2 *= s; mY2 *= s;
}

/**************************************************************************/

void PSTriangle::SetupEdgePlanes()
{
  // !!! should be called from AdEnlightenment

  using namespace Opcode;
  Point v0(mX0, mY0, 0), v1(mX1, mY1, 0), v2(mX2, mY2, 0);
  Point up(0, 0, 1);
  mEdgePlanes[0].Set(v0, v1, up + v0 + (v1 - v0));
  mEdgePlanes[1].Set(v1, v2, up + v1 + (v2 - v1));
  mEdgePlanes[2].Set(v2, v0, up + v2 + (v0 - v2));
}

/**************************************************************************/

Float_t PSTriangle::Surface()
{
  using namespace Opcode;
  Point opos(mX0, mY0, 0);
  Point udir(mX1, mY1, 0); udir.Sub(opos);
  Point vdir(mX2, mY2, 0); vdir.Sub(opos);
  return 0.5f * opos.Cross(udir, vdir).Magnitude();
}

/******************************************************************************/

void PSTriangle::origin_fgh(Float_t* f)
{
  f[0] = Opcode::INV3*(mX0 + mX1 + mX2);
  f[1] = Opcode::INV3*(mY0 + mY1 + mY2);
  f[2] = 0;
}

void PSTriangle::origin_pos(Float_t* x)
{
  x[0] = Opcode::INV3*(mX0 + mX1 + mX2);
  x[1] = Opcode::INV3*(mY0 + mY1 + mY2);
  x[2] = 0;
}

/**************************************************************************/

void PSTriangle::pos2fgh(const Float_t* x, Float_t* f)
{
  f[0] = x[0];
  f[1] = x[1];
  f[2] = x[2];
}

void PSTriangle::fgh2pos(const Float_t* f, Float_t* x)
{
  x[0] = f[0];
  x[1] = f[1];
  x[2] = f[2];
}

void PSTriangle::fgh2fdir(const Float_t* f, Float_t* d)
{
  d[0] = 1;
  d[1] = 0;
  d[2] = 0;
}

void PSTriangle::fgh2gdir(const Float_t* f, Float_t* d)
{
  d[0] = 0;
  d[1] = 1;
  d[2] = 0;
}

void PSTriangle::fgh2hdir(const Float_t* f, Float_t* d)
{
  d[0] = 0;
  d[1] = 0;
  d[2] = 1;
}

/**************************************************************************/

void PSTriangle::pos2hdir(const Float_t* x, Float_t* d)
{
  // Return 'up' direction.

  d[0] = 0;
  d[1] = 0;
  d[2] = 1;
}

Float_t PSTriangle::pos2hray(const Float_t* x, Opcode::Ray& r)
{
  // Setup ray r for given postition x so that the ray origin is above
  // the surface and its direction/lenght ascertain the surface will
  // be intersected.
  // Returns distance the ray-origin was shifted from initial pos.

  pos2hdir(x, r.mDir);
  Float_t dist = mMaxH - x[2] + mEpsilon;
  r.mOrig.Set(x);
  r.mOrig.TMac(r.mDir, dist);
  r.mDir.Neg();
  return dist;
}

/**************************************************************************/

void PSTriangle::pos2grav(const Float_t* x, GravData& gd)
{
  // Here we could have three vectors at the vertices of the triangle
  // and interpolate.
  // Then would need also intepolated height, or what?

  gd.fPos[0] = x[0]; gd.fPos[1] = x[1]; gd.fPos[2] = x[2];
  gd.fDir[0] = 0;    gd.fDir[1] = 0;    gd.fDir[2] = -1;

  gd.fMag  = mGravAtSurface;
  gd.fLDer = 0;
  gd.fTDer = 0;
  gd.fH    = x[2];
  gd.fDown[0] = gd.fDown[1] = 0; gd.fDown[2] = -1;
}

/**************************************************************************/

void PSTriangle::random_fgh(TRandom& rnd, Float_t* f)
{
  using namespace Opcode;
  Point opos(mX0, mY0, 0);
  Point udir(mX1, mY1, 0); udir.Sub(opos);
  Point vdir(mX2, mY2, 0); vdir.Sub(opos);
  Float_t u = rnd.Uniform(0, 1);
  Float_t v = rnd.Uniform(0, 1);
  if (u + v > 1) { u = 1.0f - u; v = 1.0f - v; }
  ((Point*)f)->Mac2(opos, udir, u, vdir, v);
}

void PSTriangle::random_pos(TRandom& rnd, Float_t* x)
{
  using namespace Opcode;
  Point opos(mX0, mY0, 0);
  Point udir(mX1, mY1, 0); udir.Sub(opos);
  Point vdir(mX2, mY2, 0); vdir.Sub(opos);
  Float_t u = rnd.Uniform(0, 1);
  Float_t v = rnd.Uniform(0, 1);
  if (u + v > 1) { u = 1.0f - u; v = 1.0f - v; }
  ((Point*)x)->Mac2(opos, udir, u, vdir, v);
}
 PSTriangle.cxx:1
 PSTriangle.cxx:2
 PSTriangle.cxx:3
 PSTriangle.cxx:4
 PSTriangle.cxx:5
 PSTriangle.cxx:6
 PSTriangle.cxx:7
 PSTriangle.cxx:8
 PSTriangle.cxx:9
 PSTriangle.cxx:10
 PSTriangle.cxx:11
 PSTriangle.cxx:12
 PSTriangle.cxx:13
 PSTriangle.cxx:14
 PSTriangle.cxx:15
 PSTriangle.cxx:16
 PSTriangle.cxx:17
 PSTriangle.cxx:18
 PSTriangle.cxx:19
 PSTriangle.cxx:20
 PSTriangle.cxx:21
 PSTriangle.cxx:22
 PSTriangle.cxx:23
 PSTriangle.cxx:24
 PSTriangle.cxx:25
 PSTriangle.cxx:26
 PSTriangle.cxx:27
 PSTriangle.cxx:28
 PSTriangle.cxx:29
 PSTriangle.cxx:30
 PSTriangle.cxx:31
 PSTriangle.cxx:32
 PSTriangle.cxx:33
 PSTriangle.cxx:34
 PSTriangle.cxx:35
 PSTriangle.cxx:36
 PSTriangle.cxx:37
 PSTriangle.cxx:38
 PSTriangle.cxx:39
 PSTriangle.cxx:40
 PSTriangle.cxx:41
 PSTriangle.cxx:42
 PSTriangle.cxx:43
 PSTriangle.cxx:44
 PSTriangle.cxx:45
 PSTriangle.cxx:46
 PSTriangle.cxx:47
 PSTriangle.cxx:48
 PSTriangle.cxx:49
 PSTriangle.cxx:50
 PSTriangle.cxx:51
 PSTriangle.cxx:52
 PSTriangle.cxx:53
 PSTriangle.cxx:54
 PSTriangle.cxx:55
 PSTriangle.cxx:56
 PSTriangle.cxx:57
 PSTriangle.cxx:58
 PSTriangle.cxx:59
 PSTriangle.cxx:60
 PSTriangle.cxx:61
 PSTriangle.cxx:62
 PSTriangle.cxx:63
 PSTriangle.cxx:64
 PSTriangle.cxx:65
 PSTriangle.cxx:66
 PSTriangle.cxx:67
 PSTriangle.cxx:68
 PSTriangle.cxx:69
 PSTriangle.cxx:70
 PSTriangle.cxx:71
 PSTriangle.cxx:72
 PSTriangle.cxx:73
 PSTriangle.cxx:74
 PSTriangle.cxx:75
 PSTriangle.cxx:76
 PSTriangle.cxx:77
 PSTriangle.cxx:78
 PSTriangle.cxx:79
 PSTriangle.cxx:80
 PSTriangle.cxx:81
 PSTriangle.cxx:82
 PSTriangle.cxx:83
 PSTriangle.cxx:84
 PSTriangle.cxx:85
 PSTriangle.cxx:86
 PSTriangle.cxx:87
 PSTriangle.cxx:88
 PSTriangle.cxx:89
 PSTriangle.cxx:90
 PSTriangle.cxx:91
 PSTriangle.cxx:92
 PSTriangle.cxx:93
 PSTriangle.cxx:94
 PSTriangle.cxx:95
 PSTriangle.cxx:96
 PSTriangle.cxx:97
 PSTriangle.cxx:98
 PSTriangle.cxx:99
 PSTriangle.cxx:100
 PSTriangle.cxx:101
 PSTriangle.cxx:102
 PSTriangle.cxx:103
 PSTriangle.cxx:104
 PSTriangle.cxx:105
 PSTriangle.cxx:106
 PSTriangle.cxx:107
 PSTriangle.cxx:108
 PSTriangle.cxx:109
 PSTriangle.cxx:110
 PSTriangle.cxx:111
 PSTriangle.cxx:112
 PSTriangle.cxx:113
 PSTriangle.cxx:114
 PSTriangle.cxx:115
 PSTriangle.cxx:116
 PSTriangle.cxx:117
 PSTriangle.cxx:118
 PSTriangle.cxx:119
 PSTriangle.cxx:120
 PSTriangle.cxx:121
 PSTriangle.cxx:122
 PSTriangle.cxx:123
 PSTriangle.cxx:124
 PSTriangle.cxx:125
 PSTriangle.cxx:126
 PSTriangle.cxx:127
 PSTriangle.cxx:128
 PSTriangle.cxx:129
 PSTriangle.cxx:130
 PSTriangle.cxx:131
 PSTriangle.cxx:132
 PSTriangle.cxx:133
 PSTriangle.cxx:134
 PSTriangle.cxx:135
 PSTriangle.cxx:136
 PSTriangle.cxx:137
 PSTriangle.cxx:138
 PSTriangle.cxx:139
 PSTriangle.cxx:140
 PSTriangle.cxx:141
 PSTriangle.cxx:142
 PSTriangle.cxx:143
 PSTriangle.cxx:144
 PSTriangle.cxx:145
 PSTriangle.cxx:146
 PSTriangle.cxx:147
 PSTriangle.cxx:148
 PSTriangle.cxx:149
 PSTriangle.cxx:150
 PSTriangle.cxx:151
 PSTriangle.cxx:152
 PSTriangle.cxx:153
 PSTriangle.cxx:154
 PSTriangle.cxx:155
 PSTriangle.cxx:156
 PSTriangle.cxx:157
 PSTriangle.cxx:158
 PSTriangle.cxx:159
 PSTriangle.cxx:160
 PSTriangle.cxx:161
 PSTriangle.cxx:162
 PSTriangle.cxx:163
 PSTriangle.cxx:164
 PSTriangle.cxx:165
 PSTriangle.cxx:166
 PSTriangle.cxx:167
 PSTriangle.cxx:168
 PSTriangle.cxx:169
 PSTriangle.cxx:170
 PSTriangle.cxx:171
 PSTriangle.cxx:172
 PSTriangle.cxx:173
 PSTriangle.cxx:174
 PSTriangle.cxx:175
 PSTriangle.cxx:176
 PSTriangle.cxx:177
 PSTriangle.cxx:178
 PSTriangle.cxx:179
 PSTriangle.cxx:180
 PSTriangle.cxx:181
 PSTriangle.cxx:182
 PSTriangle.cxx:183
 PSTriangle.cxx:184
 PSTriangle.cxx:185
 PSTriangle.cxx:186
 PSTriangle.cxx:187
 PSTriangle.cxx:188
 PSTriangle.cxx:189
 PSTriangle.cxx:190
 PSTriangle.cxx:191
 PSTriangle.cxx:192
 PSTriangle.cxx:193
 PSTriangle.cxx:194
 PSTriangle.cxx:195
 PSTriangle.cxx:196
 PSTriangle.cxx:197
 PSTriangle.cxx:198
 PSTriangle.cxx:199