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 "DibotryoidHerb.h"
#include "DibotryoidHerb.c7"

// DibotryoidHerb

//______________________________________________________________________________
//
//

ClassImp(DibotryoidHerb);

DibotryoidHerb::DibotryoidHerb(const Text_t* n, const Text_t* t) :
GrowingPlant(n, t),
mSendSignalDelay(13),
mCreateBranchDelay(3),
mPlastocronMainAxis(2),
mPlastocronLateralAxis(3),
mSignalDelayMainAxis(1),
mSignalDelayLateralAxis(1),
mLateralAngle(70),
mAColor(1, 0, 1),
mBColor(0, 1, 1),
mLColor(1, 0, 0)
{
  _init();
}

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

void DibotryoidHerb::_init()
{
  mStart.x('S', 0).x('a', 1, 0);
}

DibotryoidHerb::~DibotryoidHerb()
{}



void DibotryoidHerb::DumpList(Segments_t& l)  
{
  char commandCol[13];
  
  char commandDef[13];
  
	/* Command is the control command to the terminal */
	//sprintf(command, "%c[%d;%d;%dm", 0x1B, 5, 33, 36); //"\033[5,33;36mboo"
	sprintf(commandCol, "%c[%d;%dm", 0x1B, 22, 33); //"\033[5,33;36mboo"
	sprintf(commandDef, "%c[%d;%dm", 0x1B, 22, 0); //"\033[5,33;36mboo"
  
  
  bool sideBranch = false;
  int nstack = 0;
  int n = (int)l.size();
  // printf("Expression[%d]: \n", (int)slist.size());
  for (int i=0; i< n; ++i)
  {
    if (l[i].mType == '[') nstack++;
    if (l[i].mType == ']') nstack--;
    
    if (nstack == 1 && l[i+1].mType == '+')
    {
      sideBranch = true;//\033[22;31mboo
      printf("%s", commandCol);
    }
    
    
    printf("%c", l[i].mType);
    if(l[i].mType == ']' && sideBranch && nstack == 0)
    {
      sideBranch = false;
      printf("%s", commandDef);
    }
      
   // if ((*i).mType == 'I') printf("(%d, %d)", (*i).mParam1, (*i).mParam2);
  }      
  printf(" \n");
  
  if (nstack) printf("!!!!!!!!!!!!!!!!!!stack %d \n", nstack);
}

