DLA-Fire-Prediction-Thesis 1.0
|
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 }