DLA-Fire-Prediction-Thesis 1.0

DLAStructure.cpp

Go to the documentation of this file.
00001 //----------------------------------------------------------------------------------------------------------------------
00004 //----------------------------------------------------------------------------------------------------------------------
00005 
00006 #include "DLAStructure.h"
00007 
00008 #include "ngl/Obj.h"
00009 #include "ngl/ShaderManager.h"
00010 #include "ngl/TransformStack.h"
00011 #include "ngl/Vector.h"
00012 #include "ngl/VBOPrimitives.h"
00013 
00014 #include "FuelObject.h"
00015 #include "FuelPoint.h"
00016 #include "GLWindow.h"
00017 
00018 
00019 //----------------------------------------------------------------------------------------------------------------------
00020 DLAStructure::DLAStructure()
00021 {
00022     // set list back to initial size
00023     std::vector<FuelObject> m_objZero;
00024     m_objList = m_objZero;
00025     std::vector<FuelPoint> m_pntZero;
00026     m_dlaLine = m_pntZero;
00027     m_dlaList = m_pntZero;
00028     m_scenePointList = m_pntZero;
00029 
00030     m_originSeed = ngl::Vector(0.0,0.0,0.0);
00031     m_scenePointList.push_back(FuelPoint(m_originSeed, 0));
00032 
00033     m_objList.push_back(FuelObject(ngl::Vector(4.0,0.0,0.0), 0, 1));
00034 
00035     m_sceneWidth = 30;
00036     m_sceneHeight = 30;
00037 
00038     m_pointRadius = 0.1;
00039 
00040     m_circleRadius = 2.0;
00041     m_dlaPointDistance = m_pointRadius*2;
00042     m_dlaSize = 800;
00043 
00044     m_checkForm = false;
00045     std::cout<<"...Please Be Patient the Fire Path is Building..."<<std::endl;
00046 
00047     FuelPoint m_origin = m_scenePointList[0];
00048     findPath(m_origin);
00049 }
00050 
00051 //----------------------------------------------------------------------------------------------------------------------
00052 DLAStructure::DLAStructure(
00053                           std::vector<FuelPoint>  _gridPointList,
00054                           std::vector<FuelObject> _objectPointList,
00055                           ngl::Vector _originPoint,
00056                           int _sceneWidth,
00057                           int _sceneHeight,
00058                           float _pointRadius,
00059                           int _dlaSize,
00060                           ngl::Vector _windDirection,
00061                           int _windSpeed
00062                           )
00063 {
00064     // set list back to initial size
00065     std::vector<FuelObject> m_objZero;
00066     m_objList = m_objZero;
00067     std::vector<FuelPoint> m_pntZero;
00068     m_dlaLine = m_pntZero;
00069     m_dlaList = m_pntZero;
00070     m_scenePointList = m_pntZero;
00071 
00072     // assign origin point
00073     m_originSeed = _originPoint;
00074     m_scenePointList.push_back(FuelPoint(m_originSeed, 0));
00075     FuelPoint m_origin = m_scenePointList[0];
00076 
00077     // assign terrain point to the list
00078     m_scenePointList = _gridPointList;
00079 
00080     m_windDir = _windDirection;
00081     m_windSpeed = _windSpeed;
00082 
00083     if(m_windDir.m_y<=10)
00084         m_windEnabled = true;
00085     else
00086         m_windEnabled = false;
00087 
00088     m_objList = _objectPointList;
00089 
00090     m_sceneWidth = _sceneWidth;
00091     m_sceneHeight = _sceneHeight;
00092 
00093     m_pointRadius = _pointRadius;
00094     m_currentOriginIndex = 0;
00095     m_distanceForm = 1.4;
00096 
00097     m_circleRadius = 2.0;
00098     m_dlaPointDistance = m_pointRadius*2;
00099     m_dlaSize = _dlaSize;
00100 
00101     m_checkForm = false;
00102 
00103     std::cout<<"...Please Be Patient the Fire Path is Building..."<<std::endl;
00104 
00105     findPath(m_origin);
00106     adaptPoint();
00107     arrangeList();
00108 }
00109 
00110 //----------------------------------------------------------------------------------------------------------------------
00111 DLAStructure::DLAStructure(
00112                           std::vector<FuelPoint>  _gridPointList,
00113                           std::vector<FuelObject> _objectPointList,
00114                           ngl::Vector _originPoint,
00115                           int _sceneWidth,
00116                           int _sceneHeight,
00117                           float _pointRadius,
00118                           std::vector<FuelPoint>  _previousDLAPoint,
00119                           std::vector<FuelPoint> _otherOriginList,
00120                           int _currentOriginIndex,
00121                           int _dlaSize,
00122                           ngl::Vector _windDirection,
00123                           int _windSpeed
00124                           )
00125 {
00126     // set list back to initial size
00127     std::vector<FuelObject> m_objZero;
00128     m_objList = m_objZero;
00129     std::vector<FuelPoint> m_pntZero;
00130     m_dlaLine = m_pntZero;
00131     m_dlaList = m_pntZero;
00132     m_scenePointList = m_pntZero;
00133 
00134     // assign origin point
00135     m_originSeed = _originPoint;
00136     m_scenePointList.push_back(FuelPoint(m_originSeed, 0));
00137     FuelPoint m_origin = m_scenePointList[0];
00138 
00139     // assign terrain point to the list
00140     m_scenePointList = _gridPointList;
00141 
00142     m_windDir = _windDirection;
00143     m_windSpeed = _windSpeed;
00144 
00145     if(m_windDir.m_y<=10)
00146         m_windEnabled = true;
00147     else
00148         m_windEnabled = false;
00149 
00150     m_objList = _objectPointList;
00151 
00152     m_sceneWidth = _sceneWidth;
00153     m_sceneHeight = _sceneHeight;
00154 
00155     m_pointRadius = _pointRadius;
00156 
00157     m_circleRadius = 2.0;
00158     m_dlaPointDistance = m_pointRadius*2;
00159     m_dlaSize = _dlaSize;
00160     m_distanceForm = 0.0;
00161 
00162     m_checkForm = true;
00163 
00164     m_otherOriginList = _otherOriginList;
00165     m_currentOriginIndex = _currentOriginIndex;
00166 
00167 
00168     m_previousDLAList = _previousDLAPoint;
00169 
00170     std::cout<<"...Please Be Patient the Fire Path is Building..."<<std::endl;
00171 
00172     findPath(m_origin);
00173     adaptPoint();
00174     arrangeList();
00175 }
00176 
00177 //----------------------------------------------------------------------------------------------------------------------
00178 void DLAStructure::adaptPoint()
00179 {
00180     // ----- deal with m_dlaList, m_dlaLine, and m_scenePointList
00181     for(unsigned int s=0; s<m_dlaList.size(); ++s)
00182     {
00183         FuelPoint m_dlaPoint = m_dlaList[s];
00184         ngl::Vector m_dlaPos = m_dlaPoint.getPosition();
00185 
00186         float m_adaptedYPos = getCurrentYPos(m_dlaPos);
00187 
00188         m_dlaPos.m_y = m_adaptedYPos;
00189         m_dlaPoint.setPosition(m_dlaPos);
00190 
00191         m_dlaList[s] = m_dlaPoint;
00192     }
00193 
00194     for(unsigned int t=0; t<m_dlaLine.size(); ++t)
00195     {
00196         FuelPoint m_dlaPoint = m_dlaLine[t];
00197         ngl::Vector m_dlaPos = m_dlaPoint.getPosition();
00198 
00199         float m_adaptedYPos = getCurrentYPos(m_dlaPos);
00200 
00201         m_dlaPos.m_y = m_adaptedYPos;
00202         m_dlaPoint.setPosition(m_dlaPos);
00203 
00204         m_dlaLine[t] = m_dlaPoint;
00205     }
00206 
00207     // ----- insert new burning time, refers to the slope
00208     for(unsigned int r=0; r<m_dlaLine.size(); ++r)
00209     {
00210         FuelPoint m_firstPoint = m_dlaList[r];
00211         ngl::Vector m_firstPointPos = m_firstPoint.getPosition();
00212 
00213         FuelPoint m_secondPoint = m_dlaLine[r];
00214         ngl::Vector m_secondPointPos = m_secondPoint.getPosition();
00215 
00216         float m_firstYPos = m_firstPointPos.m_y;//*1000;
00217         float m_secondYPos = m_secondPointPos.m_y;//*1000;
00218 
00219         float m_diffYLevel = m_secondYPos - m_firstYPos;
00220         int m_adjustValue = m_diffYLevel/0.1;
00221         float m_firstPointBurningTime = m_firstPoint.getBurningTime();
00222 
00223         float m_newBurningTime = m_firstPointBurningTime + m_adjustValue;
00224 
00225         m_firstPoint.setBurningTime(m_newBurningTime);
00226         m_dlaList[r] = m_firstPoint;
00227 
00228         m_secondPoint.setBurningTime(m_newBurningTime);
00229         m_dlaLine[r] = m_secondPoint;
00230     }
00231 
00232     // ----- manage generation
00233     for(unsigned int u=0; u<m_dlaList.size(); ++u)
00234     {
00235         FuelPoint m= m_dlaList[u];
00236 
00237         // decrease the generation
00238         if(m.getBurningTime()<10)
00239         {
00240             // get suitable generation
00241             FuelPoint m_headLine = m_dlaLine[u];
00242             ngl::Vector m_headLinePos = m_headLine.getPosition();
00243             int m_index = 0;
00244             for(unsigned int j=0; j<m_dlaList.size(); ++j)
00245             {
00246                 FuelPoint m_previousPoint = m_dlaList[j];
00247                 ngl::Vector m_previousPointPos = m_previousPoint.getPosition();
00248 
00249                 if((m_previousPointPos.m_x==m_headLinePos.m_x)&&(m_previousPointPos.m_z==m_headLinePos.m_z))
00250                     m_index = j;
00251             }
00252             FuelPoint m_headPoint = m_dlaList[m_index];
00253             int m_currentGen = m_headPoint.getGeneration();
00254 
00255             // decrease burning time
00256             m.setBurningTime(m.getBurningTime()-5);
00257 
00258             m.setGeneration(m_currentGen);
00259             m_dlaList[u] = m;
00260 
00261             FuelPoint m_line = m_dlaLine[u];
00262             m_line.setGeneration(m_currentGen);
00263             m_dlaLine[u] = m_line;
00264         }
00265         else if(m.getBurningTime()>10)
00266         {
00267             int m_currentGen = m.getGeneration();
00268 
00269             // decrease burning time
00270           //  m.setBurningTime(m.getBurningTime()-2);
00271 
00272             m.setGeneration(m_currentGen+1);
00273             m_dlaList[u] = m;
00274 
00275             FuelPoint m_line = m_dlaLine[u];
00276             m_line.setGeneration(m_currentGen+1);
00277             m_dlaLine[u] = m_line;
00278         }
00279         else
00280         {
00281             // decrease burning time
00282            // m.setBurningTime(m.getBurningTime()-3);
00283 
00284             //int m_currentGen = m.getGeneration();
00285            // m.setGeneration(m_currentGen+1);
00286             m_dlaList[u] = m;
00287 
00288             FuelPoint m_line = m_dlaLine[u];
00289            // m_line.setGeneration(m_currentGen+1);
00290             m_dlaLine[u] = m_line;
00291         } // end if-elst burning time condition
00292 
00293     } // end for loop of generation number managing
00294 }
00295 
00296 //----------------------------------------------------------------------------------------------------------------------
00297 float DLAStructure::getCurrentYPos(
00298                                   ngl::Vector m_currentDLAPos
00299                                   )
00300 {
00301     float m_yPos = m_currentDLAPos.m_y;
00302     int m_closedPointIndex = 0;
00303     float m_minimumDistance = 1000;
00304 
00305     // find the closest point
00306     for(unsigned int p=0; p<m_scenePointList.size(); ++p)
00307     {
00308         FuelPoint m_scenePoint = m_scenePointList[p];
00309         ngl::Vector m_scenePos = m_scenePoint.getPosition();
00310 
00311         m_scenePos.m_y = 0.0;
00312         m_currentDLAPos.m_y = 0.0;
00313 
00314         ngl::Vector m_deltaRange = m_scenePos - m_currentDLAPos;
00315         float m_distRange = m_deltaRange.length();
00316 
00317         if(m_distRange<m_minimumDistance)
00318         {
00319             m_closedPointIndex = p;
00320             m_minimumDistance = m_distRange;
00321         }
00322     }
00323 
00324     FuelPoint m_closedPoint = m_scenePointList[m_closedPointIndex];
00325     ngl::Vector m_closedPointPos = m_closedPoint.getPosition();
00326 
00327     // check if the closest point is in non-flammable area
00328     m_yPos = m_closedPointPos.m_y + 0.1;
00329 
00330     return m_yPos;
00331 }
00332 
00333 //----------------------------------------------------------------------------------------------------------------------
00337 ngl::Vector DLAStructure::getRandomPosition(
00338                                            ngl::Vector m_currentPos,
00339                                            float m_radius,
00340                                            int m_randomMode
00341                                            )
00342 {
00343     // ----- adjust windDirection for particular origin point
00344     if(m_windEnabled==true)
00345     {
00346         ngl::Vector m_newOrigin = m_currentPos;
00347         ngl::Vector m_originAtCentre = ngl::Vector(0.0,0.0,0.0);
00348 
00349         float m_xDiff = m_newOrigin.m_x - m_originAtCentre.m_x;
00350         float m_zDiff = m_newOrigin.m_z - m_originAtCentre.m_z;
00351 
00352         ngl::Vector m_adaptedOrigin = m_windDir;
00353         m_currentPos = ngl::Vector(m_adaptedOrigin.m_x+m_xDiff, m_adaptedOrigin.m_y, m_adaptedOrigin.m_z+m_zDiff);
00354 
00355         float m_windXDiff = m_currentPos.m_x - m_newOrigin.m_x;
00356         float m_windZDiff = m_currentPos.m_z - m_newOrigin.m_z;
00357 
00358         float m_adjustWindXDiff = (m_windSpeed*m_windXDiff)/10;
00359         float m_adjustWindZDiff = (m_windSpeed*m_windZDiff)/10;
00360         m_currentPos = ngl::Vector(m_newOrigin.m_x+m_adjustWindXDiff, m_currentPos.m_y, m_newOrigin.m_z+m_adjustWindZDiff);
00361 
00362         if(m_currentPos.m_x>m_sceneWidth/10)
00363              m_currentPos.m_x = m_sceneWidth/10;
00364          else if(m_currentPos.m_x<-(m_sceneWidth/10))
00365              m_currentPos.m_x = -(m_sceneWidth/10);
00366 
00367          if(m_currentPos.m_z>m_sceneHeight/10)
00368              m_currentPos.m_z = m_sceneHeight/10;
00369          else if(m_currentPos.m_z<-(m_sceneHeight/10))
00370              m_currentPos.m_z = -(m_sceneHeight/10);
00371     }
00372 
00373     float m_calcX = m_currentPos.m_x;
00374     float m_calcZ = m_currentPos.m_z;
00375     float m_y = m_currentPos.m_y;
00376 
00377     // random floating number
00378     m_radius = m_radius*100;
00379     m_y = rand() % (int)m_radius;
00380 
00381     // z-negative side
00382     if(m_randomMode==-1)
00383         m_y = m_y - m_radius;
00384 
00385     m_radius = m_radius/100;
00386     m_y = m_y/100;
00387 
00388     float xyRadius = m_radius/2;
00389 
00390     float m_twoPi = 6.283185;
00391     m_twoPi = m_twoPi*1000000;
00392 
00393     float xyTheta = rand()%(int)m_twoPi; // TWO_PI
00394     xyTheta = xyTheta/1000000;
00395 
00396     m_calcX = cos(xyTheta)*xyRadius;
00397     m_calcZ = sin(xyTheta)*xyRadius;
00398 
00399     m_calcX = setDecimalValue(m_calcX, 2);
00400     m_calcZ = setDecimalValue(m_calcZ, 2);
00401 
00402     m_calcX += m_currentPos.m_x;
00403     m_calcZ += m_currentPos.m_z;
00404     m_y = 0.0;
00405 
00406     return ngl::Vector(m_calcX,m_y, m_calcZ);
00407 }
00409 
00410 //----------------------------------------------------------------------------------------------------------------------
00411 void DLAStructure::findPath(
00412                            FuelPoint m_originPoint
00413                            )
00414 {
00415     ngl::Vector m_startPos = m_originPoint.getPosition();
00416 
00417     //m_dlaList.push_back(m_originPoint);
00418     //m_dlaLine.push_back(m_originPoint);
00419 
00420     int m_generationNumber = 0;
00421     int m_iterationNumber = 0;
00422     bool m_takesTooLong = false;
00423 
00424     while(((unsigned)m_dlaList.size() <(unsigned) m_dlaSize)&&(m_takesTooLong==false))
00425     {
00426         // get random position
00427         ngl::Vector m_initRandomPos = getRandomPosition(m_startPos, m_circleRadius, 1);
00428         int m_tempR = rand()%2 +1;
00429         if(m_tempR == 2)
00430             m_initRandomPos = getRandomPosition(m_startPos, m_circleRadius, -1);
00431 
00432         int m_nearIndex = 0;
00433         int m_movingStep = 0;
00434         bool m_near = false;
00435 
00436         int m_maximumSide = findMaximumSide(m_initRandomPos, m_startPos);
00437         // get the side of traveler position, according to seed point
00438         int m_side = findSideOfMaximumPosition(m_initRandomPos, m_startPos, m_maximumSide);
00439 
00440         int m_randomDirection = rand() % 6 +1;
00441         while(m_randomDirection==m_side || m_randomDirection==3 || m_randomDirection==4) //&& m_movingStep == 1)
00442             m_randomDirection = rand() % 6 +1;
00443 
00444         ngl::Vector m_deltaDistance = m_initRandomPos - m_startPos;
00445         float m_distance = m_deltaDistance.length();
00446 
00447         std::vector<FuelPoint> m_collectingTraveler;
00448 
00449         if(m_distance<=m_dlaPointDistance)
00450         {
00451             // hit or closed
00452             assignDLA(m_initRandomPos, m_startPos, 0);
00453         }
00454         else
00455         {
00456             m_near = false;
00457 
00458             while(m_near==false)
00459             {
00460                 int m_hitNonFlammable = 0;
00461                 int m_hitOtherDLA = 0;
00462                 int m_hitOtherOrigin = 0;
00463 
00464                 std::vector<FuelPoint> m_tempTraveler;
00465 
00466                 m_tempTraveler.push_back(m_originPoint);
00467                 m_tempTraveler.push_back(FuelPoint(m_initRandomPos, 1));
00468 
00469                 // move until it is near the point
00470                 while(m_near==false&&m_movingStep<200)
00471                 {
00472                     m_initRandomPos = moveRandomPoint(m_initRandomPos, m_randomDirection);
00473                     ++m_movingStep;
00474 
00475                     m_nearIndex = checkCollision(m_initRandomPos);
00476 
00477                     if(m_nearIndex!=0)
00478                     {
00479                         FuelPoint m_newPoint = m_dlaList[m_nearIndex];
00480                         m_startPos = m_newPoint.getPosition();
00481 
00482                         m_generationNumber = m_newPoint.getGeneration();
00483                     }
00484 
00485                     m_deltaDistance = m_initRandomPos - m_startPos;
00486                     m_distance = m_deltaDistance.length();
00487 
00488                     // random for next round
00489                     m_maximumSide = findMaximumSide(m_initRandomPos, m_startPos);
00490                     m_side = findSideOfMaximumPosition(m_initRandomPos, m_startPos, m_maximumSide);
00491                     m_randomDirection = rand()%6 +1;
00492                     while(m_randomDirection==m_side || m_randomDirection==3|| m_randomDirection==4)
00493                         m_randomDirection = rand() % 6 +1;
00494 
00495                     // if the dla structure and its position is satisfied, with the distance and position
00496                     if((m_distance<=m_dlaPointDistance)&&(m_distance>=m_pointRadius*m_distanceForm))
00497                     {
00498                         m_near = true;
00499 
00500                         // check if the fire goes out of world distance or not
00501                         m_initRandomPos = checkBoundary(m_initRandomPos);
00502 
00503                         // check if the fire hit non-frammable object
00504                         m_hitNonFlammable = checkCollisionWithNonFlammableObject(m_initRandomPos);
00505 
00506                         if(m_checkForm==true)
00507                         {
00508                             m_hitOtherDLA = checkCollisionWithOtherDLA(m_initRandomPos);
00509                             m_hitOtherOrigin = checkCollisionWithOtherOrigin(m_initRandomPos);
00510                         }
00511 
00512                         m_deltaDistance = m_initRandomPos - m_startPos;
00513                         m_distance = m_deltaDistance.length();
00514 
00515                         // check the distance that it would not collide to each other
00516                         if(m_distance<=m_pointRadius || m_hitNonFlammable==1 || m_hitOtherDLA==1 || m_hitOtherOrigin==1)
00517                             m_near = false;
00518 
00519                         m_deltaDistance = m_initRandomPos - m_startPos;
00520                         m_distance = m_deltaDistance.length();
00521                     }
00522                     else
00523                         m_near = false;
00524 
00525                     m_tempTraveler.push_back(FuelPoint(m_initRandomPos, 0));
00526                 }
00527 
00528                 // if still cannot find the random path to hit the point
00529                 // get new random point
00530                 if(m_near==false)
00531                 {
00532                     // reset moving step
00533                     m_movingStep = 0;
00534                     m_nearIndex = 0;
00535 
00536                     // random new m_circleRadius
00537                     // if change the plus value to 1.0, all the point will be hit
00538                     int m_newRadius = rand()% (int)m_circleRadius + 2.0;
00539                     m_tempR = rand()%2 + 1;
00540                     if(m_tempR==2)
00541                     {
00542                         m_newRadius = rand()% (int)(m_circleRadius*3) + 3.0;
00543                     }
00544 
00545                     m_circleRadius = m_newRadius;
00546                     m_generationNumber = 0;
00547 
00548                     // set the startPos back to original position
00549                     m_startPos = m_originPoint.getPosition();
00550                     m_initRandomPos = getRandomPosition(m_startPos, m_circleRadius, 1);
00551                     m_tempR = rand()%2 +1;
00552                     if(m_tempR == 2)
00553                         m_initRandomPos = getRandomPosition(m_startPos, m_circleRadius, -1);
00554                 }
00555                 m_collectingTraveler = m_tempTraveler;
00556             }
00557         }
00558 
00563         // adjust new circle radius of random-sphere
00564         ngl::Vector m_farFromOrig = m_initRandomPos - m_originSeed;
00565         float m_posMag = m_farFromOrig.length();
00566         if(m_posMag*1.5 >= m_circleRadius)
00567             m_circleRadius = m_posMag*1.5;
00570 
00571         assignDLA(m_initRandomPos, m_startPos, m_generationNumber);
00572 
00573         // set the startPos back to original position
00574         m_startPos = m_originPoint.getPosition();
00575 
00576         // increase the iteration count
00577         ++m_iterationNumber;
00578 
00579         if(m_iterationNumber>=m_dlaSize*4)
00580             m_takesTooLong = true;
00581     }
00582 
00583     std::cout<<"Path number: "<<m_currentOriginIndex+1<<" Ready! dla size: "<<m_dlaList.size()<<std::endl;
00584 }
00585 
00586 //----------------------------------------------------------------------------------------------------------------------
00587 ngl::Vector DLAStructure::checkBoundary(
00588                                        ngl::Vector m_newDLAPoint
00589                                        )
00590 {
00591     float m_xValue = m_newDLAPoint.m_x;
00592     float m_yValue = m_newDLAPoint.m_y;
00593     float m_zValue = m_newDLAPoint.m_z;
00594 
00595     if(m_xValue<(-m_sceneWidth/10))
00596         m_xValue = -m_sceneWidth/10;
00597 
00598     if(m_xValue>(m_sceneWidth/10)-0.2)
00599         m_xValue = (m_sceneWidth/10)-0.2;
00600 
00601     if(m_zValue<(-m_sceneHeight/10))
00602         m_zValue = -m_sceneHeight/10;
00603 
00604     if(m_zValue>(m_sceneHeight/10)-0.2)
00605         m_zValue = (m_sceneHeight/10)-0.2;
00606 
00607     return ngl::Vector(m_xValue, m_yValue, m_zValue);
00608 }
00609 
00610 //----------------------------------------------------------------------------------------------------------------------
00611 int DLAStructure::findMaximumSide(
00612                                  ngl::Vector m_travelerPos,
00613                                  ngl::Vector m_seedPos
00614                                  )
00615 {
00616     ngl::Vector m_initRandomPos = m_travelerPos;
00617     ngl::Vector m_startPos = m_seedPos;
00618     // find the position and direction of random point
00619     float m_deltaX = m_initRandomPos.m_x - m_startPos.m_x;
00620     float m_deltaY = m_initRandomPos.m_y - m_startPos.m_y;
00621     float m_deltaZ = m_initRandomPos.m_z - m_startPos.m_z;
00622 
00623     int absX = m_deltaX*100;
00624     absX = abs(absX);
00625     int absY = m_deltaY*100;
00626     absY = abs(absY);
00627     int absZ = m_deltaZ*100;
00628     absZ = abs(absZ);
00629 
00630     int m_maximumSide = findFarthestPos(absX, absY, absZ);
00631 
00632     return m_maximumSide;
00633 }
00634 
00635 //----------------------------------------------------------------------------------------------------------------------
00636 // find the closest point position between traveler and dla point
00637 int DLAStructure::checkCollision(
00638                                 ngl::Vector m_travelerPos
00639                                 )
00640 {
00641     ngl::Vector m_randomPos = m_travelerPos;
00642     int m_seedIndex = 0;
00643     float m_minTempDistance = 1000000.0;
00644 
00645     // check if it is hit anything
00646     // and find the closest point
00647     // collision checking
00648     for(unsigned int t=0; t<m_dlaList.size(); ++t)
00649     {
00650         FuelPoint m_tempHitPoint = m_dlaList[t];
00651         ngl::Vector m_tempHitPos = m_tempHitPoint.getPosition();
00652 
00653         ngl::Vector m_tempDelta = m_randomPos - m_tempHitPos;
00654         float m_tempDistance = m_tempDelta.length();
00655 
00656         if(m_tempDistance<m_minTempDistance)
00657         {
00658             m_minTempDistance = m_tempDistance;
00659             m_seedIndex = t;
00660         }
00661     }
00662 
00663     return m_seedIndex;
00664 }
00665 
00666 //----------------------------------------------------------------------------------------------------------------------
00667 int DLAStructure::findSideOfMaximumPosition(
00668                                            ngl::Vector m_travelerPos,
00669                                            ngl::Vector m_seedPos,
00670                                            int m_maximumSide
00671                                            )
00672 {
00673     ngl::Vector m_randomPos = m_travelerPos;
00674     ngl::Vector m_originPos = m_seedPos;
00675 
00676     int m_side = 0;
00677 
00678     // find sides of traveler, according to origin
00679     if(m_maximumSide==1)
00680     {
00681         // x
00682         if(m_randomPos.m_x<m_originPos.m_x)
00683         {
00684             m_side = 2;
00685             // negative side (left side)
00686             // no 2 for first move
00687         }
00688         else
00689         {
00690             m_side = 1;
00691             // positive side (right side)
00692             // no 1 for first move
00693         }
00694     }
00695     else if(m_maximumSide==2)
00696     {
00697         // y
00698         if(m_randomPos.m_y<m_originPos.m_y)
00699         {
00700             m_side = 4;
00701             // negative side (left side)
00702         }
00703         else
00704         {
00705             m_side = 3;
00706             // positive side (right side)
00707         }
00708     }
00709     else
00710     {
00711         // z
00712         if(m_randomPos.m_z<m_originPos.m_z)
00713         {
00714             m_side = 6;
00715             // negative side (left side)
00716         }
00717         else
00718         {
00719             m_side = 5;
00720             // positive side (right side)
00721         }
00722     }
00723 
00724     return m_side;
00725 }
00726 
00727 
00728 //----------------------------------------------------------------------------------------------------------------------
00729 void DLAStructure::assignDLA(
00730                             ngl::Vector m_newDLAPoint,
00731                             ngl::Vector m_seed, int m_generationNumber
00732                             )
00733 {
00734     // insert the distance from origin
00735     ngl::Vector m_distanceFromOrigin = m_newDLAPoint - m_originSeed;
00736     float m_distanceFarFromOrigin = m_distanceFromOrigin.length();
00737 
00738     bool m_addToList = true;
00739 
00740     float m_intDist = m_distanceFarFromOrigin*100;
00741     m_distanceFarFromOrigin = round(m_intDist);
00742     m_distanceFarFromOrigin = m_distanceFarFromOrigin/100;
00743 
00744     m_newDLAPoint.m_w = m_distanceFarFromOrigin;
00745 
00746     m_distanceFromOrigin = m_seed - m_originSeed;
00747     m_distanceFarFromOrigin = m_distanceFromOrigin.length();
00748 
00749     m_intDist = m_distanceFarFromOrigin*100;
00750     m_distanceFarFromOrigin = round(m_intDist);
00751     m_distanceFarFromOrigin = m_distanceFarFromOrigin/100;
00752 
00753     m_seed.m_w = m_distanceFarFromOrigin;
00754 
00755     //ngl::Vector m_betPoint = m_newDLAPoint - m_seed;
00756     //float m_betDist = m_betPoint.length();
00757     //if((m_betDist<0.15)&&(m_dlaList.size()>10))
00758     {
00759         //m_addToList = false;
00760     }
00761 
00762     if(m_addToList==true)
00763     {
00764         m_dlaList.push_back(FuelPoint(m_newDLAPoint,0));
00765         m_dlaLine.push_back(FuelPoint(m_seed, 0));
00766     }
00767 
00768     int m_burningTime = 0;
00769 
00770     // ----- check if the new assigned point goes against the wind or not
00771     if(m_windEnabled==true)
00772     {
00773         ngl::Vector m_windDirection = ngl::Vector(0.0,0.0,0.0) - m_windDir;
00774         ngl::Vector m_windUnitVector = m_windDirection/m_windDirection.length();
00775 
00776         ngl::Vector m_fireDirection = m_seed - m_newDLAPoint;
00777 
00778         bool m_negativeZ = false;
00779         bool m_negativeX = false;
00780 
00781         if(m_windUnitVector.m_x<0)
00782             m_negativeX = true;
00783 
00784         if(m_windUnitVector.m_z<0)
00785             m_negativeZ = true;
00786 
00787         bool m_changeX = false;
00788         bool m_changeZ = false;
00789 
00790         if(m_negativeX==true)
00791         {
00792             if(m_fireDirection.m_x<0)
00793             {
00794                 m_changeX = false;
00795             }
00796             else
00797             {
00798                 m_changeX = true;
00799             }
00800         }
00801         else
00802         {
00803             if(m_fireDirection.m_x>=0)
00804             {
00805                 m_changeX = false;
00806             }
00807             else
00808             {
00809                 m_changeX = true;
00810             }
00811         }// end if x change
00812 
00813         if(m_negativeZ==true)
00814         {
00815             if(m_fireDirection.m_z<0)
00816             {
00817                 m_changeZ = false;
00818             }
00819             else
00820             {
00821                 m_changeZ = true;
00822             }
00823         }
00824         else
00825         {
00826             if(m_fireDirection.m_z>=0)
00827             {
00828                 m_changeZ = false;
00829             }
00830             else
00831             {
00832                 m_changeZ = true;
00833             }
00834         } // end if z change
00835 
00836         int m_speed = m_windSpeed;
00837         if((m_windSpeed>1)&&(m_windSpeed<=6))
00838         {
00839             m_speed = m_windSpeed*1.6;
00840         }
00841         else if((m_windSpeed>6)&&(m_windSpeed<=9))
00842         {
00843             m_speed = m_windSpeed*1.4;
00844         }
00845         else
00846         {
00847             m_speed = m_windSpeed*1.2;
00848         }
00849 
00850         if((m_changeX==true)&&(m_changeZ==true))
00851         {
00852             m_generationNumber += m_speed;
00853         }
00854         else if(((m_changeX==true)&&(m_changeZ==false))||((m_changeX==false)&&(m_changeZ==true)))
00855         {
00856             m_generationNumber += 2;
00857         }
00858 
00859     } // end if wind is enabled
00860 
00861     if(m_addToList==true)
00862     {
00863         // ----- set the generation
00864         FuelPoint m_firePoint = m_dlaList[m_dlaList.size()-1];
00865         m_firePoint.setGeneration(m_generationNumber+1);
00866         int m_currentBTime = m_firePoint.getBurningTime();
00867         m_firePoint.setBurningTime(m_currentBTime+m_burningTime);
00868         m_dlaList[m_dlaList.size()-1] = m_firePoint;
00869 
00870         m_firePoint = m_dlaLine[m_dlaLine.size()-1];
00871         m_firePoint.setGeneration(m_generationNumber+1);
00872         m_dlaLine[m_dlaLine.size()-1] = m_firePoint;
00873     }
00874 }
00875 
00876 //----------------------------------------------------------------------------------------------------------------------
00877 ngl::Vector DLAStructure::moveRandomPoint(
00878                                          ngl::Vector m_currentPoint,
00879                                          int m_mode
00880                                          )
00881 {
00882     if(m_mode==1)       // ++x
00883     {
00884         m_currentPoint.m_x += m_pointRadius*8;
00885     }
00886     else if(m_mode==2)  // --x
00887     {
00888         m_currentPoint.m_x -= m_pointRadius*8;
00889     }
00890     else if(m_mode==3)  // ++y
00891     {
00892         m_currentPoint.m_y += m_pointRadius*8;
00893     }
00894     else if(m_mode==4)  // --y
00895     {
00896         m_currentPoint.m_y -= m_pointRadius*8;
00897     }
00898     else if(m_mode==5)  // ++z
00899     {
00900         m_currentPoint.m_z += m_pointRadius*8;
00901     }
00902     else                // --z
00903     {
00904         m_currentPoint.m_z -= m_pointRadius*8;
00905     }
00906 
00907     return m_currentPoint;
00908 }
00909 
00910 //----------------------------------------------------------------------------------------------------------------------
00911 int DLAStructure::findFarthestPos(
00912                                  int m_numberOne,
00913                                  int m_numberTwo,
00914                                  int m_numberThree
00915                                  )
00916 {
00917     int m_max = 1;
00918     if(m_numberOne<m_numberTwo)
00919     {
00920         if(m_numberTwo<m_numberThree)
00921         {
00922             m_max = 3;
00923         }
00924         else
00925         {
00926             m_max = 2;
00927         }
00928     }
00929     else
00930     {
00931         m_max = 1;
00932     }
00933     return m_max;
00934 }
00935 
00936 //----------------------------------------------------------------------------------------------------------------------
00937 float DLAStructure::setDecimalValue(
00938                                    float m_number,
00939                                    int m_decimalPlaces
00940                                    )
00941 {
00942     float m_decimalPlacesNumber = pow(10, m_decimalPlaces);
00943     float m_intNumber = m_number * m_decimalPlacesNumber;
00944     int m_roundedNumber = ceil(m_intNumber);
00945     float m_fixedNumber = m_roundedNumber/m_decimalPlacesNumber;
00946 
00947     return m_fixedNumber;
00948 }
00949 
00950 //----------------------------------------------------------------------------------------------------------------------
00951 int DLAStructure::checkCollisionWithNonFlammableObject(
00952                                                       ngl::Vector m_newDLAPoint
00953                                                       )
00954 {
00955     int m_isCollided = 0;
00956 
00957     for(unsigned int d=0; d<m_objList.size(); ++d)
00958     {
00959         FuelObject m_objectPoint = m_objList[d];
00960         ngl::Vector m_objectPos = m_objectPoint.getPosition();
00961         float m_objectRadius = m_objectPoint.getRadius() + 0.1;
00962 
00963         ngl::Vector m_delta= m_newDLAPoint - m_objectPos;
00964         float m_distance = m_delta.length();
00965 
00966         if(m_objectPoint.getShape()==2)
00967         {
00968            m_distance = m_objectRadius;
00969 
00970            float m_plusX = m_objectPos.m_x + m_objectRadius;
00971            float m_minusX = m_objectPos.m_x - m_objectRadius;
00972 
00973            float m_plusZ = m_objectPos.m_z + m_objectRadius;
00974            float m_minusZ = m_objectPos.m_z - m_objectRadius;
00975 
00976            if(m_newDLAPoint.m_x<m_plusX && m_newDLAPoint.m_x>m_minusX)
00977                if(m_newDLAPoint.m_z<m_plusZ && m_newDLAPoint.m_z>m_minusZ)
00978                    m_isCollided = 1;
00979 
00980         }
00981 
00982         // if it is collided
00983         if(m_distance<m_objectRadius)
00984             m_isCollided = 1;
00985     }
00986 
00987     return m_isCollided;
00988 }
00989 
00990 //----------------------------------------------------------------------------------------------------------------------
00991 std::vector<FuelPoint> DLAStructure::getDLAList()
00992 {
00993     return m_dlaList;
00994 }
00995 
00996 //----------------------------------------------------------------------------------------------------------------------
00997 std::vector<FuelPoint> DLAStructure::getDLALine()
00998 {
00999     return m_dlaLine;
01000 }
01001 
01002 //----------------------------------------------------------------------------------------------------------------------
01003 void DLAStructure::arrangeList()
01004 {
01005     // get maximum generation
01006     int m_generationCounterForHeadLine=0;
01007     for(unsigned int k=0; k<m_dlaLine.size(); ++k)
01008     {
01009         FuelPoint m = m_dlaLine[k];
01010         if(m_generationCounterForHeadLine<m.getGeneration())
01011             m_generationCounterForHeadLine = m.getGeneration();
01012     }
01013 
01014     // put the generation counter to the first point of the list at the value of w
01015     FuelPoint m_firstPointLine = m_dlaLine[0];
01016     ngl::Vector m_firstLine = m_firstPointLine.getPosition();
01017     m_firstLine.m_w = m_generationCounterForHeadLine;
01018     m_firstPointLine.setPosition(m_firstLine);
01019     m_dlaLine[0] = m_firstPointLine;
01020 
01021     int m_generationCounter = 0;
01022     for(unsigned int j=0; j<m_dlaList.size(); ++j)
01023     {
01024         FuelPoint n = m_dlaList[j];
01025         if(m_generationCounter<n.getGeneration())
01026             m_generationCounter = n.getGeneration();
01027     }
01028 
01029     m_firstPointLine = m_dlaList[0];
01030     m_firstLine = m_firstPointLine.getPosition();
01031     m_firstLine.m_w = m_generationCounterForHeadLine;
01032     m_firstPointLine.setPosition(m_firstLine);
01033     m_dlaList[0] = m_firstPointLine;
01034 
01035     // ----- sort the dlaList list
01036     std::vector<FuelPoint> m_dlaArrangedList;
01037 
01038     // arrange the list
01039     for(int g=0; g<=m_generationCounter; ++g)
01040     {
01041         std::vector<FuelPoint> m_arrangedList;
01042 
01043         for(unsigned int h=0; h<m_dlaList.size(); ++h)
01044         {
01045             FuelPoint m_genPoint = m_dlaList[h];
01046             int m_genNumber = m_genPoint.getGeneration();
01047 
01048             if(m_genNumber==g)
01049                 m_arrangedList.push_back(m_genPoint);
01050         }
01051 
01052         // input the list
01053         if(g==0)
01054         {
01055             m_dlaArrangedList = m_arrangedList;
01056         }
01057         else
01058         {
01059             for(unsigned int e=0; e<m_arrangedList.size(); ++e)
01060             {
01061                 FuelPoint m_arrangePoint = m_arrangedList[e];
01062                 m_dlaArrangedList.push_back(m_arrangePoint);
01063             } // end for loop
01064         } // end if-else
01065     } // end for loop arrange list
01066 
01067     m_dlaList = m_dlaArrangedList;
01068 
01069     // ----- sort the dlaLine list
01070     std::vector<FuelPoint> m_dlaArrangedLine;
01071 
01072     // arrange the list
01073     for(int g=0; g<=m_generationCounterForHeadLine; ++g)
01074     {
01075         std::vector<FuelPoint> m_arrangedLine;
01076 
01077         for(unsigned int h=0; h<m_dlaLine.size(); ++h)
01078         {
01079             FuelPoint m_genPoint = m_dlaLine[h];
01080             int m_genNumber = m_genPoint.getGeneration();
01081 
01082             if(m_genNumber==g)
01083                 m_arrangedLine.push_back(m_genPoint);
01084         }
01085 
01086         // input the list
01087         if(g==0)
01088         {
01089             m_dlaArrangedLine = m_arrangedLine;
01090         }
01091         else
01092         {
01093             for(unsigned int e=0; e<m_arrangedLine.size(); ++e)
01094             {
01095                 FuelPoint m_arrangePoint = m_arrangedLine[e];
01096                 m_dlaArrangedLine.push_back(m_arrangePoint);
01097             } // end for loop
01098         } // end if-else
01099     } // end for loop arrange list
01100 
01101     m_dlaLine = m_dlaArrangedLine;
01102 }
01103 
01104 //----------------------------------------------------------------------------------------------------------------------
01105 int DLAStructure::checkCollisionWithOtherDLA(
01106                                             ngl::Vector m_newDLAPoint
01107                                             )
01108 {
01109     int m_isCollided = 0;
01110 
01111     for(unsigned int r=0; r<m_previousDLAList.size(); ++r)
01112     {
01113 
01114         FuelPoint m_previousDLA = m_previousDLAList[r];
01115         ngl::Vector m_previousDLAPos = m_previousDLA.getPosition();
01116 
01117         ngl::Vector m_deltaPreviousDLA = m_newDLAPoint - m_previousDLAPos;
01118         float m_distacePreviousDLA = m_deltaPreviousDLA.length();
01119 
01120         if(m_distacePreviousDLA<0.5)
01121             m_isCollided = 1;
01122     }
01123 
01124     return m_isCollided;
01125 }
01126 
01127 //----------------------------------------------------------------------------------------------------------------------
01128 int DLAStructure::checkCollisionWithOtherOrigin(
01129                                                ngl::Vector m_newDLAPoint
01130                                                )
01131 {
01132     int m_isCollided = 0;
01133 
01134     for(unsigned int d=0; d<m_otherOriginList.size(); ++d)
01135     {
01136         if(d!=(unsigned)m_currentOriginIndex)
01137         {
01138             FuelPoint m_otherOriginPoint = m_otherOriginList[d];
01139             ngl::Vector m_otherOriginPos = m_otherOriginPoint.getPosition();
01140 
01141             // between origin
01142             ngl::Vector m_originDistance = m_originSeed - m_otherOriginPos;
01143             float m_otherOriginRadius = m_originDistance.length();//m_otherOriginPos.m_w;
01144            // if(m_windEnabled==true)
01145                // m_otherOriginRadius = 0.6;
01146             //else
01147                // m_otherOriginRadius *= 0.4;
01148             //if(m_otherOriginRadius>0.6)
01149                 m_otherOriginRadius *= 0.4;
01150 
01151             ngl::Vector m_deltaPreviousDLA = m_newDLAPoint - m_otherOriginPos;
01152             float m_distacePreviousDLA = m_deltaPreviousDLA.length();
01153 
01154             if(m_distacePreviousDLA<m_otherOriginRadius)
01155                 m_isCollided = 1;
01156         }
01157     }
01158 
01159     return m_isCollided;
01160 }
 All Classes Namespaces Files Functions Variables Enumerations Enumerator