OCCT 中 BRepBuilderAPI_MakePolygon与BRepBuilderAPI_MakeWire
BRepBuilderAPI_MakePolygon
是 OCCT 中专门用于从点或边构建多边形 Wire(TopoDS_Wire
)的简洁工具类,适用于构建连续折线(polyline)。类似BRepBuilderAPI_MakeWire都继承自BRepBuilderAPI_MakeShape
✅ 主要用途
-
快速构建 折线状 Wire
-
点可以是 2D 或 3D(
gp_Pnt
) -
可以指定是否闭合(最后自动连回首点)
-
自动检查拓扑合法性
🧱 示例:使用 BRepBuilderAPI_MakePolygon
构建闭合 Wire
#include <BRepBuilderAPI_MakePolygon.hxx>
#include <gp_Pnt.hxx>
#include <TopoDS_Wire.hxx>TopoDS_Wire MakeClosedPolygonWire(const std::vector<gp_Pnt>& points)
{if (points.size() < 3) {throw std::runtime_error("构建闭合多边形至少需要 3 个点");}BRepBuilderAPI_MakePolygon polygonBuilder;for (const auto& pt : points) {polygonBuilder.Add(pt);}polygonBuilder.Close(); // 自动连接最后一个点到第一个点if (!polygonBuilder.IsDone()) {throw std::runtime_error("Polygon 构建失败");}return polygonBuilder.Wire();
}
🔧 可选特性
✅ 添加点 + 自动闭合
BRepBuilderAPI_MakePolygon polygon;
polygon.Add(gp_Pnt(0, 0, 0));
polygon.Add(gp_Pnt(10, 0, 5));
polygon.Add(gp_Pnt(10, 10, 0));
polygon.Close(); // 添加闭合段
TopoDS_Wire wire = polygon.Wire();
✅ 构建开放路径(不闭合)
只需省略 .Close()
,它就只会构建一条开放的折线 wire。
📌 注意事项
-
点必须按顺序排列。
-
不支持自动排序或处理无序点集(你仍需要先排序点)。
-
与
BRepBuilderAPI_MakeWire
不同,它更严格要求线段连续(端点重合)。 -
点之间不能距离过小或完全重合,否则构建会失败。
🆚 和 BRepBuilderAPI_MakeWire
的区别
特性 | MakePolygon | MakeWire |
---|---|---|
用于构建折线 | ✅ 快速 | ❌ 需先构建 Edge |
支持直接加点 | ✅ | ❌(必须用 Edge) |
支持闭合自动处理 | ✅ | ❌(需手动加闭合边) |
宽容度(例如边不连续) | ❌ 严格 | ✅ 更宽容 |
支持样条等复杂边 | ❌ 不支持 | ✅ 支持任意 Edge |
本文参考自:chatgpt