void DibotryoidHerb::SegmentStepTime(Segments_i oldRef, Segments_t& in, Segments_t& out)
{  
  out.s('b', 1, 1);
  out.s('&', mLateralAngle);  
  out.s('+', mLateralAngle);  
  out.s('/', 180);

  Segment& seg = *oldRef;
  switch (seg.mType)
  {
      
    /////////////////////////////////////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////
    case 'a': 
    {
      
      Segments_i ngi = NeighbourBack(in, oldRef);
      
      //   if (ng.mType == 'I' && ng.mParam1 == ng.mParam2)
      if (ngi != in.end() && (*ngi).mType == 'I' && (*ngi).mParam1 > 0)
      {
        // flowering
       // printf("'a'-> new flower, neighbour I (%d %d) plastocron %d\n",  ng.mParam1,  ng.mParam1, ng.mParam1);
        out.x('I', 0, -1).x("[L][+b]B");
        break;
      }
      
      if (seg.mParam1 < mPlastocronMainAxis)
      {
        // printf("a accumulate plastocron \n");
        out.x('a', seg.mParam1 + 1, seg.mParam2);
        break;
      }
      
      if (seg.mParam1 == mPlastocronMainAxis )
      {
        // build plain nodes
        if (seg.mParam2 <mCreateBranchDelay)
        {
          out.x('I', 0, -1).x("[L]").x('a', 1, seg.mParam2 + 1);
        } 
        else 
        {
          // building subranches
          out.x('I', 0, -1).x("[L][+b]/").x('a', 1, seg.mParam2);
        }
        break;
      }
      
      
      {
        printf("'a'-> should not happen, problem %d \n", seg.mParam1); 
      }
      
      break;
    } 
      
    /////////////////////////////////////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////
    case  'b':
    {
      Segments_i ni = NeighbourBack(in, oldRef, 0, false); 
      if (seg.mParam1 == mPlastocronLateralAxis)
      {
       // printf("'b'-> new leaf segment : %d == %d\n", seg.mParam1, mPlastocronLateralAxis);        
        out.x('I', 0, -2).x("[L]").x('b', 1, seg.mParam2 + 1);
      }
      else if (ni != in.end() && (*ni).mType == 'I' && (*ni).mParam1 > 0/* == mSignalDelayLateralAxis*/)
      {
          //printf("'b'-> new lateral flower, neighbour I (%d %d) plastocron %d\n",  (*ni).mParam1,  seg.mParam1, seg.mParam1);
          out.x('I', 0, -2).x("[L]B");
          //out.x("B");
      }
      else if (seg.mParam1 < mPlastocronLateralAxis)
      {
      //  printf("'b'-> accumulate plastocron \n");
        out.x(seg.mType, seg.mParam1 + 1);
      }
      else
      {
        printf("'b'-> should not happen, problem %d \n", seg.mParam1); 
      }

      break;
    }
      
    case 'S':
    {
      // signal delay
      // printf("signal delay S %d \n",  seg.mParam1 + 1);
      out.x('S', seg.mParam1 + 1, seg.mParam2);
      break;
    } 
      
    /////////////////////////////////////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////
    case 'I':
    {
      int signalDelay = (seg.mParam2 == -1) ? mSignalDelayMainAxis : mSignalDelayLateralAxis;
      if (seg.mParam1 > 0 && seg.mParam1 < signalDelay)
      {
        out.x('I', seg.mParam1 + 1, seg.mParam2);
        break;
      }
      
      int stackOff = 0;
      if (seg.mParam2 == -2) // lateral brach
      {
        Segments_i ib = oldRef; --ib;
        if ((*ib).mType == '+') {
          stackOff = -1;
          // printf("xxxxxxxxxxxxxxxxxx\n");
        }
      }
      Segments_i nIt = NeighbourBack(in, oldRef, stackOff, false);  
      // printf("search neighbour for I(%d, %d) __ %c \n", seg.mParam1, seg.mParam2, (*nIt).mType );
      if (nIt != in.end())
      {
        
        if ((*nIt).mType == 'S' && (*nIt).mParam1 == mSendSignalDelay)
        {
          out.x('I', 1, seg.mParam2);
          break;
        }
        
        if ( (*nIt).mType == 'I')
        {
          int ngDelay = ((*nIt).mParam2 == -1) ? mSignalDelayMainAxis : mSignalDelayLateralAxis;
          if ((*nIt).mParam1 == ngDelay && seg.mParam1 == 0)
          {
            out.x('I', 1, seg.mParam2);
            break;
          }
        }
      } 
      
      
      out.x(seg.mType, seg.mParam1, seg.mParam2);
      break;
      
    }
      
      /////////////////////////////////////////////////////////////////////////////////////////
      /////////////////////////////////////////////////////////////////////////////////////////
      
    case 'B':
    {
      // flowering node
      out.x('I', 0, 1).x("[K]B");
      break;    
    } 
      
    default:
      // copy existing
      out.x(seg.mType, seg.mParam1, seg.mParam2);
      break;
  }
 DibotryoidHerb.cxx:1
 DibotryoidHerb.cxx:2
 DibotryoidHerb.cxx:3
 DibotryoidHerb.cxx:4
 DibotryoidHerb.cxx:5
 DibotryoidHerb.cxx:6
 DibotryoidHerb.cxx:7
 DibotryoidHerb.cxx:8
 DibotryoidHerb.cxx:9
 DibotryoidHerb.cxx:10
 DibotryoidHerb.cxx:11
 DibotryoidHerb.cxx:12
 DibotryoidHerb.cxx:13
 DibotryoidHerb.cxx:14
 DibotryoidHerb.cxx:15
 DibotryoidHerb.cxx:16
 DibotryoidHerb.cxx:17
 DibotryoidHerb.cxx:18
 DibotryoidHerb.cxx:19
 DibotryoidHerb.cxx:20
 DibotryoidHerb.cxx:21
 DibotryoidHerb.cxx:22
 DibotryoidHerb.cxx:23
 DibotryoidHerb.cxx:24
 DibotryoidHerb.cxx:25
 DibotryoidHerb.cxx:26
 DibotryoidHerb.cxx:27
 DibotryoidHerb.cxx:28
 DibotryoidHerb.cxx:29
 DibotryoidHerb.cxx:30
 DibotryoidHerb.cxx:31
 DibotryoidHerb.cxx:32
 DibotryoidHerb.cxx:33
 DibotryoidHerb.cxx:34
 DibotryoidHerb.cxx:35
 DibotryoidHerb.cxx:36
 DibotryoidHerb.cxx:37
 DibotryoidHerb.cxx:38
 DibotryoidHerb.cxx:39
 DibotryoidHerb.cxx:40
 DibotryoidHerb.cxx:41
 DibotryoidHerb.cxx:42
 DibotryoidHerb.cxx:43
 DibotryoidHerb.cxx:44
 DibotryoidHerb.cxx:45
 DibotryoidHerb.cxx:46
 DibotryoidHerb.cxx:47
 DibotryoidHerb.cxx:48
 DibotryoidHerb.cxx:49
 DibotryoidHerb.cxx:50
 DibotryoidHerb.cxx:51
 DibotryoidHerb.cxx:52
 DibotryoidHerb.cxx:53
 DibotryoidHerb.cxx:54
 DibotryoidHerb.cxx:55
 DibotryoidHerb.cxx:56
 DibotryoidHerb.cxx:57
 DibotryoidHerb.cxx:58
 DibotryoidHerb.cxx:59
 DibotryoidHerb.cxx:60
 DibotryoidHerb.cxx:61
 DibotryoidHerb.cxx:62
 DibotryoidHerb.cxx:63
 DibotryoidHerb.cxx:64
 DibotryoidHerb.cxx:65
 DibotryoidHerb.cxx:66
 DibotryoidHerb.cxx:67
 DibotryoidHerb.cxx:68
 DibotryoidHerb.cxx:69
 DibotryoidHerb.cxx:70
 DibotryoidHerb.cxx:71
 DibotryoidHerb.cxx:72
 DibotryoidHerb.cxx:73
 DibotryoidHerb.cxx:74
 DibotryoidHerb.cxx:75
 DibotryoidHerb.cxx:76
 DibotryoidHerb.cxx:77
 DibotryoidHerb.cxx:78
 DibotryoidHerb.cxx:79
 DibotryoidHerb.cxx:80
 DibotryoidHerb.cxx:81
 DibotryoidHerb.cxx:82
 DibotryoidHerb.cxx:83
 DibotryoidHerb.cxx:84
 DibotryoidHerb.cxx:85
 DibotryoidHerb.cxx:86
 DibotryoidHerb.cxx:87
 DibotryoidHerb.cxx:88
 DibotryoidHerb.cxx:89
 DibotryoidHerb.cxx:90
 DibotryoidHerb.cxx:91
 DibotryoidHerb.cxx:92
 DibotryoidHerb.cxx:93
 DibotryoidHerb.cxx:94
 DibotryoidHerb.cxx:95
 DibotryoidHerb.cxx:96
 DibotryoidHerb.cxx:97
 DibotryoidHerb.cxx:98
 DibotryoidHerb.cxx:99
 DibotryoidHerb.cxx:100
 DibotryoidHerb.cxx:101
 DibotryoidHerb.cxx:102
 DibotryoidHerb.cxx:103
 DibotryoidHerb.cxx:104
 DibotryoidHerb.cxx:105
 DibotryoidHerb.cxx:106
 DibotryoidHerb.cxx:107
 DibotryoidHerb.cxx:108
 DibotryoidHerb.cxx:109
 DibotryoidHerb.cxx:110
 DibotryoidHerb.cxx:111
 DibotryoidHerb.cxx:112
 DibotryoidHerb.cxx:113
 DibotryoidHerb.cxx:114
 DibotryoidHerb.cxx:115
 DibotryoidHerb.cxx:116
 DibotryoidHerb.cxx:117
 DibotryoidHerb.cxx:118
 DibotryoidHerb.cxx:119
 DibotryoidHerb.cxx:120
 DibotryoidHerb.cxx:121
 DibotryoidHerb.cxx:122
 DibotryoidHerb.cxx:123
 DibotryoidHerb.cxx:124
 DibotryoidHerb.cxx:125
 DibotryoidHerb.cxx:126
 DibotryoidHerb.cxx:127
 DibotryoidHerb.cxx:128
 DibotryoidHerb.cxx:129
 DibotryoidHerb.cxx:130
 DibotryoidHerb.cxx:131
 DibotryoidHerb.cxx:132
 DibotryoidHerb.cxx:133
 DibotryoidHerb.cxx:134
 DibotryoidHerb.cxx:135
 DibotryoidHerb.cxx:136
 DibotryoidHerb.cxx:137
 DibotryoidHerb.cxx:138
 DibotryoidHerb.cxx:139
 DibotryoidHerb.cxx:140
 DibotryoidHerb.cxx:141
 DibotryoidHerb.cxx:142
 DibotryoidHerb.cxx:143
 DibotryoidHerb.cxx:144
 DibotryoidHerb.cxx:145
 DibotryoidHerb.cxx:146
 DibotryoidHerb.cxx:147
 DibotryoidHerb.cxx:148
 DibotryoidHerb.cxx:149
 DibotryoidHerb.cxx:150
 DibotryoidHerb.cxx:151
 DibotryoidHerb.cxx:152
 DibotryoidHerb.cxx:153
 DibotryoidHerb.cxx:154
 DibotryoidHerb.cxx:155
 DibotryoidHerb.cxx:156
 DibotryoidHerb.cxx:157
 DibotryoidHerb.cxx:158
 DibotryoidHerb.cxx:159
 DibotryoidHerb.cxx:160
 DibotryoidHerb.cxx:161
 DibotryoidHerb.cxx:162
 DibotryoidHerb.cxx:163
 DibotryoidHerb.cxx:164
 DibotryoidHerb.cxx:165
 DibotryoidHerb.cxx:166
 DibotryoidHerb.cxx:167
 DibotryoidHerb.cxx:168
 DibotryoidHerb.cxx:169
 DibotryoidHerb.cxx:170
 DibotryoidHerb.cxx:171
 DibotryoidHerb.cxx:172
 DibotryoidHerb.cxx:173
 DibotryoidHerb.cxx:174
 DibotryoidHerb.cxx:175
 DibotryoidHerb.cxx:176
 DibotryoidHerb.cxx:177
 DibotryoidHerb.cxx:178
 DibotryoidHerb.cxx:179
 DibotryoidHerb.cxx:180
 DibotryoidHerb.cxx:181
 DibotryoidHerb.cxx:182
 DibotryoidHerb.cxx:183
 DibotryoidHerb.cxx:184
 DibotryoidHerb.cxx:185
 DibotryoidHerb.cxx:186
 DibotryoidHerb.cxx:187
 DibotryoidHerb.cxx:188
 DibotryoidHerb.cxx:189
 DibotryoidHerb.cxx:190
 DibotryoidHerb.cxx:191
 DibotryoidHerb.cxx:192
 DibotryoidHerb.cxx:193
 DibotryoidHerb.cxx:194
 DibotryoidHerb.cxx:195
 DibotryoidHerb.cxx:196
 DibotryoidHerb.cxx:197
 DibotryoidHerb.cxx:198
 DibotryoidHerb.cxx:199
 DibotryoidHerb.cxx:200
 DibotryoidHerb.cxx:201
 DibotryoidHerb.cxx:202
 DibotryoidHerb.cxx:203
 DibotryoidHerb.cxx:204
 DibotryoidHerb.cxx:205
 DibotryoidHerb.cxx:206
 DibotryoidHerb.cxx:207
 DibotryoidHerb.cxx:208
 DibotryoidHerb.cxx:209
 DibotryoidHerb.cxx:210
 DibotryoidHerb.cxx:211
 DibotryoidHerb.cxx:212
 DibotryoidHerb.cxx:213
 DibotryoidHerb.cxx:214
 DibotryoidHerb.cxx:215
 DibotryoidHerb.cxx:216
 DibotryoidHerb.cxx:217
 DibotryoidHerb.cxx:218
 DibotryoidHerb.cxx:219
 DibotryoidHerb.cxx:220
 DibotryoidHerb.cxx:221
 DibotryoidHerb.cxx:222
 DibotryoidHerb.cxx:223
 DibotryoidHerb.cxx:224
 DibotryoidHerb.cxx:225
 DibotryoidHerb.cxx:226
 DibotryoidHerb.cxx:227
 DibotryoidHerb.cxx:228
 DibotryoidHerb.cxx:229
 DibotryoidHerb.cxx:230
 DibotryoidHerb.cxx:231
 DibotryoidHerb.cxx:232
 DibotryoidHerb.cxx:233
 DibotryoidHerb.cxx:234
 DibotryoidHerb.cxx:235
 DibotryoidHerb.cxx:236
 DibotryoidHerb.cxx:237
 DibotryoidHerb.cxx:238
 DibotryoidHerb.cxx:239
 DibotryoidHerb.cxx:240
 DibotryoidHerb.cxx:241
 DibotryoidHerb.cxx:242
 DibotryoidHerb.cxx:243
 DibotryoidHerb.cxx:244