ROOT logo
// $Id: Glass_SKEL.cxx 2089 2008-11-23 20:31:03Z 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/.

#include "TernaryTree.h"
#include "TernaryTree.c7"

#include <Glasses/ProductionRule.h>
const float TernaryTree::s_Width_Increase = TMath::Sqrt(3);


// TernaryTree

//______________________________________________________________________________
//
//

ClassImp(TernaryTree);

//==============================================================================

void TernaryTree::_init()
{}

TernaryTree::TernaryTree(const Text_t* n, const Text_t* t) :
MonopodialTree(n, t),
mDivergenceAngle1(94),
mDivergenceAngle2(132),
mSusceptibility(0.27),
mTorsion(-1, 0, 0)
{
  _init();
  mTorsionNormalized = mTorsion;
}

TernaryTree::~TernaryTree()
{}

void TernaryTree::SetTorsion(Double_t x, Double_t y, Double_t z)
{
  mTorsion.Set(x,y,z);
  mTorsionNormalized = mTorsion;
  mTorsionNormalized.Normalize();
  mStampReqTring = Stamp(FID());
}


void
TernaryTree::ResetTorsion()
{
  mTorsion.Set(-1, 0, 0);
  mTorsionNormalized = mTorsion;
}

void
TernaryTree::InitialiseExpression()
{
  assert(mExpression.empty());
  
  mExpression.push_back(TwoParam('!', mStartWidth, -1));
  mExpression.push_back(TwoParam('F', mStartLength, mStartWidth));
  mExpression.push_back(TwoParam('/', 45, 45));
  mExpression.push_back(TwoParam('A', mStartLength, mStartWidth));
  
  assert((Int_t)mExpression.size() == mStart.Length());
}

void
TernaryTree::ExpandExpression(Segments_t& oldExp, Segments_t& newExp, int level)
{
  ZVector &R = **(mRules);
  for (Segments_i seg = oldExp.begin(); seg != oldExp.end(); ++seg)
  {
    NameMap_i it  = mNameMap.find((*seg).mType);
    if (it != mNameMap.end())
    {
      ProductionRule* pr = static_cast<ProductionRule*>(R[it->second]);
      TString rule = pr->GetRule(); 
      ExpandRule(pr->GetRule(), *seg, newExp);
    }
    else 
    { 
      newExp.push_back(*seg);
      if ((*seg).mType == '!')
      {
        newExp.back().mParam1 = (*seg).mParam1 * TMath::Sqrt(3);
      }
      else if ((*seg).mType == 'F')
      {
        newExp.back().mParam1 *= mTrunkContraction; 
        newExp.back().mParam2 *= TMath::Sqrt(3);
      }
    }
  }
  
  if (level < mLevel)
  {
    oldExp.swap(newExp);
    newExp.clear();
    ExpandExpression(oldExp, newExp, ++level);  
  }
}

