ODA面建模器是一种快速建模器,它使用边界表示法进行实体建模,也称为B-Rep技术。以下是ODA面建模器使用的主要数据结构:
- 顶点
- 边
- 边环
- 面
- 体
顶点
顶点是一个三维点。
边
边是一个对象,由指向起始顶点的指针以及指向环中前一个和后一个边的指针表示。基本上,边是由两个顶点界定的直线段:一个起始顶点和一个结束顶点(即下一个边的起始顶点)。
Vertex* startVertex = pEdge->vertex();
Vertex* endVertex = pEdge->endVertex();
边环
边环是位于三维平面上的一组不相交的闭合边列表(至少包含三条边)。
面
面是位于三维平面上的一组不相交的边环列表,用于界定一个区域。面通过边环拥有边。
第一个环称为外环。当从与平面法线相反的方向(右手定则)观察对象时,外环是逆时针定向的。所有其他环(如果有)应位于外环所界定的区域内。它们被称为内环。内环是顺时针定向的。
以下是面的一个示例:
以下是外环和内环的方向:
EdgeLoop* pOuterLoop = pFace->loop(0);
EdgeLoop* pInternalLoop = pFace->loop(1);
if (pInternalLoop)
{
// work with internal loop here
}
边知道它属于哪个循环和面。
Face* pLoop = pEdge->loop();
if (pLoop)
{
// work with loop here
}
Face* pFace = pEdge->face();
if (pFace)
{
// work with face here
}
相邻的面可以有一个共同的边。在拓扑学上,有两条边被称为对边。它们由相同的顶点形成,但顺序不同。
Edge* pPairEdge = pEdge->pair();
if (pPairEdge)
{
// work with pair edge here
}
实体
实体是连接面的列表。如果一个面的每条边都有一个来自相邻面的对边,则该实体是封闭的。否则,它被认为是开放的。
开放实体的示例如下所示(缺失的面在红色高亮框中):
调用 Body::isClosed() 方法检查实体是否封闭。
bool closed = body.isClosed();
如果实体满足以下条件,则称其为一致的:
- 每个面至少有一个外环。
- 每个面的外环都按逆时针方向定向。
- 每个面的内环都按顺时针方向定向。
- 对边对是原始边。
- 每条边都属于一个面(没有悬空边)。
- 一条边及其对边属于不同的面。
调用 Body::checkInternalConsistence() 方法检查实体是否一致。
OdString msgStr;
bool consistency = body.checkInternalConsistence(&msgStr);
要了解如何创建实体,请参阅 ODA 博客上的使用面建模器创建实体。