定义
参数曲线
参数曲线是通过一个参数 t 来描述的曲线,通常表示为:C(t) = (x(t),y(t),z(t))。其中:t 是参数,通常定义在某个区间 [a,b] 上。x(t)、y(t)、z(t) 是关于参数 t 的函数,分别表示曲线在三维空间中的坐标。参数曲线通过参数 t 的变化来描述曲线的形状。因为参数化方式不唯一,所以同一个曲线可以用不同的参数方程表示。
接下来我们将举一些例子。
- 直线: C(t) = P0 + t⋅(P1−P0) , t∈[0,1],其中 P0 和 P1 是直线的起点和终点。
- 圆弧: C(t) = (rcos(t),rsin(t)) , t∈[0,2π],其中 r 是半径。
- 贝塞尔曲线:
参数曲面
参数曲面是通过两个参数 u 和 v 来描述的曲面,通常表示为:S(u,v) = (x(u,v),y(u,v),z(u,v)),其中 u 和 v 是参数,通常定义在某个区域 [a,b]×[c,d] 上,x(u,v)、y(u,v)、z(u,v) 是关于参数 u 和 v 的函数,分别表示曲面在三维空间中的坐标。参数曲面通过参数 u 和 v 的变化来描述曲面的形状。因为参数化方式不唯一,所以同一个曲面可以用不同的参数方程表示。
接下来我们将举一些例子。
- 平面: S(u,v) = P0 + u⋅A + v⋅B, u, v∈R。其中 P0是平面上的一个点,A 和 B 是平面的两个方向向量。
- 球面: S(u,v) = (rsin(u)cos(v),rsin(u)sin(v),rcos(u)) ,u∈[0,π],v∈[0,2π]。其中 r 是半径。
- 贝塞尔曲面:
连续性
参数连续
曲线
参数连续是指曲线在连接处的参数导数连续。对于曲线来说,参数连续性涉及一阶导数、二阶导数等高阶导数。在 CAD 和几何建模中,参数连续用于确保曲线拼接的光滑性。高阶参数连续(如 C²)常用于汽车、航空航天等领域,要求曲线的曲率连续。
定义
- C⁰ 连续:曲线在连接点处位置连续,但切线方向可能不连续。
- C¹ 连续:曲线在连接点处位置和一阶导数(切线方向)连续。
- C² 连续:曲线在连接点处位置、一阶导数和二阶导数(曲率)连续。
条件
对于两条曲线 r1(t) 和 r2(t),在连接处 t=t0 需要满足:
- C⁰ 连续:r1(t0) = r2(t0)
- C¹ 连续:
- C² 连续:
曲面
参数连续是指曲面在连接处的参数导数连续。对于曲面来说,参数连续性不仅涉及 u 和 v 方向的一阶导数,还涉及高阶导数。在 CAD 和几何建模中,参数连续用于确保曲面拼接的光滑性。高阶参数连续(如 C²)常用于汽车、航空航天等领域,要求曲面的曲率连续。
定义
- C⁰ 连续:曲面在连接处位置连续,但法向量可能不连续。
- C¹ 连续:曲面在连接处位置和一阶偏导数(切平面)连续。
- C² 连续:曲面在连接处位置、一阶偏导数和二阶偏导数(曲率)连续。
条件
对于两个曲面 S1(u,v) 和 S2(u,v),在连接处需要满足:
几何连续
曲线
几何连续是指曲线在连接处的几何性质(如切线方向、曲率)连续,而不一定要求参数导数连续。几何连续更注重曲线的视觉效果。几何连续的条件比参数连续宽松,因此在某些情况下更容易实现。
定义
- G⁰ 连续:曲线在连接点处位置连续,但切线方向可能不连续。
- G¹ 连续:曲线在连接点处位置连续,且切线方向连续(切线方向相同,但大小可能不同)。
- G² 连续:曲线在连接点处位置和切线方向连续,且曲率连续(曲率相同,但曲率变化率可能不同)。
条件
对于两条曲线 r1(t) 和 r2(t),在连接处 t=t0 需要满足:
- G⁰ 连续:r1(t0) = r2(t0)
- G¹ 连续:T1(t0) || T2(t0),其中 T1 和 T2 是曲线的单位切向量
- G² 连续:κ1(t0) = κ2(t0),其中 κ1 和 κ2 是曲线的曲率
在上面我们提到了曲率,参数曲线的曲率的计算公式为:
在商用软件中可以查看曲线的曲率梳,曲率连续即为 G2:
曲面
几何连续是指曲面在连接处的几何性质(如切平面、曲率)连续,而不一定要求参数导数连续。几何连续更注重曲面的视觉效果。几何连续的条件比参数连续宽松,因此在某些情况下更容易实现。
定义
- G⁰ 连续:曲面在连接处位置连续,但法向量可能不连续。
- G¹ 连续:曲面在连接处位置连续,且法向量连续(切平面相同,但切向量的长度可能不同)。
- G² 连续:曲面在连接处位置和法向量连续,且曲率连续(所有法曲率相同,但曲率变化率可能不同)。
条件
对于两个曲面 S1(u,v) 和 S2(u,v),在连接处需要满足:
- G⁰ 连续:
- G¹ 连续:
其中 n1 和 n2 是曲面的法向量。
- G² 连续:
其中 κ1 和 κ2 是曲面的曲率。
在这里补充一些内容:
1.法曲率定义
法曲率定义为曲面和某一法平面(过法向的平面)交线的曲率,如下图所示。图中曲线 γ 在 p0 点处的曲率即曲面 S 在 p0 处 t 方向的法曲率。
法曲率的定义并不易于计算。计算法曲率的简便方法为:计算方向 t 在切平面上的坐标,记为 (α,β),即 t=αDu + βDv,则法曲率为:
其中,EFG 与曲面第一基本型中的符号含义相同;LMN 与曲面第二基本型中的符号含义相同,即:
2.G2 连续即在连接曲线上任一点的所有方向法曲率都相同
但是所有方向法曲率都相同是非常强的条件,Link Curvage Theorem 证明了,只需在 1 个与 t 不共线的方向上法曲率相等,那么所有方向上的法曲率都相等。所以只考虑 t 的法向 b,只要 b 方向的法曲率是相同的,那么就 G2 连续。
3.曲面 G2 连续的表现
曲面是否 G2 连续可以通过光学效果进行近似分析。G0 的斑马线是断开的,G1 的斑马线相连但不光滑,G2 的斑马线相连且光滑。
更为实用的几何连续性表达
从上述几何连续性的定义可以推导出一些更具实用价值的结论:
- 1. 曲线 a 在和曲线 b 的连接点处一阶导为 d1,二阶导为 d2,若曲线 b 在连接点处一阶导为 a*d1,则 G1 连续;若曲线 b 一阶导为 a*d1 并且二阶导为 a*a*d2+b*d1,则 G2 连续,其中 a 为非负实数,b 为实数。该结论使得曲线 G2 连续可以用两个参数进行控制,并且实现方式为 C2。
- 2. 曲面 a 和曲面 b 在 u 边界相连且 G1 连续,曲面 a 在和曲面 b 的某一连接点处的 u 方向 1 阶导为 du,二阶导为 duu,若曲面 b 在连接点处的 u 方向一阶导为 a*du 并且二阶导为 a*a*duu + b*du,则 G2 连续,其中 a 为非负实数,b 为实数。该结论使得曲面在边界处的G2连续可以用两个参数进行控制,并且实现方式为 C2。
二维参数曲线
常见功能
获得参数范围
FirstParameter 用于获得曲线的起始参数,LastParameter 用于获得曲线的终止参数。
std::vector<AMCAX::Point2> pts = {
};
std::vector<double> knots = { 0.0, 0.25, 0.5,0.75,1.0 };
std::vector<int> multiplicities = { 4, 1, 1,1,4 };
int degree = 3;
std::shared_ptr< AMCAX::Geom2BSplineCurve> bspline = std::make_shared< AMCAX::Geom2BSplineCurve>(pts, knots, multiplicities, degree);
double fp1 = bspline->FirstParameter();
double lp1 = bspline->LastParameter();
double focal = 2.0;
std::shared_ptr< AMCAX::Geom2Parabola >parabola = std::make_shared< AMCAX::Geom2Parabola>(frame, focal);
double uf = -2.0;
double ul = 2.0;
double fp2 = trimcurve.FirstParameter();
double lp2 = trimcurve.LastParameter();
二维修剪曲线的类
定义 Geom2TrimmedCurve.hpp:12
FrameT< double, 2 > Frame2
二维标架
定义 FrameT.hpp:884
PointT< double, 2 > Point2
二维点
定义 PointT.hpp:456
求值和求导
Value 或 D0 用于求值,而 D1 ,D2 ,D3 ,DN 用于求导。
double u1 = 0.4 * (fp1 + lp1);
bspline->D0(u1, p2);
bspline->D1(u1, p2, vec1);
bspline->D2(u1, p2, vec1, vec2);
bspline->D3(u1, p2, vec1, vec2, vec3);
int n1 = 4;
double u2 = 1.5;
trimcurve.D0(u2, p4);
trimcurve.D1(u2, p4, vec11);
trimcurve.D2(u2, p4, vec11, vec22);
trimcurve.D3(u2, p4, vec11, vec22, vec33);
int n2 = 4;
VectorT< double, 2 > Vector2
二维向量
定义 VectorT.hpp:704
获得类型
Type 用于获得曲线类型,如直线、圆、椭圆、抛物线等。曲线类型可参考枚举类 CurveType 。
std::cout << int(bspline->Type()) << std::endl;
std::cout << int(trimcurve.Type()) << std::endl;
封闭性、周期性
IsClosed 用于获得曲线的封闭性(起始点与终止点是同一个点),IsPeriodic 用于获得曲线的周期性。
std::cout << bspline->IsClosed() << std::endl;
std::cout << bspline->IsPeriodic()<< std::endl;
std::cout << trimcurve.IsClosed() << std::endl;
std::cout << trimcurve.IsPeriodic()<< std::endl;
反向
Reverse 用于将 Geom2Curve 反向,改变自身,而 Reversed 用于获取反向的 Geom2Curve,不改变自身。反转后,曲线的起点和终点将会发生对换。对于一般曲线,反转后,曲线参数范围不变,而对于裁剪曲线,可能会改变曲线的参数范围。如以下例子 2,一条裁剪直线原来的参数范围为 -1 到 3,反转后变为 -3 到 1。
std::vector<AMCAX::Point2> pts = {
};
auto bezier = std::make_shared<AMCAX::Geom2BezierCurve>(pts);
std::cout << bezier->FirstParameter() << std::endl;
std::cout << bezier->LastParameter() << std::endl;
auto reversebezier = bezier->Reversed();
std::cout << reversebezier->FirstParameter() << std::endl;
std::cout << reversebezier->LastParameter() << std::endl;
std::cout << reversebezier->Value(reversebezier->FirstParameter()) << std::endl;
std::cout << reversebezier->Value(reversebezier->LastParameter()) << std::endl;
bezier->Reverse();
std::cout << bezier->FirstParameter() << std::endl;
std::cout << bezier->LastParameter() << std::endl;
std::cout << bezier->StartPoint() << std::endl;
std::cout << bezier->EndPoint() << std::endl;
auto line2 = std::make_shared<AMCAX::Geom2Line>(p, dir);
double u1 = -1.;
double u2 = 3.;
auto trimline2 = std::make_shared<AMCAX::Geom2TrimmedCurve>(line2, u1, u2);
std::cout << trimline2->StartPoint() << std::endl;
std::cout << trimline2->EndPoint() << std::endl;
auto reverseline = trimline2->Reversed();
std::cout << reverseline->FirstParameter() << std::endl;
std::cout << reverseline->LastParameter() << std::endl;
std::cout << reverseline->Value(reverseline->FirstParameter()) << std::endl;
std::cout << reverseline->Value(reverseline->LastParameter()) << std::endl;
trimline2->Reverse();
std::cout << trimline2->FirstParameter() << std::endl;
std::cout << trimline2->LastParameter() << std::endl;
std::cout << trimline2->StartPoint() << std::endl;
std::cout << trimline2->EndPoint() << std::endl;
DirectionT< double, 2 > Direction2
二维方向
定义 DirectionT.hpp:563
在这里我们解释一下反转后,裁剪直线的参数范围变为 -3 到 1 的原因,这是因为裁剪曲线在反转的时候是先对其 basiscurve (无穷长的直线)做反转,然后再根据裁剪起始点和终止点的参数确定反转后的参数。
另外如果想计算某一参数的对称参数可通过 ReversedParameter 来实现。
std::cout<<trimline2->ReversedParameter(0.5)<<std::endl;
子类
Geom2Line
Geom2Line 是二维空间中的无限长直线,由点 Point2 与方向向量 Direction2 定义。点 Point2 对应的参数值为 0.0,沿 Direction2 方向,参数值为正,且参数变化量与直线上的长度变化量成正比。直线的参数域为无穷大。
auto line = std::make_shared<AMCAX::Geom2Line>(point, dir);
double u1 = 0.0;
double u2 = 1.0;
auto trimline = std::make_shared<AMCAX::Geom2TrimmedCurve>(line, u1, u2);
创建二维边的类
定义 MakeEdge2d.hpp:24
形状的基类,包含具有位置和方向信息的基础形状
定义 TopoShape.hpp:15
Geom2Circle
Geom2Circle 是二维空间中的圆,由标架与半径定义。当参数值为 0 时,对应圆上标架横轴正方向上的点,随着参数值增大,点沿圆逆时针移动。圆的参数域为 [0, 2π),即其参数坐标的取值范围。
double r = 1.0;
auto circle = std::make_shared<AMCAX::Geom2Circle>(frame, r);
Geom2Ellipse
Geom2Ellipse 是二维空间中的椭圆,由标架、长半径及短半径定义。当参数值为 0 时,对应椭圆上长轴正方向上的顶点,随着参数值增大,点沿椭圆逆时针移动。椭圆的参数域为 [0, 2π),即其参数坐标的取值范围。
double major = 2.0;
double minor = 1.0;
auto ellipse = std::make_shared<AMCAX::Geom2Ellipse>(frame, major, minor);
Geom2Hyperbola
Geom2Hyperbola 是二维空间中双曲线的右半支,由标架、实轴半径及虚轴半径定义。当参数值为 0 时,对应双曲线上实轴正方向上的顶点,参数值的绝对值越大,双曲线上对应点的 y 坐标绝对值也越大。若需获取双曲线的左半支,可通过 OtherBranch 实现。双曲线的参数域为 [-∞, +∞],即其参数坐标的取值范围。
double major = 2.0;
double minor = 1.0;
auto hyperbola = std::make_shared<AMCAX::Geom2Hyperbola>(frame, major, minor);
double u1 = 0.0;
double u2 = 2.0;
auto trimhyperbola = std::make_shared<AMCAX::Geom2TrimmedCurve>(hyperbola, u1, u2);
HyperbolaS< 2 > Hyperbola2
二维双曲线
定义 HyperbolaT.hpp:327
Geom2Parabola
Geom2Parabola 是二维空间中的抛物线,由标架和焦距定义。当参数值为 0 时,对应抛物线的原点,参数值的绝对值越大,抛物线上对应点的 y 坐标绝对值也越大。抛物线的参数域为 [-∞, +∞],即其参数坐标的取值范围。
double focal = 1.0;
auto parabola = std::make_shared<AMCAX::Geom2Parabola>(frame, focal);
double u1 = -2.0;
double u2 = 2.0;
auto trimparabola = std::make_shared<AMCAX::Geom2TrimmedCurve>(parabola, u1, u2);
Geom2BezierCurve
Geom2BezierCurve 是二维空间中的贝塞尔曲线,由控制点、权重(可选)定义。曲线的次数为控制点数量减一,例如,如果有 4 个控制点,则曲线是 3 次贝塞尔曲线。贝塞尔曲线的参数域为 [0,1],当参数 t=0 时,对应曲线起点(第一个控制点),当参数 t=1 时,对应曲线终点(最后一个控制点)。对于标准贝塞尔曲线,其节点向量为 {0, 1},且每个节点的重数都是曲线次数 + 1。
std::vector<AMCAX::Point2> pts = {
};
auto bezier = std::make_shared<AMCAX::Geom2BezierCurve>(pts);
Geom2BSplineCurve
Geom2BSplineCurve 是二维空间中的 B 样条曲线,由控制点、节点、节点重数、曲线次数及权重(可选)定义。
std::vector<AMCAX::Point2> pts = {
};
std::vector<double> knots = { 0.0, 0.25, 0.5,0.75,1.0 };
std::vector<int> multiplicities = { 4, 1, 1,1,4 };
int degree = 3;
auto bspline = std::make_shared< AMCAX::Geom2BSplineCurve>(pts, knots, multiplicities, degree);
Geom2TrimmedCurve
Geom2TrimmedCurve 是二维空间中的裁剪曲线,由原曲线与两个裁剪参数定义,经过裁剪后得到的曲线必然是非周期的。对于周期曲线,裁剪操作可超出其原始定义域进行,例如对圆的裁剪:
double r = 1.0;
auto circle = std::make_shared<AMCAX::Geom2Circle>(frame, r);
auto trimcircle = std::make_shared<AMCAX::Geom2TrimmedCurve>(circle, u1, u2);
constexpr double pi
数学常数 Pi,圆的周长与直径之比
定义 Constants.hpp:42
Geom2OffsetCurve
Geom2OffsetCurve 是二维空间中的偏移曲线,由原曲线与偏移距离定义,其偏移方向为沿原曲线的切向顺时针旋转 90° 后的方向。若需获取偏移曲线对应的原曲线,可通过 AMCAX::Geom2OffsetCurve::BasisCurve 实现。
double r = 2.0;
auto circle = std::make_shared<AMCAX::Geom2Circle>(frame, r);
double offset = 1.5;
auto circleoffset = std::make_shared<AMCAX::Geom2OffsetCurve>(circle, offset);
auto basiscircle = circleoffset->BasisCurve();
三维参数曲线
常见功能
获得参数范围
FirstParameter 用于获得曲线的起始参数,LastParameter 用于获得曲线的终止参数。
std::vector<AMCAX::Point3> pts = {
};
std::vector<double> weights = { 1.0, 2.0, 3.0, 4.0, 3.0, 2.0, 1.0 };
std::vector<double> knots = { 0.0, 0.25, 0.5, 1.0 };
std::vector<int> multiplicities = { 4, 1, 2, 4 };
int degree = 3;
std::shared_ptr< AMCAX::Geom3BSplineCurve> bspline = std::make_shared< AMCAX::Geom3BSplineCurve>(pts, weights, knots, multiplicities, degree);
double fp1 = bspline->FirstParameter();
double lp1 = bspline->LastParameter();
double focal = 2.0;
std::shared_ptr< AMCAX::Geom3Parabola >parabola = std::make_shared< AMCAX::Geom3Parabola>(frame, focal);
double uf = -2.0;
double ul = 2.0;
double fp2 = trimcurve.FirstParameter();
double lp2 = trimcurve.LastParameter();
三维修剪曲线的类
定义 Geom3TrimmedCurve.hpp:12
PointT< double, 3 > Point3
三维点
定义 PointT.hpp:459
FrameT< double, 3 > Frame3
三维标架
定义 FrameT.hpp:887
求值和求导
Value 或 D0 用于求值,而 D1 ,D2 ,D3 ,DN 用于求导。
double u1 = 0.4 * (fp1 + lp1);
bspline->D0(u1, p2);
bspline->D1(u1, p2, vec1);
bspline->D2(u1, p2, vec1, vec2);
bspline->D3(u1, p2, vec1, vec2, vec3);
int n1 = 4;
double u2 = 1.5;
trimcurve.D0(u2, p4);
trimcurve.D1(u2, p4, vec11);
trimcurve.D2(u2, p4, vec11, vec22);
trimcurve.D3(u2, p4, vec11, vec22, vec33);
int n2 = 4;
VectorT< double, 3 > Vector3
三维向量
定义 VectorT.hpp:707
获得类型
Type 用于获得曲线类型,如直线、圆、椭圆、抛物线等。曲线类型可参考枚举类 CurveType 。
std::cout << int(bspline->Type()) << std::endl;
std::cout << int(trimcurve.Type()) << std::endl;
封闭性、周期性
IsClosed 用于获得曲线的封闭性(起始点与终止点是同一个点),IsPeriodic 用于获得曲线的周期性。
std::cout << bspline->IsClosed() << std::endl;
std::cout << bspline->IsPeriodic() << std::endl;
std::cout << trimcurve.IsClosed() << std::endl;
std::cout << trimcurve.IsPeriodic() << std::endl;
反向
Reverse 用于将 Geom3Curve 反向,改变自身,而 Reversed 用于获取反向的 Geom3Curve,不改变自身。反转后,曲线的起点和终点将会发生对换。对于一般曲线,曲线参数范围不变,而对于裁剪曲线,可能会改变曲线的参数范围。如以下例子 2,一条裁剪直线原来的参数范围为 -1 到 3,反转后变为 -3 到 1。
std::vector<AMCAX::Point3> pts = {
};
std::vector<double> weights = { 1.0, 2.0, 3.0, 4.0, 3.0, 2.0, 1.0 };
std::vector<double> knots = { 0.0, 0.25, 0.5, 1.0 };
std::vector<int> multiplicities = { 4, 1, 2, 4 };
int degree = 3;
std::shared_ptr< AMCAX::Geom3BSplineCurve> bspline = std::make_shared< AMCAX::Geom3BSplineCurve>(pts, weights, knots, multiplicities, degree);
std::cout << bspline->FirstParameter() << std::endl;
std::cout << bspline->LastParameter() << std::endl;
auto reversebspline = bspline->Reversed();
std::cout << reversebspline->FirstParameter() << std::endl;
std::cout << reversebspline->LastParameter() << std::endl;
std::cout << reversebspline->Value(reversebspline->FirstParameter()) << std::endl;
std::cout << reversebspline->Value(reversebspline->LastParameter()) << std::endl;
bspline->Reverse();
std::cout << bspline->FirstParameter() << std::endl;
std::cout << bspline->LastParameter() << std::endl;
std::cout << bspline->Value(bspline->FirstParameter()) << std::endl;
std::cout << bspline->Value(bspline->FirstParameter()) << std::endl;
auto line = std::make_shared<AMCAX::Geom3Line>(p, dir);
double u1 = -1.;
double u2 = 3.;
auto trimline = std::make_shared<AMCAX::Geom3TrimmedCurve>(line, u1, u2);
std::cout << trimline->Value(u1) << std::endl;
std::cout << trimline->Value(u2) << std::endl;
auto reverseline = trimline->Reversed();
std::cout << reverseline->FirstParameter() << std::endl;
std::cout << reverseline->LastParameter() << std::endl;
std::cout << reverseline->Value(reverseline->FirstParameter()) << std::endl;
std::cout << reverseline->Value(reverseline->LastParameter()) << std::endl;
trimline->Reverse();
std::cout << trimline->FirstParameter() << std::endl;
std::cout << trimline->LastParameter() << std::endl;
std::cout << trimline->Value(trimline->FirstParameter()) << std::endl;
std::cout << trimline->Value(trimline->LastParameter()) << std::endl;
DirectionT< double, 3 > Direction3
三维方向
定义 DirectionT.hpp:566
在这里我们解释一下反转后,裁剪直线的参数范围变为 -3 到 1 的原因,这是因为裁剪曲线在反转的时候是先对其 basiscurve (无穷长的直线)做反转,然后再根据裁剪起始点和终止点的参数确定反转后的参数。
另外如果想计算某一参数的对称参数可通过 ReversedParameter 来实现。
std::cout << trimline->ReversedParameter(0.5) << std::endl;
子类
Geom3Line
Geom3Line 是三维空间中的无限长直线,由 Point3 和 Direction3 定义。点 Point3 对应的参数值为 0.0,沿 Direction3 方向,参数值为正,且参数变化量与直线上的长度变化量成正比。直线的参数域为无穷大。
auto line = std::make_shared<AMCAX::Geom3Line>(p, dir);
double u1 = 0.0;
double u2 = 1.0;
auto trimline = std::make_shared<AMCAX::Geom3TrimmedCurve>(line, u1, u2);
Geom3Circle
Geom3Circle 是三维空间中的圆,由标架和半径定义。当参数值为 0 时,对应圆上标架横轴正方向上的点,随着参数值增大,点沿圆逆时针移动。圆的参数域为 [0, 2π),即其参数坐标的取值范围。
double r = 1.0;
auto circle = std::make_shared<AMCAX::Geom3Circle>(frame, r);
Geom3Ellipse
Geom3Ellipse 是三维空间中的椭圆,由标架、长半径及短半径定义。当参数值为 0 时,对应椭圆上长轴正方向上的顶点,随着参数值增大,点沿椭圆逆时针移动。椭圆的参数域为 [0, 2π),即其参数坐标的取值范围。
double major = 2.0;
double minor = 1.0;
auto ellipse = std::make_shared<AMCAX::Geom3Ellipse>(frame, major, minor);
Geom3Hyperbola
Geom3Hyperbola 是三维空间中双曲线的右半支,由标架、实轴半径及虚轴半径定义。当参数值为 0 时,对应双曲线上实轴正方向上的顶点,参数值的绝对值越大,双曲线上对应点的 y 坐标绝对值也越大。若需获取双曲线的左半支,可通过 OtherBranch 实现。双曲线的参数域为 [-∞, +∞],即其参数坐标的取值范围。
double major = 2.0;
double minor = 1.0;
auto hyperbola = std::make_shared<AMCAX::Geom3Hyperbola>(frame, major, minor);
double u1 = 0.0;
double u2 = 2.0;
auto trimhyperbola = std::make_shared<AMCAX::Geom3TrimmedCurve>(hyperbola, u1, u2);
HyperbolaS OtherBranch() const noexcept
获取双曲线的另一个分支
定义 HyperbolaT.hpp:212
HyperbolaS< 3 > Hyperbola3
三维双曲线
定义 HyperbolaT.hpp:330
Geom3Parabola
Geom3Parabola 是三维空间中的抛物线,由标架和焦距定义。当参数值为 0 时,对应抛物线的原点,参数值的绝对值越大,抛物线上对应点的 y 坐标绝对值也越大。抛物线的参数域为 [-∞, +∞],即其参数坐标的取值范围。
double focal = 1.0;
auto parabola = std::make_shared<AMCAX::Geom3Parabola>(frame, focal);
double u1 = -2.0;
double u2 = 2.0;
auto trimparabola = std::make_shared<AMCAX::Geom3TrimmedCurve>(parabola, u1, u2);
Geom3BezierCurve
Geom3BezierCurve 是三维空间中的贝塞尔曲线,由控制点、权重(可选)定义。曲线的次数为控制点数量减一,例如,如果有 4 个控制点,则曲线是 3 次贝塞尔曲线。贝塞尔曲线的参数域为 [0,1],当参数 t=0 时,对应曲线位于起点(第一个控制点),当参数 t=0 时,对应曲线起点(第一个控制点),当参数 t=1 时,对应曲线终点(最后一个控制点)。对于标准贝塞尔曲线,其节点向量为 {0, 1},且每个节点的重数都是曲线次数 + 1。
std::vector<AMCAX::Point3> pts = {
};
auto bezier = std::make_shared<AMCAX::Geom3BezierCurve>(pts);
Geom3BSplineCurve
Geom3BSplineCurve 是三维空间中的 B 样条曲线,由控制点、节点向量、节点重数、权重(可选)定义。
std::vector<AMCAX::Point3> pts = {
};
std::vector<double> weights = { 1.0, 2.0, 3.0, 4.0, 3.0, 2.0, 1.0 };
std::vector<double> knots = { 0.0, 0.25, 0.5, 1.0 };
std::vector<int> multiplicities = { 4, 1, 2, 4 };
int degree = 3;
auto bspline = std::make_shared< AMCAX::Geom3BSplineCurve>(pts, weights, knots, multiplicities, degree);
Geom3TrimmedCurve
Geom3TrimmedCurve 是三维空间中的裁剪曲线,由原曲线和两个裁剪参数定义。由原曲线与两个裁剪参数定义,经过裁剪后得到的曲线必然是非周期的。对于周期曲线,裁剪操作可超出其原始定义域进行,例如对圆的裁剪:
double r = 1.0;
auto circle = std::make_shared<AMCAX::Geom3Circle>(frame, r);
auto trimcircle = std::make_shared<AMCAX::Geom3TrimmedCurve>(circle, u1, u2);
Geom3OffsetCurve
Geom3OffsetCurve 是三维空间中的偏移曲线,由原曲线、偏移距离及参考方向共同定义。其功能是:将原曲线沿垂直于自身切向的方向偏移指定距离,偏移方向为切向与参考方向的外积方向(如下图所示)。图中蓝色箭头代表切向,绿色箭头代表参考方向,红色箭头代表外积方向(即偏移方向)。
以 xOy 平面内的标准圆为例,当参考方向为 Oz 轴方向时,偏移方向为向外。以下为偏移后的结果:
如需获取偏移曲线的原曲线,可通过 BasisCurve 来获得。
double r = 2.0;
auto circle = std::make_shared<AMCAX::Geom3Circle>(frame, r);
double offset = 1.5;
auto circleoffset = std::make_shared<AMCAX::Geom3OffsetCurve>(circle, offset, direction);
auto basiscircle = circleoffset->BasisCurve();
三维参数曲面
常见功能
获得参数范围
Bounds() 用于获得全部参数,FirstUParameter() 用于获得起始 u 参数 ,LastUParameter() 用于获得结束 u 参数 ,FirstVParameter() 用于获得起始 v 参数 ,LastVParameter() 用于获得结束 v 参数。
double radius = 2.0;
double u1 = 0., u2 = 0., v1 = 0., v2 = 0.;
CylindricalSurface.Bounds(u1, u2, v1, v2);
std::cout << u1 << "-" << u2 << std::endl;
std::cout << v1 << "-" << v2 << std::endl;
std::cout << CylindricalSurface.FirstUParameter() << std::endl;
std::cout << CylindricalSurface.LastUParameter() << std::endl;
std::cout << CylindricalSurface.FirstVParameter() << std::endl;
std::cout << CylindricalSurface.LastVParameter() << std::endl;
三维圆柱面的类
定义 Geom3CylindricalSurface.hpp:14
求值、求导
Value 或 D0 用于求值,D1,D2,D3,DN 用于求导。
double u = 1.;
double v = 2.;
std::cout << CylindricalSurface.Value(u,v) << std::endl;
CylindricalSurface.D0(u, v, p1);
CylindricalSurface.D1(u, v, p2, du1, dv1);
CylindricalSurface.D2(u, v, p3, du2, dv2, duu1, duv1, dvv1);
CylindricalSurface.D3(u, v, p4, du3, dv3, duu2, duv2, dvv2, duuu, duuv, duvv, dvvv);
int nu = 4, nv = 4;
获得类型
Type() 用于获得曲面类型,如平面、球等。
std::cout << int(CylindricalSurface.Type()) << std::endl;
封闭性、周期性
IsUClosed() 用于获得 u 方向的封闭性 ,IsUPeriodic() 用于获得 u 方向的周期性 ,IsVClosed() 用于获得 v 方向的封闭性 ,IsVPeriodic() 用于获得 v 方向的周期性。
std::cout << CylindricalSurface.IsUClosed() << std::endl;
std::cout << CylindricalSurface.IsUPeriodic() << std::endl;
std::cout << CylindricalSurface.IsVClosed() << std::endl;
std::cout << CylindricalSurface.IsVPeriodic() << std::endl;
反向
UReverse() 用于反转 U 方向,VReverse() 用于反转 V 方向。需要注意的是,方向反转后,U 方向与 V 方向的起始及结束参数保持不变,仅对应坐标位置发生改变。
double radius = 2.0;
double fu = CylindricalSurface.FirstUParameter();
double fv = CylindricalSurface.FirstVParameter();
double lu= CylindricalSurface.LastUParameter();
double lv= CylindricalSurface.LastVParameter();
std::cout << CylindricalSurface.Value(fu, fv) << std::endl;
std::cout << CylindricalSurface.Value(lu, lv) << std::endl;
CylindricalSurface.UReverse();
CylindricalSurface.VReverse();
double refu = CylindricalSurface.FirstUParameter();
double refv = CylindricalSurface.FirstVParameter();
double relu = CylindricalSurface.LastUParameter();
double relv = CylindricalSurface.LastVParameter();
std::cout << CylindricalSurface.Value(refu, refv) << std::endl;
std::cout << CylindricalSurface.Value(relu, relv) << std::endl;
此外,UReversedParameter(t) 用于计算参数 t 在 U 方向上的对称参数,VReversedParameter(t) 用于计算参数 t 在 V 方向上的对称参数。
double u = 2.;
double v = 2.;
std::cout << CylindricalSurface.UReversedParameter(u) << std::endl;
std::cout << CylindricalSurface.VReversedParameter(v) << std::endl;
等参线
UIso() 用于获取 U 等参线,即参数域中直线 u=u₀ 所对应的空间曲线;VIso() 用于获取 V 等参线,即参数域中直线 v=v₀ 所对应的空间曲线。
double radius = 2.0;
double u = 2.;
double v = 2.;
std::shared_ptr< AMCAX::Geom3Curve >uiso = CylindricalSurface.UIso(u);
std::shared_ptr< AMCAX::Geom3Curve >viso = CylindricalSurface.VIso(v);
针对上述示例,UIso(U 方向等参线)为一条平行于 Z 轴的直线,且位于圆柱侧面;VIso(V 方向等参线)为一个半径 r=2.0 的圆,且处于高度 v=2.0 的位置。
子类
Geom3Plane
Geom3Plane 是三维空间中的平面,其参数域为无穷大。该平面可通过 AMCAX::Frame3 创建:Frame3 的 XOY 平面即为该平面,OZ 方向为平面的法向;参数域的 u 方向对应 OX 方向,v 方向对应 OY 方向;且在参数 (u, v) = (0, 0) 处的三维空间点,即为 Frame3 的标架原点。
double umin = 0.;
double umax = 2.;
double vmin = 0.;
double vmax = 2.;
三维平面的类
定义 Geom3Plane.hpp:14
Geom3SphericalSurface
Geom3SphericalSurface 是三维空间中的球面,其参数域为 [0, 2π) × [-π/2, π/2],参数分别对应球面的参数坐标。该球面可通过 AMCAX::Frame3 与半径创建:Frame3 的原点为球心;XOY 平面上的圆为等参线 v=0,x 正半轴与 z 轴所张成的半平面上的半圆为等参线 u=0;OX 向 OY 旋转为 u 方向正向,-OZ 向 OZ 旋转为 v 方向正向。
double radius = 2.;
double umin = 0.;
double umax = 1.;
double vmin = 0.;
double vmax = 1.;
三维球面的类
定义 Geom3SphericalSurface.hpp:14
Geom3CylindricalSurface
Geom3CylindricalSurface 是三维空间中的无限长圆柱面,其参数域为 [0, 2π) × [-∞, ∞],参数分别对应圆柱面的参数坐标。该圆柱面可通过 AMCAX::Frame3 与半径创建:xOy 平面上的圆为等参线 v=0;OX 向 OY 旋转为 u 方向正向,Z 轴方向为 v 方向正向。 v 方向的参数变化与弧长变化保持一致。
double radius = 2.;
double umin = 0.;
double umax = 2.;
double vmin = 0.;
double vmax = 2.;
Geom3ConicalSurface
Geom3ConicalSurface 是三维空间中的无限长圆锥面,其参数域为 [0, 2π) × [-∞, ∞]。该圆锥面可通过 Frame3、xOy 平面上的圆半径及半角创建:xOy 平面上的圆为等参线 v=0;OX 向 OY 旋转为 u 方向正向;v 方向为倾斜直线,与 Z 轴夹角为锐角的方向为正向,且 v 方向的参数变化与弧长变化保持一致。
double radius = 2.;
double umin = 0.;
double umax = 2.;
double vmin = 0.;
double vmax = 2.;
三维圆锥曲面的类
定义 Geom3ConicalSurface.hpp:14
Geom3ToroidalSurface
Geom3ToroidalSurface 是三维空间中的圆环面,其参数域为 [0, 2π) × [0, 2π)。该圆环面可通过 Frame3、大半径及小半径创建:xOy 平面上的标准圆为等参线 v=0,xOz 平面上的标准圆为等参线 u=0。
double radius1 = 2.;
double radius2 = 1.;
double umin = 0.;
double umax = 2.;
double vmin = 0.;
double vmax = 2.;
三维环形曲面的类
定义 Geom3ToroidalSurface.hpp:14
Geom3BezierSurface
Geom3BezierSurface 是三维空间中的贝塞尔曲面,其参数域为 [0,1]×[0,1]。该曲面可通过控制点及可选权重创建,创建时需注意:权重数量必须与控制点数量一致;若所有权所有权重相等(如均为 1),则有理贝塞尔曲面将退化为普通贝塞尔曲面。
poles(0, 0).SetCoord(0.0, 0.0, 0.0);
poles(0, 1).SetCoord(1.0, 0.0, 2.0);
poles(0, 2).SetCoord(2.0, 0.0, 1.0);
poles(0, 3).SetCoord(3.0, 0.0, 0.0);
poles(1, 0).SetCoord(0.0, 1.0, 1.0);
poles(1, 1).SetCoord(1.0, 1.0, 3.0);
poles(1, 2).SetCoord(2.0, 1.0, 2.0);
poles(1, 3).SetCoord(3.0, 1.0, 1.0);
poles(2, 0).SetCoord(0.0, 2.0, 1.0);
poles(2, 1).SetCoord(1.0, 2.0, 2.0);
poles(2, 2).SetCoord(2.0, 2.0, 3.0);
poles(2, 3).SetCoord(3.0, 2.0, 1.0);
poles(3, 0).SetCoord(0.0, 3.0, 0.0);
poles(3, 1).SetCoord(1.0, 3.0, 1.0);
poles(3, 2).SetCoord(2.0, 3.0, 1.0);
poles(3, 3).SetCoord(3.0, 3.0, 0.0);
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
weights(i, j) = 1.0;
}
}
std::shared_ptr<AMCAX::Geom3BezierSurface> BezierSurface = std::make_shared<AMCAX::Geom3BezierSurface>(poles, weights);
static constexpr double Confusion() noexcept
获取混淆容差
定义 Precision.hpp:122
Geom3BSplineSurface
Geom3BSplineSurface 是三维空间中的 B 样条曲面,可通过控制点、节点向量、节点重数及曲线次数创建。创建时需满足以下条件:
- U 方向节点向量(UKnots)的长度 = U 方向节点重数(UMultiplicities)的长度;
- V 方向节点向量(VKnots)的长度 = V 方向节点重数(VMultiplicities)的长度;
- U 方向节点重数之和(sum (UMultiplicities))= 控制点矩阵行数(Poles.Rows ()) + U 方向曲线次数(UDegree) + 1;
- V 方向节点重数之和(sum (VMultiplicities))= 控制点矩阵列数(Poles.Cols ()) + V 方向曲线次数(VDegree) + 1;
- 节点向量(含 U、V 方向)必须单调递增,且单个节点的重数不得超过对应方向的曲线次数。
poles(0, 0).SetCoord(0.0, 0.0, 0.0);
poles(0, 1).SetCoord(0.666667, 1., 0.333333);
poles(0, 2).SetCoord(-0.666667, 0., -0.333333);
poles(0, 3).SetCoord(0.0, 1., 0.0);
poles(1, 0).SetCoord(0.666667, 1., 0.333333);
poles(1, 1).SetCoord(1.44444, 2.22222, 0.777778);
poles(1, 2).SetCoord(-1.22222, 1.22222, 0.111111);
poles(1, 3).SetCoord(-0.666667, 2., 0.333333);
poles(2, 0).SetCoord(0.333333, 1., -0.333333);
poles(2, 1).SetCoord(1.11111, 0.222222, 0.111111);
poles(2, 2).SetCoord(2.44444, 3.22222, 0.777778);
poles(2, 3).SetCoord(1.66667, 2., 0.333333);
poles(3, 0).SetCoord(1., 0.0, 0.0);
poles(3, 1).SetCoord(1.66667, -1., 0.333333);
poles(3, 2).SetCoord(1.66667, 2., 0.333333);
poles(3, 3).SetCoord(1., 1., 0.);
std::vector<double> uknots = { 0.0, 1.0 };
std::vector<int> umults = { 4, 4 };
std::vector<double> vknots = { 0.0, 1.0 };
std::vector<int> vmults = { 4, 4 };
int udegree = 3;
int vdegree = 3;
std::shared_ptr<AMCAX::Geom3BSplineSurface> BSplineSurface = std::make_shared<AMCAX::Geom3BSplineSurface>(poles, uknots, vknots, umults, vmults, udegree, vdegree);
Geom3SurfaceOfExtrusion
Geom3SurfaceOfExtrusion 是三维空间中的无限大挤出面(拉伸面),可通过母线(Geom3Curve)及挤出方向创建:u 方向为母线的参数方向,v 方向为挤出方向;等参线 v=0 即母线本身,所有 u 等参线均为直线;u 参数域与母线的参数域一致,v 参数域为无穷大。
double radius = 1.;
std::shared_ptr<AMCAX::Geom3Curve> curve = std::make_shared<AMCAX::Geom3Circle>(frame, radius);
std::shared_ptr<AMCAX::Geom3SurfaceOfExtrusion> SurfaceOfExtrusion = std::make_shared<AMCAX::Geom3SurfaceOfExtrusion>(curve, dir);
double u1 = 0.;
double v1 = 0.;
double v2 = 5.;
std::shared_ptr<AMCAX::Geom3TrimmedSurface> trimextrusion = std::make_shared<AMCAX::Geom3TrimmedSurface>(SurfaceOfExtrusion, u1, u2, v1, v2);
Geom3SurfaceOfRevolution
Geom3SurfaceOfRevolution 是三维空间中的旋转面,可通过母线(Geom3Curve)及旋转轴创建:u 参数域为 [0, 2π),v 参数域与母线参数域一致;每条 v 等参线均为圆心位于旋转轴上的圆,每条 u 等参线则是母线绕旋转轴旋转形成的曲线。
double radius = 1.;
std::shared_ptr<AMCAX::Geom3Curve> curve = std::make_shared<AMCAX::Geom3Circle>(frame, radius);
double u1 = 0.;
std::shared_ptr<AMCAX::Geom3TrimmedCurve> trimCurve = std::make_shared<AMCAX::Geom3TrimmedCurve>(curve, u1, u2);
std::shared_ptr<AMCAX::Geom3SurfaceOfRevolution> SurfaceOfRevolution = std::make_shared<AMCAX::Geom3SurfaceOfRevolution>(trimCurve, axis);
AxisT< double, 3 > Axis3
三维轴
定义 AxisT.hpp:423
Geom3TrimmedSurface
Geom3TrimmedSurface 是三维空间中的裁剪曲面,由原曲面与裁剪参数共同构建而成。它可对原曲面进行 u 方向裁剪、v 方向裁剪或 uv 方向联合裁剪。若需获取原曲面,可通过 BasisSurface 实现。
double radius = 3.;
std::shared_ptr<AMCAX::Geom3CylindricalSurface> CylindricalSurface = std::make_shared< AMCAX::Geom3CylindricalSurface>(frame, radius);
double u1 = 0.;
double u2 = 2.;
double v1 = 0.;
double v2 = 2.;
std::shared_ptr<AMCAX::Geom3TrimmedSurface> TrimmedSurface = std::make_shared<AMCAX::Geom3TrimmedSurface>(CylindricalSurface, u1, u2, v1, v2);
auto basis = TrimmedSurface->BasisSurface();
Geom3OffsetSurface
Geom3OffsetSurface 是三维空间中的偏移曲面,用于将原曲面的每个点沿其法向偏移指定距离。若需获取原曲面,可通过 BasisSurface 实现。
double radius = 3.;
std::shared_ptr<AMCAX::Geom3CylindricalSurface> CylindricalSurface = std::make_shared< AMCAX::Geom3CylindricalSurface>(frame, radius);
double u1 = 0.;
double u2 = 2.;
double v1 = 0.;
double v2 = 2.;
std::shared_ptr<AMCAX::Geom3TrimmedSurface> TrimmedSurface = std::make_shared<AMCAX::Geom3TrimmedSurface>(CylindricalSurface, u1, u2, v1, v2);
double offset = 2.;
std::shared_ptr<AMCAX::Geom3OffsetSurface> offsetsurface1 = std::make_shared<AMCAX::Geom3OffsetSurface>(TrimmedSurface, offset);
auto basis = offsetsurface1->BasisSurface();
若需获取偏移后的等价曲面,可通过 Surface 实现。例如,球面偏移后仍为球面,圆柱面偏移后仍为圆柱面。
double offset2 = 2.;
std::shared_ptr<AMCAX::Geom3Surface> offsetsurface2 = ofs.Surface();
三维偏移曲面的类
定义 Geom3OffsetSurface.hpp:20
事实上,上述所有类型的曲面(平面、球面、圆柱面、圆锥面、圆环面、挤出面、旋转面、贝塞尔曲面、B 样条曲面)偏移后,理论上均可由原曲面类型表示;但目前仅实现了裁剪或非裁剪的平面、圆柱面、圆锥面、球面、圆环面的等价曲面,其余类型会返回空指针。