构建三角剖分的代码:
CvSubdiv2D *subdiv;
CvMemStorage *storage = cvCreateMemStorage(0);
CvRect rectangle = cvRect(0, 0, 100, 100);
subdiv = cvCreateSubdivDelaunay2D(rectangle, storage);
CvPoint2D32f p1 = cvPoint2D32f(10, 10);
CvPoint2D32f p2 = cvPoint2D32f(50, 10);
CvPoint2D32f p3 = cvPoint2D32f(10, 50);
cvSubdivDelaunay2DInsert(subdiv, p1);
cvSubdivDelaunay2DInsert(subdiv, p2);
cvSubdivDelaunay2DInsert(subdiv, p3);
之后,使用以下点之一进行查询:
CvSubdiv2DEdge edge;
CvSubdiv2DPoint *pp;
CvSubdiv2DPointLocation loc = cvSubdiv2DLocate(subdiv, p1, &edge, &pp);
获得结果后,您必须检查该点是否落在:
- 刻面
- 边缘
- 顶点
- 在定义的三角剖分/矩形之外
在这种情况下,它是一个顶点:
if(loc == CV_PTLOC_VERTEX) {
// CvSubdiv2DPoint *tp = cvSubdiv2DEdgeOrg(edge);
// CvPoint2D32f point = tp->pt;
// std::cout << point.x << ", " << point.y << std::endl;
// CvSubdiv2DPoint *tp = cvSubdiv2DEdgeOrg(pp->first);
// CvPoint2D32f point = tp->pt;
// std::cout << point.x << ", " << point.y << std::endl;
}
但是,我的两种方法都失败了。在前 3 行中,我尝试查看是否locate
在参数上放置了正确的边缘。它没有,我遇到了分段错误。在第二个块上,我尝试访问结构first
中的元素,CvSubdiv2DPoint
但它也不起作用——分段错误。我找不到点,first
也不能使用它迭代其他边缘。
原因CvSubdiv2DPoint
是无用的,因为为了遍历结构并实际找到三角形,我需要 a CvSubdiv2DEdge
,但由于我无法从点转换为边,因此函数的结果是无用的。
我可能忽略了一些东西,但对我来说它似乎被打破了。这是文档。有什么想法吗?