[Experimental] Tesselate all continents with inner lakes. Use triangles to generate coast features.

This commit is contained in:
vng 2011-10-03 19:01:37 +03:00 committed by Alex Zolotarev
parent a94369c4e2
commit bf52883265
2 changed files with 39 additions and 39 deletions

View file

@ -1,6 +1,6 @@
#include "coastlines_generator.hpp"
#include "feature_builder.hpp"
//#include "tesselator.hpp"
#include "tesselator.hpp"
#include "../indexer/point_to_int64.hpp"
@ -36,6 +36,7 @@ namespace
return PointT(static_cast<int32_t>(pu.x), static_cast<int32_t>(pu.y));
}
/*
class DoCreateRegion
{
RegionT m_rgn;
@ -67,58 +68,29 @@ namespace
tree.Add(m_rgn, GetLimitRect(m_rgn));
}
};
*/
/*
class DoTesselateRegion
template <class ContainerT> class DoAccumulate
{
typedef vector<m2::PointD> PointsT;
PointsT m_vec;
ContainerT & m_list;
public:
DoAccumulate(ContainerT & lst) : m_list(lst) {}
bool operator() (m2::PointD const & p)
{
m_vec.push_back(p);
m_list.back().push_back(p);
return true;
}
template <class TreeT> class DoAddRegion
{
TreeT & m_tree;
public:
DoAddRegion(TreeT & tree) : m_tree(tree) {}
void operator() (m2::PointD const & p1, m2::PointD const & p2, m2::PointD const & p3)
{
RegionT rgn;
rgn.AddPoint(D2I(p1));
rgn.AddPoint(D2I(p2));
rgn.AddPoint(D2I(p3));
m_tree.Add(rgn, GetLimitRect(rgn));
}
};
template <class TreeT> void Add(TreeT & tree)
{
list<PointsT> lst;
lst.push_back(PointsT());
lst.back().swap(m_vec);
tesselator::TrianglesInfo info;
tesselator::TesselateInterior(lst, info);
info.ForEachTriangle(DoAddRegion<TreeT>(tree));
}
};
*/
}
void CoastlineFeaturesGenerator::AddRegionToTree(FeatureBuilder1 const & fb)
{
ASSERT ( fb.IsGeometryClosed(), () );
DoCreateRegion createRgn;
//DoTesselateRegion createRgn;
//DoCreateRegion createRgn;
DoAccumulate<RegionsT> createRgn(m_regions);
fb.ForEachGeometryPoint(createRgn);
createRgn.Add(m_tree);
//createRgn.Add(m_tree);
}
void CoastlineFeaturesGenerator::operator()(FeatureBuilder1 const & fb)
@ -145,12 +117,36 @@ namespace
LOG(LINFO, ("Not merged coastline", fb));
}
};
template <class TreeT> class DoMakeRegions
{
TreeT & m_tree;
public:
DoMakeRegions(TreeT & tree) : m_tree(tree) {}
void operator() (m2::PointD const & p1, m2::PointD const & p2, m2::PointD const & p3)
{
RegionT rgn;
rgn.AddPoint(D2I(p1));
rgn.AddPoint(D2I(p2));
rgn.AddPoint(D2I(p3));
m_tree.Add(rgn, GetLimitRect(rgn));
}
};
}
void CoastlineFeaturesGenerator::Finish()
{
DoAddToTree doAdd(*this);
m_merger.DoMerge(doAdd);
LOG(LINFO, ("Start continents tesselation"));
tesselator::TrianglesInfo info;
tesselator::TesselateInterior(m_regions, info);
info.ForEachTriangle(DoMakeRegions<TreeT>(m_tree));
LOG(LINFO, ("End continents tesselation"));
}
namespace

View file

@ -16,7 +16,11 @@ class CoastlineFeaturesGenerator
FeatureMergeProcessor m_merger;
m4::Tree<m2::RegionI> m_tree;
typedef list<vector<m2::PointD> > RegionsT;
RegionsT m_regions;
typedef m4::Tree<m2::RegionI> TreeT;
TreeT m_tree;
uint32_t m_coastType;
int m_Level;