|
Boost : |
Subject: Re: [boost] [Review Request] Inclusion of the Boost.Polygon Voronoi Library
From: Phil Endecott (spam_from_boost_dev_at_[hidden])
Date: 2012-04-13 14:51:56
Hi Andrii,
I've just tried this:
class delaunay_triangulation {
public:
class Builder {
delaunay_triangulation& dt;
public:
Builder(delaunay_triangulation& dt_): dt(dt_) {}
void reserve(size_t num_sites) { dt.reserve(num_sites); }
template <typename SEvent>
void process_single_site(const SEvent& site) { dt.process_single_site(site); }
template <typename SEvent>
std::pair<void*,void*> insert_new_edge(const SEvent& site1, const SEvent& site2) { return dt.insert_new_edge(site1,site2); }
template <typename SEvent, typename CEvent>
std::pair<void*, void*> insert_new_edge(const SEvent& site1, const SEvent& site3, const CEvent& circle, void* data12, void* da$
return dt.insert_new_edge(site1, site3, circle, data12, data23);
}
void build() { dt.build(); }
};
delaunay_triangulation():
builder_(*this)
{}
typedef std::pair<int,int> point_t;
typedef std::pair<point_t,point_t> edge_t;
typedef std::vector<edge_t> edges_t;
edges_t edges;
Builder* builder() { return &builder_; } // Why not a reference?
void reserve(size_t /*num_sites*/) {}
template <typename SEvent>
void process_single_site(const SEvent& /*site*/) {}
template <typename SEvent>
std::pair<void*, void*> insert_new_edge(const SEvent& site1, const SEvent& site2)
{
edge_t e(point_t(site1.x0(),site1.y0()),
point_t(site2.x0(),site2.y0()));
edges.push_back(e);
return std::pair<void*,void*>(NULL,NULL);
}
template <typename SEvent, typename CEvent>
std::pair<void*, void*> insert_new_edge(const SEvent& site1, const SEvent& site3,
const CEvent& /*circle*/, void* /*data12*/, void* /*data23*/) {
return insert_new_edge(site1,site3);
}
void build() {}
private:
Builder builder_;
};
It does seem to create a triangulation as you can see here:
http://chezphil.org/tmp/delaunay.png
A couple of observations:
- Again you're using void* in here, which doesn't look great. Is this just
to break circular references, or something? Why can't you use the actual
types?
- Your "builder" class, which just forwards to the other class, doesn't
seem very useful to me. I can see the idea - you're breaking the
"lifecycle" of the object into a "build" phase and then a "use" phase -
but I think there are probably better ways to do it if it's worth doing
at all.
Anyway, I think you potentially have something very useful here. Thanks!
Regards, Phil.
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk