最近在学OpenCasCade7.6 的Geometry部分,看完之后导师给了个题目让建立一个球体,并计算球体上两个点的最短距离以及显示,思考了一下将其整理如下:
DisplayType TheDisplayType = No2D3D;
PreProcess(aDoc, TheDisplayType);
Standard_Real radius = 5;
Handle(Geom_SphericalSurface) SP = new Geom_SphericalSurface(gp_Ax3(gp::XOY()), radius);
gp_Pnt P1 = SP->Value(2, 3);
gp_Pnt P2 = SP->Value(3, 5);
DisplayPoint(aDoc, P1, "P1", false, 0.5);
DisplayPoint(aDoc, P2, "P2", false, 0.5);
DisplaySurface(aDoc, SP);
gp_Vec v1(gp::Origin(), P1);
gp_Vec v2(gp::Origin(), P2);
gp_Vec V3 = v1.Crossed(v2);
gp_Ax2 ax(gp_Pnt(0,0,0),V3);
Handle(Geom_Circle) C = new Geom_Circle(ax,radius);
GeomAPI_ProjectPointOnCurve PPC1(P1, C);
GeomAPI_ProjectPointOnCurve PPC2(P2, C);
Standard_Real U, V;
if (PPC1.NbPoints() > 0)
{
U = PPC1.LowerDistanceParameter();
}
if (PPC2.NbPoints() > 0)
{
V = PPC2.LowerDistanceParameter();
}
Handle(Geom_TrimmedCurve)CT = new Geom_TrimmedCurve(C, U, V);
DisplayCurve(aDoc,CT, Quantity_NOC_RED, false);
GeomAdaptor_Curve GC(C);
Standard_Real Lower_dist = GCPnts_AbscissaPoint::Length(GC, CT->FirstParameter(), CT->LastParameter());
TCollection_AsciiString Message2(Lower_dist);
Message += Message2;
PostProcess(aDoc, ID_BUTTON_Test_10, TheDisplayType, Message);
其结果如下(欢迎讨论):