亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? forecasting.cpp

?? 這是一個GPS相關的程序
?? CPP
字號:
/*******************************************************************************
    Forecasting.cpp
    Copyright (C) Victor Olaya
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*******************************************************************************/ 

#include "../../../modules/grid/grid_tools/Grid_Gaps.h"

#include "Forecasting.h"

#include <time.h>

#define MS2FTMIN (60.0 / 0.3048)
#define FTMIN2MMIN 0.3048
#define MIN_RATIO_BURNT_AREA 2.

CForecasting::CForecasting(void){

	Parameters.Set_Name(_TL("Fire Risk Analysis"));
	Parameters.Set_Description(_TW(
		"(c) 2004 Victor Olaya. Fire Risk Analysis"));

	Parameters.Add_Grid(NULL, 
						"DEM", 
						_TL("DEM"), 
						_TL(""), 
						PARAMETER_INPUT);

	Parameters.Add_Grid(NULL, 
						"FUEL", 
						_TL("Fuel Model"), 
						_TL(""), 
						PARAMETER_INPUT);

	Parameters.Add_Grid(NULL, 
						"WINDSPD", 
						_TL("Wind Speed"),
						_TL("Wind Speed (m/s)"), 
						PARAMETER_INPUT);
	
	Parameters.Add_Grid(NULL, 
						"WINDDIR", 
						_TL("Wind Direction"), 
						_TL("Wind Direction (degrees clockwise from north)"),
						PARAMETER_INPUT);

	Parameters.Add_Grid(NULL, 
						"M1H", 
						_TL("Dead Fuel Moisture 1H"), 
						_TL(""), 
						PARAMETER_INPUT);

	Parameters.Add_Grid(NULL, 
						"M10H", 
						_TL("Dead Fuel Moisture 10H"),
						_TL(""), 
						PARAMETER_INPUT);

	Parameters.Add_Grid(NULL, 
						"M100H", 
						_TL("Dead Fuel Moisture 100H"),
						_TL(""), 
						PARAMETER_INPUT);

	Parameters.Add_Grid(NULL, 
						"MHERB", 
						_TL("Herbaceous Fuel Moisture"),
						_TL(""), 
						PARAMETER_INPUT);

	Parameters.Add_Grid(NULL, 
						"MWOOD", 
						_TL("Wood Fuel Moisture"), 
						_TL(""), 
						PARAMETER_INPUT);

	Parameters.Add_Grid(NULL, 
						"VALUE", 
						_TL("Value"), 
						_TL(""), 
						PARAMETER_INPUT_OPTIONAL);
	
	Parameters.Add_Grid(NULL, 
						"BASEPROB", 
						_TL("Base Probability"), 
						_TL(""), 
						PARAMETER_INPUT_OPTIONAL);	
	
	Parameters.Add_Grid(NULL, 
						"DANGER", 
						_TL("Danger"), 
						_TL(""), 
						PARAMETER_OUTPUT);
	
	Parameters.Add_Grid(NULL, 
						"COMPPROB", 
						_TL("Compound Probability"), 
						_TL(""), 
						PARAMETER_OUTPUT);

	Parameters.Add_Grid(NULL, 
						"PRIORITY", 
						_TL("Priority Index"), 
						_TL(""), 
						PARAMETER_OUTPUT);

	Parameters.Add_Value(NULL,
						"MONTECARLO",
						_TL("Number of Events"),
						_TL("N\xc3\xbamero of Monte-Carlo events"),
						PARAMETER_TYPE_Int,
						1000,
						1.,
						true);

	Parameters.Add_Value(NULL,
						"INTERVAL",
						_TL("Fire Length"),
						_TL("Fire Length (min)"),
						PARAMETER_TYPE_Double,
						100,
						1.,
						true);


}//constructor

CForecasting::~CForecasting(void)
{
}//destructor

bool CForecasting::On_Execute(void){

	AssignParameters();
	CalculateGrids();

	delete m_pSlopeGrid;
	delete m_pAspectGrid;

	return true;

}//method

