判断TopoDS_Edge或TopoDS_Wire是否为直线或圆

1.判断一个边或环是否是直线,一般是判断曲线的类型是否是GeomAbs_line就可以了。
代码如下:
BRepAdaptor_CompCurve C; C.Initialize(W, false); if (C.GetType() == GeomAbs_Line) { TopoDS_Vertex sv, ev; TopExp::Vertices(W, sv, ev); SP = BRep_Tool::Pnt(sv); EP = BRep_Tool::Pnt(ev); }
如果判断边或环在给定精度范围内是否为直线,可以使用GProp_PEquation类。
代码如下:
//先取曲线上的几个点
GCPnts_UniformAbscissa UA(C, 6); TColgp_Array1OfPnt anArrayofPnt(1, 6); for (int i = 1; i <= 6; i++) anArrayofPnt.SetValue(i, C.Value(UA.Parameter(i))); //判断采样点是否在一条直线上 GProp_PEquation PE(anArrayofPnt, tol); if (PE.IsLinear()) { TopoDS_Vertex sv, ev; TopExp::Vertices(W, sv, ev); SP = BRep_Tool::Pnt(sv); EP = BRep_Tool::Pnt(ev); }
2.同样的,判断边或环是否是圆,一般是判断曲线的类型是否是GeomAbs_Circle就可以了。
代码如下:
BRepAdaptor_CompCurve C; C.Initialize(W, false); if (C.GetType() == GeomAbs_Circle) { gp_Circ cir = C.Circle(); P = cir.Location(); R = cir.Radius(); XDir = cir.XAxis().Direction(); YDir = cir.YAxis().Direction(); }
如果判断边或环在给定精度范围内是否为圆,可以计算采样点是否在同一个圆上即可。
代码如下:
//先取曲线上的几个点
GCPnts_UniformAbscissa UA(C, 6); gp_Pnt p1 = C.Value(UA.Parameter(1)); gp_Pnt p2 = C.Value(UA.Parameter(2)); gp_Pnt p3 = C.Value(UA.Parameter(3)); gp_Pnt p4 = C.Value(UA.Parameter(4)); gp_Pnt p5 = C.Value(UA.Parameter(5)); gp_Pnt p6 = C.Value(UA.Parameter(6)); //判断构造的圆是否相同(中心位置相同,且半径相同) GC_MakeCircle mc1(p1, p3, p5); GC_MakeCircle mc2(p2, p4, p6); if (mc1.IsDone() && mc2.IsDone()) { gp_Circ cir = mc1.Value()->Circ(); P = cir.Location(); R = cir.Radius(); gp_Dir norDir = cir.Axis().Direction(); XDir = gp_Dir(gp_Vec(P, C.Value(C.FirstParameter()))); YDir = norDir.Crossed(XDir); gp_Circ cir2 = mc2.Value()->Circ(); gp_Pnt P2 = cir2.Location(); Standard_Real R2 = cir2.Radius(); if (P.IsEqual(P2, tol) && Abs(R - R2) <= tol) return true; }
更多精彩请关注公众号

浙公网安备 33010602011771号