Выдалась возможность, может сможете и мне упростить функцию?
/// Класс экранных траекторий
class ScrTrack: public TImageClass
{
private:
std::string ini_file_name; ///< имя ини-файла
int readed_time; ///< время для разрыва траектории, прочтенное из файла
int readed_dist; ///< расстояние для разрыва траектории, прочтенное из файла
bool event_picture; ///< флажок, предупреждающий, нажата ли кнопка отображения событий
bool event_name_press; ///< флажок, предупреждающий, нажата ли кнопка отображения названий событий
protected:
std::vector<GEOPOINT>* geo; ///< указатель на вектор с географическими координатами
public:
enum GAPTYPE { GT_NONE = 0, GT_TIMEGAP, GT_DISTGAP, GT_TMDSTGAP };
SubSahara* pSahara; ///< указатель на Сахару
bool init_gaps; ///< флажок, указывающий когда следует пересчитывать данные для графиков
public:
ScrTrack(SubSahara* pSah): readed_time(0), readed_dist(0), geo(NULL), pSahara(pSah), init_gaps(false),
bmpSymbol(NULL), event_name_press(false), event_picture(false) {}
virtual ~ScrTrack() {}
virtual void DrawClass(GRAPHIC_DEVICE& device, const CHART_SCOPE& scope, const DRAW_MODE& mode);
virtual void LoadSymbols();
virtual void UnloadSymbols();
bool enumPossible(std::vector<GEOPOINT>::iterator cur, std::vector<GEOPOINT>::iterator next);
};
/// Перебор возможных вариантов разрывов и их обработка
bool ScrTrack::enumPossible(vector<GEOPOINT>::iterator cur, vector<GEOPOINT>::iterator next)
{
ScrTrack::GAPTYPE gapType = checkGaps();
time_t time_diff; double pos_diff;
bool isContinue = true;
switch(gapType)
{
case ScrTrack::GT_NONE:
readed_time = 10;
break;
case ScrTrack::GT_TIMEGAP:
if(next -> status_lat == PS_NONE || next -> status_lon == PS_NONE || cur -> status_lat == PS_NONE
|| cur -> status_lon == PS_NONE)
break;
time_diff = (time_t)fabs(double(next -> time_marker - cur -> time_marker));
if(time_diff > readed_time) isContinue = false;
if(isContinue && init_gaps)
{
if(next -> status_lat != PS_FAIL && next -> status_lon != PS_FAIL && cur -> status_lat != PS_FAIL
&& cur -> status_lon != PS_FAIL && next -> status_lat != PS_NODATA && next -> status_lon != PS_NODATA
&& cur -> status_lat != PS_NODATA && cur -> status_lon != PS_NODATA)
q_calc.maxTime += time_diff;
PARAMVALUE val;
val.value = (double)time_diff; val.status = next -> status_lat;
x_data.time_x.push_back(val);
}
break;
case ScrTrack::GT_DISTGAP:
if(next -> status_lat == PS_NONE || next -> status_lon == PS_NONE || cur -> status_lat == PS_NONE
|| cur -> status_lon == PS_NONE)
break;
pos_diff = diffDist(cur, next);
if(pos_diff > readed_dist) isContinue = false;
if(isContinue && init_gaps)
{
if(next -> status_lat != PS_FAIL && next -> status_lon != PS_FAIL && cur -> status_lat != PS_FAIL
&& cur -> status_lon != PS_FAIL && next -> status_lat != PS_NODATA && next -> status_lon != PS_NODATA
&& cur -> status_lat != PS_NODATA && cur -> status_lon != PS_NODATA)
q_calc.maxDist += pos_diff;
PARAMVALUE val;
val.value = pos_diff; val.status = next -> status_lat;
x_data.dist_x.push_back(val);
}
break;
case ScrTrack::GT_TMDSTGAP:
if(next -> status_lat == PS_NONE || next -> status_lon == PS_NONE || cur -> status_lat == PS_NONE
|| cur -> status_lon == PS_NONE)
break;
time_diff = (time_t)fabs(double(next -> time_marker - cur -> time_marker));
pos_diff = diffDist(cur, next);
if(time_diff > readed_time || pos_diff > readed_dist) isContinue = false;
if(isContinue && init_gaps)
{
if(next -> status_lat != PS_FAIL && next -> status_lon != PS_FAIL && cur -> status_lat != PS_FAIL
&& cur -> status_lon != PS_FAIL && next -> status_lat != PS_NODATA && next -> status_lon != PS_NODATA
&& cur -> status_lat != PS_NODATA && cur -> status_lon != PS_NODATA)
{
q_calc.maxDist += pos_diff;
q_calc.maxTime += time_diff;
}
PARAMVALUE val;
val.value = pos_diff; val.status = next -> status_lat;
x_data.dist_x.push_back(val);
val.value = (double)time_diff;
x_data.time_x.push_back(val);
}
break;
}
return isContinue;
}
Для того, чтобы было чуть понятнее привел кусочек класса, где определена эта функция.
Ну что можно сказать: функция выполняет расчет и добавление в вектор значений в зависимости от значения GAPTYPE! Я подумывал о том, чтобы вынести расчет для каждого
case в отдельную функцию, но посчитал количество параметров этой функции и стало грустно! Может сможете улучшить данный код? Просьба приводить пример улучшения кода. Заранее спасибо!