bool CForecasting::AssignParameters(){

	int x,y;

	m_pDEM = Parameters("DEM")->asGrid();
	m_pFuelGrid = Parameters("FUEL")->asGrid();
	m_pWindDirGrid = Parameters("WINDDIR")->asGrid();
	m_pWindSpdGrid = Parameters("WINDSPD")->asGrid();
	m_pM1Grid = Parameters("M1H")->asGrid();
	m_pM10Grid = Parameters("M10H")->asGrid();
	m_pM100Grid = Parameters("M100H")->asGrid();
	m_pMHerbGrid = Parameters("MHERB")->asGrid();
	m_pMWoodGrid = Parameters("MWOOD")->asGrid();
	m_pDangerGrid = Parameters("DANGER")->asGrid();
	m_pValueGrid = Parameters("VALUE")->asGrid();
	m_pBaseProbabilityGrid = Parameters("BASEPROB")->asGrid();
	m_pCompoundProbabilityGrid = Parameters("COMPPROB")->asGrid();
	m_pPriorityIndexGrid = Parameters("PRIORITY")->asGrid();
	m_iInterval = Parameters("INTERVAL")->asInt();
	m_iNumEvents = Parameters("MONTECARLO")->asInt();

	/* create a standard fuel model catalog and a flame length table. */
    m_Catalog = Fire_FuelCatalogCreateStandard("Standard", 13);
    Fire_FlameLengthTable(m_Catalog, 500, 0.1);

	if (!m_pBaseProbabilityGrid){
		m_pBaseProbabilityGrid = SG_Create_Grid(m_pDEM, GRID_TYPE_Double);
		m_pBaseProbabilityGrid->Assign(1);
	}//if
	if (!m_pValueGrid){
		m_pValueGrid = SG_Create_Grid(m_pDEM, GRID_TYPE_Double);
		m_pValueGrid->Assign(1);
	}//if

	//substitute no-data values
	for(y=0; y<Get_NY() && Set_Progress(y); y++){		
		for(x=0; x<Get_NX(); x++){

			if (m_pWindSpdGrid->is_NoData(x, y)){
				m_pWindSpdGrid->Set_Value(x, y, 0.);
			}//if
			if (m_pWindDirGrid->is_NoData(x, y)){
				m_pWindDirGrid->Set_Value(x, y, 0.);
			}//if
			if (m_pM1Grid->is_NoData(x, y)){
				m_pM1Grid->Set_Value(x, y, 0.);
			}//if
			if (m_pM10Grid->is_NoData(x, y)){
				m_pM10Grid->Set_Value(x, y, 0.);
			}//if
			if (m_pM100Grid->is_NoData(x, y)){
				m_pM100Grid->Set_Value(x, y, 0.);
			}//if
			if (m_pMHerbGrid->is_NoData(x, y)){
				m_pMHerbGrid->Set_Value(x, y, 0.);
			}//if
			if (m_pMWoodGrid->is_NoData(x, y)){
				m_pMWoodGrid->Set_Value(x, y, 0.);
			}//if
			if (m_pBaseProbabilityGrid->is_NoData(x, y)){
				m_pBaseProbabilityGrid->Set_Value(x, y, 0.);
			}//if

		}//for
	}//for


	//-----------------------------------------------------
	// calculate slope and aspect using CSG_Grid class'
	// built-in function (after Zevenbergen & Thorne)...

	m_pSlopeGrid	= SG_Create_Grid(m_pDEM, GRID_TYPE_Double);
	m_pAspectGrid	= SG_Create_Grid(m_pDEM, GRID_TYPE_Double);

	for(y=0; y<Get_NY() && Set_Progress(y); y++)
	{		
		for(x=0; x<Get_NX(); x++)
		{
			double	slope, aspect;

			if( m_pDEM->Get_Gradient(x, y, slope, aspect) )
			{
				m_pSlopeGrid	->Set_Value(x, y, slope);
				m_pAspectGrid	->Set_Value(x, y, aspect);
			}
			else
			{
				m_pSlopeGrid	->Set_NoData(x, y);
				m_pAspectGrid	->Set_NoData(x, y);
			}
		}
	}


	//-----------------------------------------------------
	m_pTimeGrid = SG_Create_Grid(m_pDEM, GRID_TYPE_Double);

	m_pTimeGrid->Assign((double)0);
	m_pDangerGrid->Assign((double)0);
	m_pCompoundProbabilityGrid->Assign((double)0);	
	
	//m_pPriorityIndexGrid = Get_SafeNew_Grid(m_pDEM, GRID_TYPE_Double);

	return true;

}//method


