Пожалуйста, дайте мне несколько советов о том, как оценить максимальный регион, который охватывает все данные регионы? - PullRequest
0 голосов
/ 27 сентября 2011

Предположим, у меня есть десятки географических регионов, которые можно определить с помощью следующей структуры c / c ++:

typedef struct tagGEOGRAPHIC_REGION
{    
    float fNorthMost;
    float fSouthMost;
    float fWestMost;
    float fEastMost;
} GEOGRAPHIC_REGION, *PGEOGRAPHIC_REGION;

А теперь я хочу получить максимальный регион, который охватит все заданные регионы. Шаблон функции может выглядеть следующим образом:

const GEOGRAPHIC_REGION& GetMaxRegion(const std:vector<GEOGRAPHIC_REGION>& vRegions)
{  
    ......
}

Я могу поместить четыре компонента структуры GEOGRAPHIC_REGION в 4 различных вектора с плавающей запятой и затем оценить их соответствующие максимальные значения. Наконец, четыре максимальных значения могут быть объединены, чтобы сформировать максимальную область. Я думаю, что это должен быть простой способ сделать это. Не могли бы вы дать мне совет? Большое спасибо!

Ответы [ 2 ]

1 голос
/ 27 сентября 2011

Я предлагаю что-то вроде этого в качестве отправной точки:

  • посмотреть вживую: http://ideone.com/LQk8U
  • обратите внимание, что я могу угадать направление вашей осинеправильно (в этом случае вам может понадобиться поменять местами мин / макс) Редактировать исправлено в соответствии с комментарием «Север положительный, а Восток положительный»

  • для вектора, просто выполните std::acummulate(v.begin(), v.end(), v[0]....)

Если ваши сценарии усложняются, см. Библиотека ускоренной геометрии

.

#include <iostream>
#include <numeric>

struct GEOGRAPHIC_REGION
{    
    float fNorthMost;
    float fSouthMost;
    float fWestMost;
    float fEastMost;
};

GEOGRAPHIC_REGION combine(const GEOGRAPHIC_REGION& accum, const GEOGRAPHIC_REGION& tocombine)
{
    GEOGRAPHIC_REGION combined = { 
        std::max(accum.fNorthMost, tocombine.fNorthMost),
        std::min(accum.fSouthMost, tocombine.fSouthMost),
        std::min(accum.fWestMost,  tocombine.fWestMost),
        std::max(accum.fEastMost,  tocombine.fEastMost)
    };
    return combined;
}

int main()
{
    const GEOGRAPHIC_REGION regions[] = 
    {
        { 2,-1,-1,1 },
        { 1,-2,-1,1 },
        { 1,-1,-2,1 },
        { 1,-1,-1,2 },
    };

    GEOGRAPHIC_REGION super = std::accumulate(regions, regions+4, regions[0], combine);

    std::cout << "{ " << super.fNorthMost << ", " 
                      << super.fSouthMost << ", "
                      << super.fWestMost << ", "
                      << super.fEastMost << " }" << std::endl;
}
1 голос
/ 27 сентября 2011

Разве вы не можете просто перебрать вектор и получить максимальный север, минимальный юг и т. Д. Всего одним циклом?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...