void
TernaryTree::ExpandRule(const Text_t* rule, TwoParam& parent, ParametricSystem::Segments_t& newExp)
{
  bool firstDiv = true;
  bool base = true;
  for (size_t k = 0; k < strlen(rule); ++k)
  {
    newExp.push_back(TwoParam(rule[k]));  
    TwoParam& s = newExp.back();
    
    if (parent.mType == 'A')
    {
      if (s.mType == '&' )
      {
        s.mParam1 = mTrunkAngle;
      }
      else if ( s.mType == '/')
      {
        s.mParam1 = firstDiv ? mDivergenceAngle1 : mDivergenceAngle2;
        firstDiv = false;
      }
      else if (s.mType == 'F')
      {
        s.mParam1 = mStartLength*0.25; 
        if (1 || base)
        {
          s.mParam2 = mStartWidth * TMath::Sqrt(3); 
        }
        else
        {
          s.mParam2 = mStartWidth; 
        }
        base = false;
      }
    }
  }
}
 TernaryTree.cxx:1
 TernaryTree.cxx:2
 TernaryTree.cxx:3
 TernaryTree.cxx:4
 TernaryTree.cxx:5
 TernaryTree.cxx:6
 TernaryTree.cxx:7
 TernaryTree.cxx:8
 TernaryTree.cxx:9
 TernaryTree.cxx:10
 TernaryTree.cxx:11
 TernaryTree.cxx:12
 TernaryTree.cxx:13
 TernaryTree.cxx:14
 TernaryTree.cxx:15
 TernaryTree.cxx:16
 TernaryTree.cxx:17
 TernaryTree.cxx:18
 TernaryTree.cxx:19
 TernaryTree.cxx:20
 TernaryTree.cxx:21
 TernaryTree.cxx:22
 TernaryTree.cxx:23
 TernaryTree.cxx:24
 TernaryTree.cxx:25
 TernaryTree.cxx:26
 TernaryTree.cxx:27
 TernaryTree.cxx:28
 TernaryTree.cxx:29
 TernaryTree.cxx:30
 TernaryTree.cxx:31
 TernaryTree.cxx:32
 TernaryTree.cxx:33
 TernaryTree.cxx:34
 TernaryTree.cxx:35
 TernaryTree.cxx:36
 TernaryTree.cxx:37
 TernaryTree.cxx:38
 TernaryTree.cxx:39
 TernaryTree.cxx:40
 TernaryTree.cxx:41
 TernaryTree.cxx:42
 TernaryTree.cxx:43
 TernaryTree.cxx:44
 TernaryTree.cxx:45
 TernaryTree.cxx:46
 TernaryTree.cxx:47
 TernaryTree.cxx:48
 TernaryTree.cxx:49
 TernaryTree.cxx:50
 TernaryTree.cxx:51
 TernaryTree.cxx:52
 TernaryTree.cxx:53
 TernaryTree.cxx:54
 TernaryTree.cxx:55
 TernaryTree.cxx:56
 TernaryTree.cxx:57
 TernaryTree.cxx:58
 TernaryTree.cxx:59
 TernaryTree.cxx:60
 TernaryTree.cxx:61
 TernaryTree.cxx:62
 TernaryTree.cxx:63
 TernaryTree.cxx:64
 TernaryTree.cxx:65
 TernaryTree.cxx:66
 TernaryTree.cxx:67
 TernaryTree.cxx:68
 TernaryTree.cxx:69
 TernaryTree.cxx:70
 TernaryTree.cxx:71
 TernaryTree.cxx:72
 TernaryTree.cxx:73
 TernaryTree.cxx:74
 TernaryTree.cxx:75
 TernaryTree.cxx:76
 TernaryTree.cxx:77
 TernaryTree.cxx:78
 TernaryTree.cxx:79
 TernaryTree.cxx:80
 TernaryTree.cxx:81
 TernaryTree.cxx:82
 TernaryTree.cxx:83
 TernaryTree.cxx:84
 TernaryTree.cxx:85
 TernaryTree.cxx:86
 TernaryTree.cxx:87
 TernaryTree.cxx:88
 TernaryTree.cxx:89
 TernaryTree.cxx:90
 TernaryTree.cxx:91
 TernaryTree.cxx:92
 TernaryTree.cxx:93
 TernaryTree.cxx:94
 TernaryTree.cxx:95
 TernaryTree.cxx:96
 TernaryTree.cxx:97
 TernaryTree.cxx:98
 TernaryTree.cxx:99
 TernaryTree.cxx:100
 TernaryTree.cxx:101
 TernaryTree.cxx:102
 TernaryTree.cxx:103
 TernaryTree.cxx:104
 TernaryTree.cxx:105
 TernaryTree.cxx:106
 TernaryTree.cxx:107
 TernaryTree.cxx:108
 TernaryTree.cxx:109
 TernaryTree.cxx:110
 TernaryTree.cxx:111
 TernaryTree.cxx:112
 TernaryTree.cxx:113
 TernaryTree.cxx:114
 TernaryTree.cxx:115
 TernaryTree.cxx:116
 TernaryTree.cxx:117
 TernaryTree.cxx:118
 TernaryTree.cxx:119
 TernaryTree.cxx:120
 TernaryTree.cxx:121
 TernaryTree.cxx:122
 TernaryTree.cxx:123
 TernaryTree.cxx:124
 TernaryTree.cxx:125
 TernaryTree.cxx:126
 TernaryTree.cxx:127
 TernaryTree.cxx:128
 TernaryTree.cxx:129
 TernaryTree.cxx:130
 TernaryTree.cxx:131
 TernaryTree.cxx:132
 TernaryTree.cxx:133
 TernaryTree.cxx:134
 TernaryTree.cxx:135
 TernaryTree.cxx:136
 TernaryTree.cxx:137
 TernaryTree.cxx:138
 TernaryTree.cxx:139
 TernaryTree.cxx:140
 TernaryTree.cxx:141
 TernaryTree.cxx:142