void CForecasting::CalculateGrids(){
	
	int x,y;
	int i;
	int iRecommendedNumFires;
	double dDanger;
	double dTotalBurntArea = 0;
	CSG_String sMessage;

	m_CentralPoints	.Clear();
	m_AdjPoints		.Clear();

	srand(time(NULL));

	Process_Set_Text(_TL("Calculating danger..."));
	for(i=0; i<m_iNumEvents && Set_Progress(i, m_iNumEvents); i++){
		x = rand() % (m_pDEM->Get_NX()-1);
		y = rand() % (m_pDEM->Get_NY()-1);
		m_CentralPoints.Clear();
		m_CentralPoints.Add(x,y);
		m_pTimeGrid->Set_Value(x,y,0.0);	
		dDanger = CalculateFireSpreading();
		dTotalBurntArea += dDanger;
		m_pDangerGrid->Set_Value(x, y, dDanger);		
	}//for

	m_CentralPoints	.Clear();
	m_AdjPoints		.Clear();

	m_pDangerGrid->Set_NoData_Value(0.0);
	m_pDangerGrid->Set_Unit(_TL("m2/h"));
	
	Process_Set_Text(_TL("Closing Gaps..."));

	CGrid_Gaps pGaps;
	if(	!pGaps.Get_Parameters()->Set_Parameter(SG_T("INPUT"), PARAMETER_TYPE_Grid, m_pDangerGrid)
	||	!pGaps.Execute() ){
		return;
	}//if

	for (y=0; y<Get_NY(); y++){
		for (x=0; x<Get_NX(); x++){
			m_pCompoundProbabilityGrid->Set_Value(x,y, 
				m_pCompoundProbabilityGrid->asFloat(x,y) / (float)m_iNumEvents);
			m_pPriorityIndexGrid->Set_Value(x, y, m_pCompoundProbabilityGrid->asFloat(x,y)*
				m_pDangerGrid->asFloat(x,y));
		}//for
	}//for

	float dRatio = (float)(dTotalBurntArea / (m_pDEM->Get_Cellsize() * m_pDEM->Get_Cellsize()));
	if (dRatio < MIN_RATIO_BURNT_AREA){
		iRecommendedNumFires =(int)((float) m_iNumEvents / dRatio * (float) MIN_RATIO_BURNT_AREA);
		sMessage.Printf(
			_TL("** Warning : Number of events might not be representative.\nMinimum number recommended: ")
		);
		sMessage	+= SG_Get_String(iRecommendedNumFires, 0);
		sMessage	+= SG_T("\n");
		Message_Add(sMessage.c_str());
	}//if

}//method

