有没有一种简单的方法可以确定点是否在voronoi细胞内?
例如,以下代码生成类似于下图的内容:
using namespace boost::polygon;
point_data<int> p1(0, 0);
point_data<int> p2(-10, 10);
point_data<int> p3(-10, -10);
point_data<int> p4(10, -10);
point_data<int> p5(10, 10);
std::vector<point_data<int>> pts = { p1, p2, p3, p4, p5 };
construct_voronoi(pts.begin(), pts.end(), vd);
在这种情况下,如何确定点(5,5)是否在中央单元格内?
我可以从每个单元格中创建一个多边形,并使用point in polygon algorithm进行查找,但是我很想知道该库提供了“免费”的东西。
最佳答案
就像@Magnus Hoff所评论的那样,由离查询点最近的中心定义的单元格必须包含该单元格(不限距离)。实际上,这来自Voronoii单元的定义,即,其成员比任何其他中心都更靠近单元中心的点集。
因此,此查询实际上不需要boost::polygon
或半行算法:
//using namespace boost::polygon;
using namespace std;
#include <iostream>
#include <vector>
#include <limits>
template <typename T>
using point_data = std::pair<T,T>;
point_data<int> p1(0, 0);
point_data<int> p2(-10, 10);
point_data<int> p3(-10, -10);
point_data<int> p4(10, -10);
point_data<int> p5(10, 10);
std::vector<point_data<int>> pts = { p1, p2, p3, p4, p5 };
//construct_voronoi(pts.begin(), pts.end(), vd);
double dist2(point_data<int> pt1,point_data<int> pt2) {
return (pt1.first-pt2.first)*(pt1.first-pt2.first) + (pt1.first-pt2.second)* (pt1.first-pt2.second);
}
bool isInCell(point_data<int> point) {
double d = numeric_limits<double>::max();
point_data<int> ptClose;
for (auto& pt:pts) {
if (dist2(pt,point) < d)
ptClose = pt;
}
return ptClose == point;
}
int main() {
cout << isInCell(make_pair(5,5)) << endl;
}