Open CASCADE学习|Geom2d_Curve类
一、引言
Open CASCADE Technology(OCCT)是一个功能强大的开源CAD/CAM/CAE软件开发工具包。它提供了丰富的几何建模功能,广泛应用于工业设计、机械工程和计算机图形学等领域。Geom2d_Curve
类是OCCT中用于描述二维空间中曲线的抽象基类。它为各种具体曲线(如直线、圆、椭圆、贝塞尔曲线和B样条曲线等)提供了统一的接口和行为规范。
二、Geom2d_Curve
类概述
(一)类的定义
Geom2d_Curve
类定义了一个二维曲线的抽象接口。它封装了曲线的基本属性和操作,例如参数化、连续性、闭合性、周期性以及点和导数的计算。该类是许多具体曲线类(如Geom2d_Line
、Geom2d_Circle
、Geom2d_BezierCurve
等)的基类,这些派生类继承并实现了Geom2d_Curve
的接口。
(二)主要功能
Geom2d_Curve
类的主要功能包括:
- 参数化曲线:通过参数
U
计算曲线上的点以及各阶导数。 - 曲线属性查询:
- 检查曲线是否闭合(
IsClosed
)。 - 检查曲线是否具有周期性(
IsPeriodic
)。 - 获取曲线的连续性级别(
Continuity
)。 - 获取曲线的参数范围(
FirstParameter
和LastParameter
)。
- 检查曲线是否闭合(
- 几何变换:支持平移、旋转、缩放等几何变换。
- 曲线反转:改变曲线的参数化方向。
- 参数变换:计算变换后的参数值。
三、Geom2d_Curve
类的成员函数
(一)参数化相关函数
D0(U, P)
:计算参数U
处的点P
。D1(U, P, V1)
:计算参数U
处的点P
和一阶导数V1
。D2(U, P, V1, V2)
:计算参数U
处的点P
、一阶导数V1
和二阶导数V2
。D3(U, P, V1, V2, V3)
:计算参数U
处的点P
、一阶导数V1
、二阶导数V2
和三阶导数V3
。DN(U, N)
:计算参数U
处的N
阶导数。
(二)曲线属性查询
IsClosed()
:判断曲线是否闭合。IsPeriodic()
:判断曲线是否具有周期性。Period()
:如果曲线是周期性的,返回其周期。Continuity()
:返回曲线的连续性级别(如C0
、C1
、C2
等)。IsCN(N)
:判断曲线的连续性是否至少为N
阶。FirstParameter()
和LastParameter()
:返回曲线的参数范围。
(三)几何变换
Transform(T)
:对曲线应用几何变换T
。Translate(V)
:平移曲线。Rotate(P, Ang)
:绕点P
旋转曲线。Scale(P, S)
:以点P
为缩放中心缩放曲线。
(四)曲线反转
Reverse()
:反转曲线的参数化方向。ReversedParameter(U)
:计算反转后曲线的参数值。
四、代码示例
以下是一个完整的C++代码示例,用于测试Geom2d_Curve
类及其派生类(如Geom2d_Line
和Geom2d_Circle
)的功能。
(一)测试函数
#include <iostream>
#include <Geom2d_Line.hxx>
#include <Geom2d_Circle.hxx>
#include <gp_Pnt2d.hxx>
#include <gp_Vec2d.hxx>
#include <gp_Trsf2d.hxx>
#include <GeomAbs_Shape.hxx>
#include <Precision.hxx>
#include <gp_Ax2d.hxx>void TestCurve(const Handle(Geom2d_Curve)& curve) {// 测试 FirstParameter 和 LastParameterstd::cout << "FirstParameter: " << curve->FirstParameter() << std::endl;std::cout << "LastParameter: " << curve->LastParameter() << std::endl;// 测试 IsClosed 和 IsPeriodicstd::cout << "IsClosed: " << curve->IsClosed() << std::endl;std::cout << "IsPeriodic: " << curve->IsPeriodic() << std::endl;if (curve->IsPeriodic()) {std::cout << "Period: " << curve->Period() << std::endl;}// 测试 Continuitystd::cout << "Continuity: ";switch (curve->Continuity()) {case GeomAbs_C0: std::cout << "C0"; break;case GeomAbs_C1: std::cout << "C1"; break;case GeomAbs_C2: std::cout << "C2"; break;case GeomAbs_C3: std::cout << "C3"; break;case GeomAbs_G1: std::cout << "G1"; break;case GeomAbs_G2: std::cout << "G2"; break;case GeomAbs_CN: std::cout << "CN"; break;default: std::cout << "Unknown"; break;}std::cout << std::endl;// 测试 D0, D1, D2, D3 和 DNStandard_Real u = (curve->FirstParameter() + curve->LastParameter()) / 2;gp_Pnt2d p;gp_Vec2d v1, v2, v3;curve->D0(u, p);std::cout << "Point at parameter " << u << ": (" << p.X() << ", " << p.Y() << ")" << std::endl;if (curve->Continuity() >= GeomAbs_C1) {curve->D1(u, p, v1);std::cout << "First derivative at parameter " << u << ": (" << v1.X() << ", " << v1.Y() << ")" << std::endl;}if (curve->Continuity() >= GeomAbs_C2) {curve->D2(u, p, v1, v2);std::cout << "Second derivative at parameter " << u << ": (" << v2.X() << ", " << v2.Y() << ")" << std::endl;}if (curve->Continuity() >= GeomAbs_C3) {curve->D3(u, p, v1, v2, v3);std::cout << "Third derivative at parameter " << u << ": (" << v3.X() << ", " << v3.Y() << ")" << std::endl;}if (curve->Continuity() >= GeomAbs_CN) {gp_Vec2d vn = curve->DN(u, 4); // 第四阶导数std::cout << "Fourth derivative at parameter " << u << ": (" << vn.X() << ", " << vn.Y() << ")" << std::endl;}// 测试 Reverse 和 ReversedParameterHandle(Geom2d_Curve) reversedCurve = curve->Reversed();std::cout << "Reversed Curve FirstParameter: " << reversedCurve->FirstParameter() << std::endl;std::cout << "Reversed Curve LastParameter: " << reversedCurve->LastParameter() << std::endl;std::cout << "ReversedParameter(" << u << "): " << curve->ReversedParameter(u) << std::endl;// 测试 TransformedParameter 和 ParametricTransformationgp_Trsf2d trsf;trsf.SetTranslation(gp_Vec2d(1.0, 2.0));std::cout << "TransformedParameter(" << u << "): " << curve->TransformedParameter(u, trsf) << std::endl;std::cout << "ParametricTransformation: " << curve->ParametricTransformation(trsf) << std::endl;// 测试几何变换curve->Translate(gp_Vec2d(1.0, 1.0));std::cout << "Translated Curve Point at parameter " << u << ": ";curve->D0(u, p);std::cout << "(" << p.X() << ", " << p.Y() << ")" << std::endl;curve->Rotate(gp_Pnt2d(0.0, 0.0), M_PI / 2);std::cout << "Rotated Curve Point at parameter " << u << ": ";curve->D0(u, p);std::cout << "(" << p.X() << ", " << p.Y() << ")" << std::endl;curve->Scale(gp_Pnt2d(0.0, 0.0), 2.0);std::cout << "Scaled Curve Point at parameter " << u << ": ";curve->D0(u, p);std::cout << "(" << p.X() << ", " << p.Y() << ")" << std::endl;
}int main() {// 创建一个二维直线gp_Pnt2d p1(0.0, 0.0);gp_Pnt2d p2(10.0, 10.0);Handle(Geom2d_Line) line = new Geom2d_Line(p1, gp_Dir2d(p2.X() - p1.X(), p2.Y() - p1.Y()));std::cout << "Testing Geom2d_Line:" << std::endl;TestCurve(line);// 创建一个二维圆gp_Pnt2d center(0.0, 0.0);Standard_Real radius = 5.0;gp_Ax2d axis(center, gp_Dir2d(1.0, 0.0));Handle(Geom2d_Circle) circle = new Geom2d_Circle(axis, radius);std::cout << "\nTesting Geom2d_Circle:" << std::endl;TestCurve(circle);return 0;
}
(二)结果输出
Geom2d_Line
测试结果
**Testing Geom2d_Line:**
- FirstParameter: -2e+100
- LastParameter: 2e+100
- IsClosed: 0
- IsPeriodic: 0
- Continuity: CN
- Point at parameter 0: (0, 0)
- First derivative at parameter 0: (0.707107, 0.707107)
- Second derivative at parameter 0: (0, 0)
- Third derivative at parameter 0: (0, 0)
- Fourth derivative at parameter 0: (0, 0)
- Reversed Curve FirstParameter: -2e+100
- Reversed Curve LastParameter: 2e+100
- ReversedParameter(0): -0
- TransformedParameter(0): 0
- ParametricTransformation: 1
- Translated Curve Point at parameter 0: (1, 1)
- Rotated Curve Point at parameter 0: (-1, 1)
- Scaled Curve Point at parameter 0: (-2, 2)
Geom2d_Circle
测试结果
**Testing Geom2d_Circle:**
- FirstParameter: 0
- LastParameter: 6.28319
- IsClosed: 1
- IsPeriodic: 1
- Period: 6.28319
- Continuity: CN
- Point at parameter 3.14159: (-5, 6.12323e-16)
- First derivative at parameter 3.14159: (-6.12323e-16, -5)
- Second derivative at parameter 3.14159: (5, -6.12323e-16)
- Third derivative at parameter 3.14159: (6.12323e-16, 5)
- Fourth derivative at parameter 3.14159: (-5, 6.12323e-16)
- Reversed Curve FirstParameter: 0
- Reversed Curve LastParameter: 6.28319
- ReversedParameter(3.14159): 3.14159
- TransformedParameter(3.14159): 3.14159
- ParametricTransformation: 1
- Translated Curve Point at parameter 3.14159: (-4, 1)
- Rotated Curve Point at parameter 3.14159: (-1, -4)
- Scaled Curve Point at parameter 3.14159: (-2, -8)
(三)结果分析
以下是对输出结果的详细分析和解释:
Geom2d_Line
的测试结果**
参数范围
- FirstParameter:
-2e+100
- LastParameter:
2e+100
这是因为直线在数学上是无限延伸的,所以其参数范围被设置为从 -∞
到 +∞
,在 OCCT 中用 RealFirst
和 RealLast
表示。
闭合性和周期性
- IsClosed:
0
(表示直线不是闭合的) - IsPeriodic:
0
(表示直线不是周期性的)
直线在几何上是无限延伸的,没有起点和终点,因此既不是闭合的,也不是周期性的。
连续性
- Continuity:
CN
(表示连续性是无限的)
直线在整个参数范围内是无限可导的,因此其连续性是 CN
。
点和导数
- Point at parameter 0:
(0, 0)
(表示参数为 0 时的点是(0, 0)
) - First derivative at parameter 0:
(0.707107, 0.707107)
(表示参数为 0 时的一阶导数是(0.707107, 0.707107)
) - Second derivative at parameter 0:
(0, 0)
(表示参数为 0 时的二阶导数是(0, 0)
) - Third derivative at parameter 0:
(0, 0)
(表示参数为 0 时的三阶导数是(0, 0)
) - Fourth derivative at parameter 0:
(0, 0)
(表示参数为 0 时的四阶导数是(0, 0)
)
直线的高阶导数(二阶及以上)均为零,因为直线的斜率是常数。
反转和参数变换
- Reversed Curve FirstParameter:
-2e+100
- Reversed Curve LastParameter:
2e+100
- ReversedParameter(0):
-0
(表示反转后参数 0 对应的参数值仍然是 0) - TransformedParameter(0):
0
(表示变换后参数 0 保持不变) - ParametricTransformation:
1
(表示参数变换系数为 1)
直线的参数化是线性的,因此反转和变换后参数值不变,参数变换系数为 1。
几何变换
- Translated Curve Point at parameter 0:
(1, 1)
(表示平移后参数为 0 的点变为(1, 1)
) - Rotated Curve Point at parameter 0:
(-1, 1)
(表示旋转后参数为 0 的点变为(-1, 1)
) - Scaled Curve Point at parameter 0:
(-2, 2)
(表示缩放后参数为 0 的点变为(-2, 2)
)
这些结果符合几何变换的预期。
Geom2d_Circle
的测试结果**
参数范围
- FirstParameter:
0
- LastParameter:
6.28319
(即2π
)
圆的参数范围是从 0
到 2π
,表示一个完整的圆周。
闭合性和周期性
- IsClosed:
1
(表示圆是闭合的) - IsPeriodic:
1
(表示圆是周期性的) - Period:
6.28319
(即2π
)
圆是闭合的,并且具有周期性,周期为 2π
。
连续性
- Continuity:
CN
(表示连续性是无限的)
圆在整个参数范围内是无限可导的,因此其连续性是 CN
。
点和导数
- Point at parameter 3.14159:
(-5, 6.12323e-16)
(表示参数为π
时的点是(-5, 0)
,由于浮点误差,y
坐标接近于 0) - First derivative at parameter 3.14159:
(-6.12323e-16, -5)
(表示参数为π
时的一阶导数是(0, -5)
,由于浮点误差,x
坐标接近于 0) - Second derivative at parameter 3.14159:
(5, -6.12323e-16)
(表示参数为π
时的二阶导数是(5, 0)
,由于浮点误差,y
坐标接近于 0) - Third derivative at parameter 3.14159:
(6.12323e-16, 5)
(表示参数为π
时的三阶导数是(0, 5)
,由于浮点误差,x
坐标接近于 0) - Fourth derivative at parameter 3.14159:
(-5, 6.12323e-16)
(表示参数为π
时的四阶导数是(-5, 0)
,由于浮点误差,y
坐标接近于 0)
圆的导数结果符合其参数化方程的数学性质。
反转和参数变换
- Reversed Curve FirstParameter:
0
- Reversed Curve LastParameter:
6.28319
- ReversedParameter(3.14159):
3.14159
(表示反转后参数π
对应的参数值仍然是π
) - TransformedParameter(3.14159):
3.14159
(表示变换后参数π
保持不变) - ParametricTransformation:
1
(表示参数变换系数为 1)
圆的参数化是周期性的,因此反转和变换后参数值不变,参数变换系数为 1。
几何变换
- Translated Curve Point at parameter 3.14159:
(-4, 1)
(表示平移后参数为π
的点变为(-4, 1)
) - Rotated Curve Point at parameter 3.14159:
(-1, -4)
(表示旋转后参数为π
的点变为(-1, -4)
) - Scaled Curve Point at parameter 3.14159:
(-2, -8)
(表示缩放后参数为π
的点变为(-2, -8)
)