double CForecasting::CalculateFireSpreading(){

	int x,y;
	int x2,y2;
	int n;
	bool bReturn = false;
	/* neighbor's address*/   /* N  NE   E  SE   S  SW   W  NW */
	static int nX[8] =        {  0,  1,  1,  1,  0, -1, -1, -1};
    static int nY[8] =        {  1,  1,  0, -1, -1, -1,  0,  1};
	double nDist[8];          /* distance to each neighbor */
    double nAzm[8];           /* compass azimuth to each neighbor (0=N) */	
	size_t modelNumber;       /* fuel model number at current cell */
    double moisture[6];       /* fuel moisture content at current cell */
    double dSpreadRate;       /* spread rate in direction of neighbor */
    double dSpreadTime;       /* time to spread from cell to neighbor */
    double dIgnTime;          /* time neighbor is ignited by current cell */
	double dWindSpd;
	double dBurntValue = 0;
	double dProbability;

	m_pTimeGrid->Assign(0.0);
	
    for (n=0; n<8; n++){
        nDist[n] = sqrt ( nX[n] * m_pDEM->Get_Cellsize() * nX[n] * m_pDEM->Get_Cellsize()
                        + nY[n] * m_pDEM->Get_Cellsize() * nY[n] * m_pDEM->Get_Cellsize() );
        nAzm[n] = n * 45.;
    }//for

	x = m_CentralPoints.Get_X(0);
	y = m_CentralPoints.Get_Y(0);
	dProbability = (float)(rand()) / (float)(RAND_MAX); 

	if (m_pBaseProbabilityGrid->asFloat(x,y) < dProbability){
		return 0;
	}//if

	while (m_CentralPoints.Get_Count()!=0){

		for (int iPt=0; iPt<m_CentralPoints.Get_Count();iPt++){

			x = m_CentralPoints.Get_X(iPt);
			y = m_CentralPoints.Get_Y(iPt);

			if (!m_pDEM->is_NoData(x,y) && !m_pFuelGrid->is_NoData(x,y)){

				modelNumber = (size_t) m_pFuelGrid->asInt(x, y);
				moisture[0] = m_pM1Grid->asFloat(x, y);
				moisture[1] = m_pM10Grid->asFloat(x, y);
				moisture[2] = m_pM100Grid->asFloat(x, y);
				moisture[3] = m_pM100Grid->asFloat(x, y);
				moisture[4] = m_pMHerbGrid->asFloat(x, y);;
				moisture[5] = m_pMWoodGrid->asFloat(x, y);
				dWindSpd = m_pWindSpdGrid->asFloat(x,y)  * MS2FTMIN; 
				Fire_SpreadNoWindNoSlope(m_Catalog, modelNumber, moisture);
				Fire_SpreadWindSlopeMax(m_Catalog, modelNumber, dWindSpd,
										 m_pWindDirGrid->asFloat(x,y), tan(m_pSlopeGrid->asFloat(x,y)),
										 m_pAspectGrid->asFloat(x,y, true));

				for (n=0; n<8; n++){
					x2 = x + nX[n];
					y2 = y + nY[n];
					if (m_pTimeGrid->is_InGrid(x2,y2,false)){
						Fire_SpreadAtAzimuth(m_Catalog, modelNumber, nAzm[n], FIRE_NONE);
						dSpreadRate = Fuel_SpreadAny(m_Catalog, modelNumber); // in ft/min (awkward...)					
						dSpreadRate *= FTMIN2MMIN; //a bit better...
						if (dSpreadRate > Smidgen){
							dSpreadTime = nDist[n] / dSpreadRate;
							dIgnTime = 	m_pTimeGrid->asDouble(x,y) + dSpreadTime;												
							if (dIgnTime < m_iInterval){
								if (m_pTimeGrid->asDouble(x2,y2) == 0.0 
										|| m_pTimeGrid->asDouble(x2, y2)>dIgnTime){
									if (m_pTimeGrid->asDouble(x2, y2)==0.0){
										dBurntValue += m_pValueGrid->asDouble(x2, y2);
										m_pCompoundProbabilityGrid->Set_Value(x2,y2,
											m_pCompoundProbabilityGrid->asFloat(x2,y2) + 1);
									}//if
									m_pTimeGrid->Set_Value(x2, y2, dIgnTime);
									m_AdjPoints.Add(x2,y2);									
								}//if							
							}//if
						}//if					
					}//if
				}//for
			}//if
		}//for

		m_CentralPoints.Clear();
		for (int i=0; i<m_AdjPoints.Get_Count(); i++){
			x= m_AdjPoints.Get_X(i);
			y = m_AdjPoints.Get_Y(i);
			m_CentralPoints.Add(x, y);
		}//for
		m_AdjPoints.Clear();

	}//while

	return dBurntValue;

}//method

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩天堂在线观看| 2023国产精品视频| 国产成人免费在线观看不卡| 亚洲图片一区二区| 亚洲欧洲99久久| 国产色产综合色产在线视频| 精品国产1区二区| 久久久亚洲午夜电影| 久久久亚洲精品石原莉奈| 亚洲黄色录像片| 一区二区三区久久久| 午夜精品爽啪视频| 日本欧美一区二区三区乱码| 日韩av一区二| 在线观看成人小视频| 欧美日韩精品福利| 精品国内片67194| 日本午夜一区二区| 欧美探花视频资源| 精品国产亚洲一区二区三区在线观看| 一区二区三区欧美| 91视频观看视频| 欧美人与性动xxxx| 亚洲精品美腿丝袜| 色综合一个色综合亚洲| 欧美影院一区二区| 亚洲精品日日夜夜| 91国偷自产一区二区开放时间| 欧美日韩国产综合一区二区三区 | 亚洲一区二区三区激情| 亚洲成人精品一区| 国产精品香蕉一区二区三区| 91麻豆精品久久久久蜜臀| 日韩欧美一卡二卡| 中文字幕中文字幕在线一区| 天堂精品中文字幕在线| 东方aⅴ免费观看久久av| 在线免费视频一区二区| 亚洲你懂的在线视频| 免费观看91视频大全| 成人av网站在线观看免费| 欧美性感一区二区三区| 亚洲主播在线播放| 欧美日韩免费一区二区三区| 国产日韩欧美一区二区三区乱码 | 国产网红主播福利一区二区| 国产自产高清不卡| 欧美日韩视频在线第一区 | 艳妇臀荡乳欲伦亚洲一区| 91色porny蝌蚪| 亚洲综合久久av| 欧美美女黄视频| 欧美成人在线直播| 图片区小说区区亚洲影院| 日韩视频免费观看高清完整版 | 欧美成人一区二区三区片免费 | 亚洲免费大片在线观看| 色综合中文字幕国产| 亚洲自拍偷拍欧美| 欧美一级欧美三级在线观看| 日韩毛片视频在线看| 岛国一区二区在线观看| 精品91自产拍在线观看一区| 国产aⅴ精品一区二区三区色成熟| 国产精品网站在线播放| 国产精品一区免费在线观看| 中文字幕av一区二区三区高| 激情综合网av| 日韩一级在线观看| 成人激情开心网| 日韩经典一区二区| 国产日韩欧美a| 欧美中文字幕一二三区视频| 久久精品免费看| 精品国产污网站| 91免费视频网| 国产麻豆成人精品| 国产欧美视频在线观看| 欧美色网一区二区| 成人精品免费视频| 美女高潮久久久| 久久嫩草精品久久久精品| 色哟哟在线观看一区二区三区| 中文字幕日韩精品一区| 制服丝袜激情欧洲亚洲| 成人免费看视频| 久久精品国产免费| 亚洲中国最大av网站| 国产性色一区二区| 日韩无一区二区| 在线免费精品视频| 成人免费视频一区| 国产麻豆精品久久一二三| 天堂久久久久va久久久久| 亚洲日本乱码在线观看| 国产亚洲短视频| 亚洲精品一区二区三区香蕉 | 99久久免费精品| 亚洲自拍都市欧美小说| 亚洲欧洲99久久| 国产精品色一区二区三区| 欧美mv和日韩mv国产网站| 欧美日韩中文一区| 欧美唯美清纯偷拍| 在线免费观看视频一区| 色系网站成人免费| a亚洲天堂av| 奇米一区二区三区av| 亚洲午夜一区二区| 亚洲va欧美va天堂v国产综合| 久久99精品久久久久久动态图| 亚洲国产成人91porn| 一区二区三区精品视频在线| 国产精品福利影院| 中文字幕一区在线观看| 国产精品入口麻豆九色| 国产精品国产三级国产aⅴ原创 | 中文子幕无线码一区tr| 久久欧美中文字幕| 久久久精品国产免费观看同学| 日韩亚洲欧美成人一区| 日韩欧美高清一区| 欧美一三区三区四区免费在线看| 欧美男人的天堂一二区| 欧美一区二区美女| 日韩欧美一级在线播放| 精品美女在线播放| 国产亚洲综合av| 国产精品盗摄一区二区三区| 综合色中文字幕| 亚洲高清免费一级二级三级| 日韩制服丝袜先锋影音| 毛片一区二区三区| 国产成人精品一区二区三区四区 | 国产在线不卡视频| 国产精品1区2区3区在线观看| 国产成人精品亚洲日本在线桃色| 波多野结衣精品在线| 精品久久久久久久久久久院品网| 日韩一二三四区| 日本一区二区在线不卡| 一区二区三区高清在线| 日韩综合在线视频| 国产成人精品网址| 在线一区二区观看| 日韩午夜在线影院| 中文字幕一区二区三区不卡| 亚洲综合小说图片| 韩国中文字幕2020精品| 成人福利视频在线| 欧美乱妇23p| 国产性天天综合网| 亚洲sss视频在线视频| 国产一区二区日韩精品| 91福利视频网站| www亚洲一区| 亚洲一区二区在线播放相泽| 国产麻豆视频精品| 欧美日韩国产在线观看| 国产女主播一区| 午夜欧美在线一二页| 成人综合婷婷国产精品久久 | 亚洲国产色一区| 国产91在线观看| 欧美一区二区播放| 亚洲男人电影天堂| 国产精品自产自拍| 欧美日韩亚洲高清一区二区| 欧美韩日一区二区三区| 亚洲国产日韩一级| 成人午夜又粗又硬又大| 日韩三级在线观看| 亚洲国产精品自拍| aaa亚洲精品一二三区| 精品久久人人做人人爽| 亚洲一区二区三区视频在线 | 国产成人av电影免费在线观看| 欧美午夜一区二区三区免费大片| 久久久99精品免费观看| 日产国产高清一区二区三区| 色一情一伦一子一伦一区| 久久久不卡网国产精品一区| 蜜臀91精品一区二区三区| 欧美丝袜丝交足nylons图片| 亚洲视频电影在线| www.爱久久.com| 亚洲国产成人午夜在线一区| 蜜臀av性久久久久蜜臀aⅴ| 欧美日本在线看| 亚洲超碰97人人做人人爱| 色婷婷久久久亚洲一区二区三区 | 亚洲素人一区二区| 国产成人精品亚洲日本在线桃色| 精品处破学生在线二十三| 麻豆精品一区二区三区| 欧美一区二区久久| 美国十次综合导航| 精品99久久久久久| 国产乱人伦偷精品视频不卡 | 欧美变态tickling挠脚心|