如下案例进行了 2d平面点,线,圆,线段,圆弧的创建,及曲线求交点,曲线偏置操作,以及将2d平面曲线转3d平面进行显示。
void ViewWindow::OnGen2dCurve()
{
_ctrlUi->listView->Clear();
try
{
//构造2d线段
gp_Pnt2d point11(10.328, 5.492);
gp_Pnt2d point12(30, 35);
gp_Vec2d vector1(point11, point12);
Handle(Geom2d_Line) line1=new Geom2d_Line(point11, vector1);
Handle(Geom2d_TrimmedCurve) Curve1=new Geom2d_TrimmedCurve(line1,0, vector1.Magnitude() );
// 获取线段的起点和终点
gp_Pnt2d trimmedStartPoint = Curve1->Value(0.0);
gp_Pnt2d trimmedEndPoint = Curve1->Value(vector1.Magnitude());
qDebug()<< "Trimmed curve start point: (" << trimmedStartPoint.X() << ", " << trimmedStartPoint.Y() << ")";
qDebug() << "Trimmed curve end point: (" << trimmedEndPoint.X() << ", " << trimmedEndPoint.Y() << ")";
gp_Pnt2d point21(21.372, 37.633);
gp_Pnt2d point22(42.715, 22.798);
gp_Vec2d vector2(point21, point22);
Handle(Geom2d_Line) line2=new Geom2d_Line(point21, vector2);
Handle(Geom2d_TrimmedCurve) Curve2= new Geom2d_TrimmedCurve(line2, 0, vector2.Magnitude());
gp_Pnt2d point31(27.593, 23.851);
gp_Pnt2d point32(35.728, 10.643);
gp_Vec2d vector3(point31, point32);
Handle(Geom2d_Line) line3 = new Geom2d_Line(point31, vector3);
Handle(Geom2d_TrimmedCurve) Curve3 = new Geom2d_TrimmedCurve(line3, 0, vector3.Magnitude());
//求两个线段的交点
Geom2dAPI_InterCurveCurve Inter12(Curve1, Curve2);
if ( Inter12.NbPoints() > 0)
{
const gp_Pnt2d intersectionPoint12 = Inter12.Point(1);
const Standard_Real x12 = intersectionPoint12.X();
const Standard_Real y12 = intersectionPoint12.Y();
qDebug() << "Intersection Point12: (" << x12 << ", " << y12 << ")";
}
Geom2dAPI_InterCurveCurve Inter13(Curve1, Curve3);
IntAna2d_AnaIntersection InterLine13(line1->Lin2d(), line3->Lin2d());
if (Inter13.NbPoints() > 0)
{
const gp_Pnt2d intersectionPoint13 = Inter13.Point(1);
const Standard_Real x13 = intersectionPoint13.X();
const Standard_Real y13 = intersectionPoint13.Y();
qDebug() << "Intersection Point13: (" << x13 << ", " << y13 << ")";
}
if (InterLine13.IsDone()&&InterLine13.NbPoints() > 0 )
{
const IntAna2d_IntPoint& intersectionPoint13 = InterLine13.Point(1);
const Standard_Real x13 = intersectionPoint13.Value().X();
const Standard_Real y13 = intersectionPoint13.Value().Y();
qDebug() << "Intersection PointLine13: (" << x13 << ", " << y13 << ")";
}
//求直线与圆弧的交点
Handle(Geom2d_Circle) Circle1 = new Geom2d_Circle(gp_Ax2d(gp_Pnt2d(15.202, 13.905), gp_Dir2d(1, 0)), 9.722);
Handle(Geom2d_TrimmedCurve) CurveCircle1 = new Geom2d_TrimmedCurve(Circle1, M_PI, 2*M_PI);
Geom2dAPI_InterCurveCurve InterLine1Circle1(Curve1, Circle1, Precision::Confusion());
for (int i = 1; i <= InterLine1Circle1.NbPoints(); i++) {
gp_Pnt2d interPoint = InterLine1Circle1.Point(i);
qDebug() << "InterLine1Circle1" << i << "(" << interPoint.X() << "," << interPoint.Y() << ")";
}
Geom2dAPI_InterCurveCurve InterLine1CurveCircle1(Curve1, CurveCircle1, Precision::Confusion());
for (int i = 1; i <= InterLine1CurveCircle1.NbPoints(); i++) {
gp_Pnt2d interPoint = InterLine1CurveCircle1.Point(i);
qDebug() << "InterLine1CurveCircle1" << i << "(" << interPoint.X() << "," << interPoint.Y() << ")";
}
//求圆弧与圆弧的交点
Handle(Geom2d_Circle) Circle2 = new Geom2d_Circle(gp_Ax2d(gp_Pnt2d(21.996, 5.928), gp_Dir2d(1, 0)), 5.622);
Handle(Geom2d_TrimmedCurve) CurveCircle2 = new Geom2d_TrimmedCurve(Circle2, 0, M_PI);
Geom2dAPI_InterCurveCurve InterCircle1Circle2(Circle1, Circle2, Precision::Confusion());
for (int i = 1; i <= InterCircle1Circle2.NbPoints(); i++) {
gp_Pnt2d interPoint = InterCircle1Circle2.Point(i);
qDebug() << "InterCircle1Circle2" << i << "(" << interPoint.X() << "," << interPoint.Y() << ")";
}
Geom2dAPI_InterCurveCurve InteCurveCircle1CurveCircle2(CurveCircle1, CurveCircle2, Precision::Confusion());
for (int i = 1; i <= InteCurveCircle1CurveCircle2.NbPoints(); i++) {
gp_Pnt2d interPoint = InteCurveCircle1CurveCircle2.Point(i);
qDebug() << "InteCurveCircle1CurveCircle2" << i << "(" << interPoint.X() << "," << interPoint.Y() << ")";
}
//偏移直线
gp_Pnt2d point51(0,0);
gp_Pnt2d point52(0, 10);
gp_Vec2d vector5(point51, point52);
Handle(Geom2d_Line) line5 = new Geom2d_Line(point51, vector5);
Handle(Geom2d_TrimmedCurve) Curve5 = new Geom2d_TrimmedCurve(line5, 0, vector5.Magnitude());
Handle(Geom2d_OffsetCurve) OffsetLineCurve5 = new Geom2d_OffsetCurve(Curve5, 0.2);
double firstParOffsetLineCurve5 = OffsetLineCurve5->FirstParameter();
double lastParOffsetLineCurve5 = OffsetLineCurve5->LastParameter();
gp_Pnt2d OffsetLineCurve1Point51= OffsetLineCurve5->Value(firstParOffsetLineCurve5);
gp_Pnt2d OffsetLineCurve1Point52 = OffsetLineCurve5->Value(lastParOffsetLineCurve5);
qDebug() << "OffsetLineCurve5 Point1: (" << OffsetLineCurve1Point51.X() << ", " << OffsetLineCurve1Point51.Y() << ")";
qDebug() << "OffsetLineCurve5 Point2: (" << OffsetLineCurve1Point52.X() << ", " << OffsetLineCurve1Point52.Y() << ")";
//偏移曲线
Handle(Geom2d_OffsetCurve) OffsetCircleCurve1=new Geom2d_OffsetCurve(CurveCircle1,0.2);
double firstParOffsetCircleCurve1 = CurveCircle1->FirstParameter();
double lastParOffsetCircleCurve1 = CurveCircle1->LastParameter();
//
Handle(Geom2d_OffsetCurve) OffsetCircleCurve2 = new Geom2d_OffsetCurve(CurveCircle2, 0.2);
double firstParOffsetCircleCurve2 = CurveCircle2->FirstParameter();
double lastParOffsetCircleCurve2 = CurveCircle2->LastParameter();
Geom2dAPI_InterCurveCurve InteOffsetCircleCurve1OffsetCircleCurve2(OffsetCircleCurve1, OffsetCircleCurve2, Precision::Confusion());
for (int i = 1; i <= InteOffsetCircleCurve1OffsetCircleCurve2.NbPoints(); i++) {
gp_Pnt2d interPoint = InteOffsetCircleCurve1OffsetCircleCurve2.Point(i);
qDebug() << "InteOffsetCircleCurve1OffsetCircleCurve2" << i << "(" << interPoint.X() << "," << interPoint.Y() << ")";
}
//定义圆弧6与圆弧7,直线8
Handle(Geom2d_Circle) Circle6 = new Geom2d_Circle(gp_Ax2d(gp_Pnt2d(41.277, -12.47), gp_Dir2d(1, 0)), 49.418);
Handle(Geom2d_TrimmedCurve) CurveCircle6 = new Geom2d_TrimmedCurve(Circle6, 94.481 * M_PI/180, 98.82 * M_PI / 180, Standard_True);
CurveCircle6->Reverse();
gp_Pnt2d CurveCircle6Point1 = CurveCircle6->Value(CurveCircle6->FirstParameter());
gp_Pnt2d CurveCircle6Point2 = CurveCircle6->Value(CurveCircle6->LastParameter());
qDebug() << "CurveCircle6Point1: (" << CurveCircle6Point1.X() << ", " << CurveCircle6Point1.Y() << ")";
qDebug() << "CurveCircle6Point2: (" << CurveCircle6Point2.X() << ", " << CurveCircle6Point2.Y() << ")";
gp_Pln plane(gp::XOY()); // 创建一个平行于 XY 平面的平面
Handle(Geom_Plane) surface = new Geom_Plane(plane);
BRepBuilderAPI_MakeEdge edgeCurveCircle1_shape(CurveCircle6, surface);
Handle(AIS_Shape) CurveCircle1_shape = new AIS_Shape(edgeCurveCircle1_shape.Shape());
_ctrlUi->listView->RecordModel(CurveCircle1_shape, QString("CurveCircle1_shape"));
CurveCircle1_shape->SetColor(Quantity_NOC_YELLOW);
//偏移曲线
Handle(Geom2d_OffsetCurve) OffsetCurveCircle6 = new Geom2d_OffsetCurve(CurveCircle6, 0.2);
double firstParOffsetCurveCircle6 = OffsetCurveCircle6->FirstParameter();
double lastParOffsetCurveCircle6 = OffsetCurveCircle6->LastParameter();
gp_Pnt2d OffsetCurveCircle6Point1 = OffsetCurveCircle6->Value(firstParOffsetCurveCircle6);
gp_Pnt2d OffsetCurveCircle6Point2 = OffsetCurveCircle6->Value(lastParOffsetCurveCircle6);
qDebug() << "OffsetCurveCircle6Point1: (" << OffsetCurveCircle6Point1.X() << ", " << OffsetCurveCircle6Point1.Y() << ")";
qDebug() << "OffsetCurveCircle6Point2: (" << OffsetCurveCircle6Point2.X() << ", " << OffsetCurveCircle6Point2.Y() << ")";
BRepBuilderAPI_MakeEdge edgeOffsetCurveCircle6_shape(OffsetCurveCircle6, surface);
Handle(AIS_Shape) OffsetCurveCircle6_shape = new AIS_Shape(edgeOffsetCurveCircle6_shape.Shape());
_ctrlUi->listView->RecordModel(OffsetCurveCircle6_shape, QString("OffsetCurveCircle6_shape"));
OffsetCurveCircle6_shape->SetColor(Quantity_NOC_RED);
_view->fitAll();
}
catch (Standard_Failure const& theFailure)
{
qDebug() << "info: " << theFailure.GetMessageString();
}
}