库/数据结构用于存储带孔的凸多边形

时间:2009-12-02 08:48:51

标签: c algorithm geometry

我需要创建一个建筑物的地图。 该区域是凸多边形,具有多个不重叠的多边形 凸孔。 作为简化,该区域也可以表示为矩形。 这些孔也可以建模为矩形。

我首先尝试使用GEOS来处理它,这是一个C ++库 使用低级C API。但似乎GEOS无法做到 处理请求数量。

处理地图的最佳数据结构是什么? 也许是四叉树?有没有现成的库 (超出学术概念验证状态)? 该库应该只是C(不是C ++)。

2 个答案:

答案 0 :(得分:2)

将地图存储为有向线段的列表(以便我们可以确定我们是否在段的前面或后面):

struct Segment {
    Pos2 p0;
    Pos2 p1;
    int holeIndex; //Which hole this segment delimits
};

然后将细分分为BSP-tree

struct BSPNode {
    Segment partition;
    BSPNode* infront;
    BSPNode* behind;
};

然后你可以用这段代码找到洞:

int
findHole(BSPNode* node, Pos2 pos) {
    if (!node->behind) { // This node is a leaf
        if (isBehind(pos2, node->partition)) {
            return node->partition->holeIndex;
        } else {
            return -1; //Point is not in a hole
        }
    }
    if (isBehind(pos2, node->partition)) {
        return findHole(node->behind, pos);
    } else {
        return findHole(node->infron, pos);
    }
}

int hole = findHole(root, somePos);

如果 的情况是每个洞都是一个矩形,你可以BSP一组矩形孔,直到每个分区都有一个矩形。

struct BSPNode {
    union {
        Rectangle rectangle; //leaf node
        DirectedLine splitter; //branch node
    };
    BSPNode* infront; // If null indicates this is a leaf node
    BSPNode* behind;
};

int
findHole(BSPNode* node, Pos2 pos) {
    if (!node->behind) { // This node is a leaf
        if (isInside(pos2, node->rectangle)) {
            return node->rectangle->holeIndex;
        } else {
            return -1; //Point is not in a hole
        }
    }
    if (isBehind(pos2, node->splitter)) {
        return findHole(node->behind, pos);
    } else {
        return findHole(node->infron, pos);
    }
}

答案 1 :(得分:1)

由于孔的数量非常小(小于30), 我使用了一个数组并对这个数组进行了线性搜索。 我低估了C的速度,这种方法“足够快”。