坐标
构建
使用默认构造函数会得到坐标原点,构建时需要输入浮点数。另外所有的几何都只支持输入浮点数,后续不再特殊说明。
Coord3(三维坐标)
Coord3d Coord3
三维坐标
定义 CoordT.hpp:2809
Coord2(二维坐标)
Coord2d Coord2
二维坐标
定义 CoordT.hpp:2806
获取与更改
获取
获取坐标某一维度的值可以使用如下两种方法。
double x = crd.X();
double y = crd.Y();
double z = crd.Z();
double x2 = crd[0];
double y2 = crd[1];
double z2 = crd[2];
更改
更改坐标某一维度的值可以使用如下两种方法。
crd.SetXYZ(1.0, 0.0, 2.1);
crd.SetX(0.5);
crd.SetY(0.5);
crd.SetZ(0.5);
常用功能
运算
支持加减,数乘,内积,外积,另外也支持 == 和 !=。
加减
数乘
内积
double t = crd1.Dot(crd2);
外积
== 和 !=
== 和 != 可用来对坐标/坐标各维度进行判断。
double result1 = crd1 == crd2;
std::cout << result1 << std::endl;
double result2 = crd1 != crd2;
std::cout << result2 << std::endl;
double result3 = crd1.Y() == crd2.Y();
std::cout << result3 << std::endl;
模
我们内核支持计算坐标的模长以及对坐标进行归一化。
模长
double length = crd1.Norm();
归一化
对坐标进行归一化有两种方式,一种不改变坐标本身,创建一个新的坐标,另一种则是直接改变坐标本身。
输出与输入
我们内核支持对坐标进行输出<<,也支持输入>>。
输出
std::cout << crd1 << std::endl;
输入
std::istringstream is("0.0 1.0 2.0");
is >> crd7;
点
构建
使用默认构造函数会得到原点。可直接创建或者基于 Coord3/Coord2 构建。
Coord3(三维点)
PointT< double, 3 > Point3
三维点
定义 PointT.hpp:459
Coord2(二维点)
PointT< double, 2 > Point2
二维点
定义 PointT.hpp:456
获取与更改
获取
获取点某一维度的值可以使用如下两种方法。
double x = p1.X();
double y = p1.Y();
double z = p1.Z();
double x2 = p1[0];
double y2 = p2[1];
double z2 = p3[2];
更改
更改点某一维度的值可以使用如下两种方法。
p1.SetCoord(1.0, 0.0, 2.1);
p1.SetX(0.5);
p1.SetY(0.5);
p1.SetZ(0.5);
常用功能
运算
我们内核不支持对点做四则运算(加减乘除),事实上除 Coord 外,大部分几何都不支持四则运算,后续不再说明。但是如果需要对点做四则运算,可先获取点的 Coord ,然后再对 Coord 做运算。
const Coord3& crd3 = p1.Coord();
const Coord3& crd4 = p2.Coord();
const Coord3& crd5 = crd3 + crd4;
计算两点间的距离
double dis = p1.Distance(p2);
变换
大部分几何都支持变换,即平移、旋转、镜像,等比例放缩变换等,后续不再说明。
平移变换
Class of making a box
定义 MakeBox.hpp:18
Base class of shape, containing an underlying shape with a location and an orientation
定义 TopoShape.hpp:15
TransformationT< double, 3 > Transformation3
三维变换
定义 TransformationT.hpp:1102
VectorT< double, 3 > Vector3
三维向量
定义 VectorT.hpp:707
旋转变换
AxisT< double, 3 > Axis3
三维轴
定义 AxisT.hpp:423
镜像变换
点镜像
轴镜像
DirectionT< double, 3 > Direction3
三维方向
定义 DirectionT.hpp:587
平面镜像
FrameT< double, 3 > Frame3
三维标架
定义 FrameT.hpp:885
等比例放缩变换
复合变换
复合变换的公式为sRx+b,其中,s为放缩因子,R为旋转矩阵,x为待变换的坐标,b为平移向量。
如构建如下变换:先绕x轴旋转pi/4,再缩放至0.2倍,最后沿x轴平移1个单位:
四元数的类
定义 QuaternionT.hpp:19
将局部坐标系的物体变为全局坐标系(或另一坐标系)的变换
构建变换使得局部坐标系f2={O=(1,0,0), OZ=(1,1,0), OX=(0,0,1)}下的物体变换为全局坐标系下的物体:
将标架1平移、旋转到标架2的变换
构建变换使得全局坐标系的标架变换为另一标架f2={O=(1,0,0), OZ=(1,1,0), OX=(0,0,1)}:
变换的乘法
trans1 * trans2。即在trans2后再用trans1进行变换。
向量与方向
Vector3 即数学上的向量,有方向有长度。Direction3 只有方向,其模长必须为 1.0。
构建
std::cout << vec << ' ' << dir << std::endl;
std::cout << vec1 << ' ' << dir1 << std::endl;
std::cout << vec2 << ' ' << dir2 << std::endl;
std::cout << vec3 << std::endl;
获取与更改
与 Coord 类似,只不过 Direction 会自动归一化。
获取
获取向量/方向某一维度的值可以使用如下两种方法。
double x2 = vec[0];
double y2 = vec[1];
double z2 = vec[2];
double x4 = dir[0];
double y4 = dir[1];
double z4 = dir[2];
constexpr const Scalar & Z() const noexcept
获取 z 分量(仅当 DIM >= 3 时可用)
定义 DirectionT.hpp:198
constexpr const Scalar & Y() const noexcept
获取 y 分量(仅当 DIM >= 2 时可用)
定义 DirectionT.hpp:190
constexpr const Scalar & X() const noexcept
获取 x 分量(仅当 DIM >= 1 时可用)
定义 DirectionT.hpp:182
constexpr const Scalar & Y() const noexcept
获取向量的 y 坐标,仅当 DIM >= 2 时可用
定义 VectorT.hpp:158
constexpr const Scalar & Z() const noexcept
获取向量的 z 坐标,仅当 DIM >= 3 时可用
定义 VectorT.hpp:166
constexpr const Scalar & X() const noexcept
获取向量的 x 坐标,仅当 DIM >= 1 时可用
定义 VectorT.hpp:150
更改
更改向量/方向某一维度的值可以使用如下两种方法。
void SetX(const OtherScalar &x)
设置方向的 x 分量,并进行标准化(仅当 DIM >= 1 时可用)
定义 DirectionT.hpp:128
void SetY(const OtherScalar &y)
设置方向的 y 分量,并进行标准化(仅当 DIM >= 2 时可用)
定义 DirectionT.hpp:140
void SetCoord(T &&... vs)
通过分量设置坐标,并进行标准化
定义 DirectionT.hpp:77
void SetZ(const OtherScalar &z)
设置方向的 z 分量,并进行标准化(仅当 DIM >= 3 时可用)
定义 DirectionT.hpp:152
constexpr void SetZ(const OtherScalar &z) &noexcept
设置向量的 z 坐标,仅当 DIM >= 3 时可用
定义 VectorT.hpp:117
constexpr void SetY(const OtherScalar &y) &noexcept
设置向量的 y 坐标,仅当 DIM >= 2 时可用
定义 VectorT.hpp:108
constexpr void SetCoord(T &&... vs) &noexcept
设置分量值设置坐标
定义 VectorT.hpp:81
constexpr void SetX(const OtherScalar &x) &noexcept
设置向量的 x 坐标,仅当 DIM >= 1 时可用
定义 VectorT.hpp:99
常用功能
运算
Vector 有加减、数乘,对应数学上的向量加减和数乘,Direction 没有。而内积、外积两者都是有的。用法与 Coord 类似。
加减
数乘
内积
double t = vecc.Dot(vec1);
double t2 = dirr.Dot(dir1);
外积
角度
内核支持计算角度,其中 Angle() 计算的是夹角,角度范围为 [0.0, pi];AngleWithRef() 计算的是 2d 上的转角,角度范围为 [-pi, pi],正负值取决于 ddir, other_dir, ref_dir 构成的是右手系还是左手系。
AMCAX::Direction3 ddir(1.0, 0.0, 0.0), other_dir(0.0, 0.5, 0.5), ref_dir(0.0, 0.0, 1.0);
double angle1 = ddir.Angle(other_dir);
double angle2 = ddir.AngleWithRef(other_dir, ref_dir);
注:在二维情况下只可以用 Angle() 来计算转角。
此外还可以判断是否反向 IsOpposite(),是否平行 IsParallel()。可参考以下代码:
bool op1 = v1.IsOpposite(v2, 0.1);
std::cout << op1 << std::endl;
bool pa1 = v1.IsParallel(v3, 0.1);
std::cout << pa1 << std::endl;
bool op2 = d1.IsOpposite(d2,0.1);
std::cout << op2 << std::endl;
bool pa2 = d1.IsParallel(d3, 0.1);
std::cout << pa2 << std::endl;
方向类,即单位向量
定义 VectorT.hpp:17
模
Vector 可以计算其模长和对其进行归一化,与 Coord 类似。
模长
double length = vec1.Norm();
归一化
轴
Axis3 是三维空间中的轴,等价于一个 Point3 加一个 Direction3。构建方法如下:
此外内核支持计算轴的角度和模长。可参考以下代码:
double angle = axis.Angle(axis2);
标架
定义
Frame3 是三维空间中的标架,即点和 3 个互相垂直的方向。
世界坐标系{O;x,y,z}就是一个常用的标架,也是 Frame3 默认构造函数的标架:
constexpr const DirectionT< Scalar, DIM > & XDirection() const noexcept
获取 x 方向,仅当 DIM >= 1 时可用
定义 FrameT.hpp:449
constexpr const PointT< Scalar, DIM > & Location() const noexcept
获取位置
定义 FrameT.hpp:433
constexpr const DirectionT< Scalar, DIM > & YDirection() const noexcept
获取 y 方向,仅当 DIM >= 2 时可用
定义 FrameT.hpp:457
constexpr const DirectionT< Scalar, DIM > & Direction() const noexcept
获取三维主方向(z 方向)
定义 FrameT.hpp:441
注:如果输入的 z 轴与 x 轴并不垂直,算法会用 z 外积 x 得到 y,再用 y 外积 z 得到 x。
左右手系
左图为右手系,右图为左手系(图中蓝、绿、红分别表示 x、y、z 轴),常用的局部坐标系为右手系。判断左右手系的方法是将右手的手指从 x 向 y 弯曲,如果大拇指与 z 方向一致就是右手系。
我们内核获取一个标架是否为右手系的方法是:
constexpr bool IsDirect() const noexcept
三维标架是否为右手标架
定义 FrameT.hpp:520
局部坐标系
标架可表示一个局部坐标系。局部坐标系的优势是可以将空间曲线曲面的构建简单化。
变换
主要有三种变换:从局部坐标系转换为全局坐标系、从一个局部坐标系转换到另一个局部坐标系、构建仿射变换使得一个标架(平移、旋转、镜像)变换为另一个标架,可参考上文变换部分的内容。
三维参数曲线
常见功能
获得参数范围
AMCAX::Geom3Curve::FirstParameter 用于获得曲线的起始参数, AMCAX::Geom3Curve::LastParameter 用于获得曲线的终止参数。
std::vector<AMCAX::Point3> pts22 = {
};
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> mults = { 4, 1, 2, 4 };
std::shared_ptr< AMCAX::Geom3BSplineCurve> bspline = std::make_shared< AMCAX::Geom3BSplineCurve>(pts22, weights, knots, mults, 3);
double fp = bspline->FirstParameter();
double lp = bspline->LastParameter();
std::cout << fp <<"," << lp << std::endl;
std::shared_ptr< AMCAX::Geom3Parabola >parabola = p.Value();
double fp2 = trimcurve.FirstParameter();
double lp2 = trimcurve.LastParameter();
std::cout << fp2 << "," << lp2 << std::endl;
三维修剪曲线的类
定义 Geom3TrimmedCurve.hpp:12
构造三维几何抛物线的类
定义 MakeGeom3Parabola.hpp:13
求值和求导
AMCAX::Geom3Curve::Value 或 AMCAX::Geom3Curve::D0 用于求值,而 AMCAX::Geom3Curve::D1 , AMCAX::Geom3Curve::D2 , AMCAX::Geom3Curve::D3 , AMCAX::Geom3Curve::DN 用于求导。
double t = 0.4 * (fp + lp);
bspline->D0(t, p2);
bspline->D1(t, p2, d1);
bspline->D2(t, p2, d1, d2);
bspline->D3(t, p2, d1, d2, d3);
int deriv = 4;
double t2 = 1.5;
trimcurve.D0(t2, p4);
trimcurve.D1(t2, p4, dd1);
trimcurve.D2(t2, p4, dd1, dd2);
trimcurve.D3(t2, p4, dd1, dd2, dd3);
int deriv2 = 4;
获得类型
AMCAX::Geom3Curve::Type 用于获得曲线类型,如直线、圆、椭圆、抛物线等。曲线类型可参考枚举类 CurveType 。
std::cout << int(bspline->Type()) << ";" << int(trimcurve.Type());
封闭性、周期性
AMCAX::Geom3Curve::IsClosed 用于获得曲线的封闭性(起始点与终止点是同一个点), AMCAX::Geom3Curve::IsPeriodic 用于获得曲线的周期性。
std::cout <<bspline->IsClosed()<< ";" << bspline->IsPeriodic();
std::cout <<trimcurve.IsClosed()<< ";" << trimcurve.IsPeriodic();
反向
AMCAX::Geom3Curve::Reverse 用于将 Geom3Curve 反向,改变自身,而 AMCAX::Geom3Curve::Reversed 用于获取反向的 Geom3Curve,不改变自身。反转后,曲线的起点和终点发生了对换。对于一般曲线,曲线参数范围不变,而对于裁剪曲线,可能会改变曲线的参数范围。如以下例子,一条裁剪直线原来的参数范围为 -1 到 3,反转后变为 -3 到 1。
auto reverse = bspline->Reversed();
double fp3 = reverse->FirstParameter();
double lp3 = reverse->LastParameter();
std::cout << fp3 << "," << lp3 << std::endl;
std::cout << bspline->Value(fp) << std::endl;
std::cout << bspline->Value(lp) << std::endl;
std::cout<<reverse->Value(fp3)<<std::endl;
std::cout<<reverse->Value(lp3)<<std::endl;
bspline->Reverse();
double fp4 = bspline->FirstParameter();
double lp4 = bspline->LastParameter();
std::cout << fp4 << "," << lp4 << std::endl;
std::cout << reverse->Value(fp4) << std::endl;
std::cout << reverse->Value(lp4) << std::endl;
auto trimline2 = std::make_shared<AMCAX::Geom3TrimmedCurve>(line2, -1.0, 3.0);
std::cout << trimline2->Value(-1.0) << std::endl;
std::cout << trimline2->Value(3.0) << std::endl;
auto reverse2 = trimline2->Reversed();
double fp5 = reverse2->FirstParameter();
double lp5 = reverse2->LastParameter();
std::cout << fp5 << "," << lp5 << std::endl;
std::cout << reverse2->Value(fp5) << std::endl;
std::cout << reverse2->Value(lp5) << std::endl;
trimline2->Reverse();
double fp6 = trimline2->FirstParameter();
double lp6 = trimline2->LastParameter();
std::cout << fp6 << "," << lp6 << std::endl;
std::cout << trimline2->Value(fp6) << std::endl;
std::cout <<trimline2->Value(lp6) << std::endl;
在这里我们解释一下反转后,裁剪直线的参数范围变为 -3 到 1 的原因,这是因为裁剪曲线在反转的时候是先对其 basiscurve (无穷长的直线)做反转,然后再根据裁剪起始点和终止点的参数确定反转后的参数。
另外如果想计算某一参数的对称参数可通过 AMCAX::Geom3Curve::ReversedParameter 来实现。
std::cout << trimline->ReversedParameter(0.5) << std::endl;
子类
Geom3Line
Geom3Line 是一条无限长的 3D 直线,由一个 Point3 和一个 Direction3 定义,在 Point3 处的参数为 0.0,沿 Direction3 方向参数为正,参数变化与长度变化一致。直线的参数域为无穷大。
auto trimline = std::make_shared<AMCAX::Geom3TrimmedCurve>(line, 0.0, 1.0);
Class of making an edge
定义 MakeEdge.hpp:24
Geom3Circle
Geom3Circle 是 3 维空间中的圆,由一个标架和半径定义,即在标架的 XOY 平面上的标准圆(圆心在标架原点,参数为 0 时,圆上的点在 x 轴,参数增加时逆时针转动)。圆的参数域为[0, 2*pi),意义为圆的参数坐标。
auto circle = std::make_shared<AMCAX::Geom3Circle>(
AMCAX::Frame3(), 1.0);
Geom3Ellipse
Geom3Ellipse 是 3 维空间中的椭圆,由一个标架和长短半径定义,即在标架的 XOY 平面上的标准椭圆(中心在标架原点,参数为 0 时,椭圆上的点在 x 轴,参数增加时逆时针转动)。椭圆的参数域为[0, 2*pi),意义为椭圆的参数坐标。
auto ellipse = std::make_shared<AMCAX::Geom3Ellipse>(
AMCAX::Frame3(), 2.0,1.0);
Geom3Hyperbola
Geom3Hyperbola 是 3 维空间中双曲线的右半支,由一个标架和实轴半径、虚轴半径定义,即在标架的 XOY 平面上的标准双曲线的右半支(中心在标架原点,参数为 0 时,双曲线上的点在 x 轴的正半轴上,参数增加时,点沿着双曲线的右半支移动,并且参数越大,在 XOY 平面上的 y 坐标就越大)。如果想获取双曲线的左半支,可以通过 AMCAX::Geom3Hyperbola::OtherBranch 获得。双曲线的参数域为[-∞, +∞],意义为双曲线的参数坐标。
auto hyperbola = std::make_shared<AMCAX::Geom3Hyperbola>(
AMCAX::Frame3(), 2.0, 1.0);
auto trimhyperbola = std::make_shared<AMCAX::Geom3TrimmedCurve>(hyperbola, 0.0, 2.0);
Geom3Parabola
Geom3Parabola 是 3 维空间中的抛物线,由一个标架和焦距定义,即在标架的 XOY 平面上的标准抛物线(顶点在标架原点,对称轴为 x 轴,参数为 0 时,抛物线上的点在原点,参数增加时,点沿着抛物线移动,并且参数越大,在 XOY 平面上的 y 坐标就越大)。抛物线的参数域为[-∞, +∞],意义为抛物线的参数坐标。
auto parabola2 = std::make_shared<AMCAX::Geom3Parabola>(
AMCAX::Frame3(), 1.0);
auto trimparabola = std::make_shared<AMCAX::Geom3TrimmedCurve>(parabola2, -2.0, 2.0);
Geom3BezierCurve
Geom3BezierCurve 是 3 维空间中的 Bezier 曲线,由控制点、权重(可选)定义。曲线的次数为控制点数量减一,例如,如果有 4 个控制点,则曲线是 3 次 Bezier 曲线。另外 Bezier 曲线的参数域为 [0,1],当参数 t=0 时,曲线位于起点(第一个控制点),当参数 t=1 时,曲线位于终点(最后一个控制点)。对于标准的贝塞尔曲线,其节点向量为 {0, 1},且每个节点的重数都是次数 + 1。
std::vector<AMCAX::Point3> pts3 = {
};
auto bezier = std::make_shared<AMCAX::Geom3BezierCurve>(pts3);
Geom3BSplineCurve
Geom3BSplineCurve 是 3 维空间中的 BSpline 曲线,由控制点、节点向量、节点重数、权重(可选)定义。
std::vector<AMCAX::Point3> pts = {
};
std::vector<double> weights2 = { 1.0, 2.0, 3.0, 4.0, 3.0, 2.0, 1.0 };
std::vector<double> knots2 = { 0.0, 0.25, 0.5, 1.0 };
std::vector<int> mults2 = { 4, 1, 2, 4 };
auto bspline2 = std::make_shared< AMCAX::Geom3BSplineCurve>(pts, weights2, knots2, mults2, 3);
Geom3TrimmedCurve
Geom3TrimmedCurve 是 3 维空间中的裁剪曲线,由原曲线和两个裁剪参数组成。要注意的是,Trim 后的曲线一定是非周期的,即使对圆做的是 [0,2pi] 的裁剪。此外,周期曲线可以超过定义域进行裁剪,如对圆:
auto circle = std::make_shared<AMCAX::Geom3Circle>(
AMCAX::Frame3(), 1.0);
auto trimcircle2 = std::make_shared<AMCAX::Geom3TrimmedCurve>(circle, -M_PI / 4, M_PI * 3 / 4);
Geom3OffsetCurve
Geom3OffsetCurve 是 3 维空间中的偏移曲线,由原曲线、偏移距离和参考方向组成。其作用为:将原曲线沿垂直于切向的一个方向偏移指定距离,偏移方向为切向和参考方向的外积方向,如下图所示。其中,蓝色箭头为切向,绿色箭头为参考方向,红色箭头为外积方向,即偏移方向。
以 xoy 平面的标准圆为例,当参考方向为 oz 时,偏移方向为向外。以下为偏移后的结果:
另外如果想获取偏移曲线的原曲线,可通过 AMCAX::Geom3OffsetCurve::BasisCurve 来获得。
auto circle2 = std::make_shared<AMCAX::Geom3Circle>(
AMCAX::Frame3(), 2.0);
double offset = 1.5;
auto circleoffset = std::make_shared<AMCAX::Geom3OffsetCurve>(circle2, offset, direction);
auto basiscircle = circleoffset->BasisCurve();
二维参数曲线
常见功能
获得参数范围
AMCAX::Geom2Curve::FirstParameter 用于获得曲线的起始参数, AMCAX::Geom2Curve::LastParameter 用于获得曲线的终止参数。
std::vector<AMCAX::Point2> pts22 = {
};
std::vector<double> knots = { 0.0, 0.25, 0.5,0.75,1.0 };
std::vector<int> mults = { 4, 1, 1,1,4 };
std::shared_ptr< AMCAX::Geom2BSplineCurve> bspline2 = std::make_shared< AMCAX::Geom2BSplineCurve>(pts22, knots, mults, 3);
double fp = bspline2->FirstParameter();
double lp = bspline2->LastParameter();
std::cout << fp <<"," << lp << std::endl;
std::shared_ptr< AMCAX::Geom2Parabola >parabola2 = std::make_shared< AMCAX::Geom2Parabola>(
AMCAX::Frame2(), 2.0);
double fp2 = trimcurve.FirstParameter();
double lp2 = trimcurve.LastParameter();
std::cout << fp2 << "," << lp2 << std::endl;
二维修剪曲线的类
定义 Geom2TrimmedCurve.hpp:12
FrameT< double, 2 > Frame2
二维标架
定义 FrameT.hpp:882
求值和求导
AMCAX::Geom2Curve::Value 或 AMCAX::Geom2Curve::D0 用于求值,而 AMCAX::Geom2Curve::D1 , AMCAX::Geom2Curve::D2 , AMCAX::Geom2Curve::D3 , AMCAX::Geom2Curve::DN 用于求导。
double t = 0.4 * (fp + lp);
bspline2->D0(t, p2);
bspline2->D1(t, p2, d1);
bspline2->D2(t, p2, d1, d2);
bspline2->D3(t, p2, d1, d2, d3);
int deriv = 4;
double t2 = 1.5;
trimcurve.D0(t2, p4);
trimcurve.D1(t2, p4, dd1);
trimcurve.D2(t2, p4, dd1, dd2);
trimcurve.D3(t2, p4, dd1, dd2, dd3);
int deriv2 = 4;
VectorT< double, 2 > Vector2
二维向量
定义 VectorT.hpp:704
获得类型
AMCAX::Geom2Curve::Type 用于获得曲线类型,如直线、圆、椭圆、抛物线等。曲线类型可参考枚举类 CurveType 。
std::cout << int(bspline2->Type()) << ";" << int(trimcurve.Type());
封闭性、周期性
AMCAX::Geom2Curve::IsClosed 用于获得曲线的封闭性(起始点与终止点是同一个点), AMCAX::Geom2Curve::IsPeriodic 用于获得曲线的周期性。
std::cout <<bspline2->IsClosed()<< ";" << bspline2->IsPeriodic();
std::cout <<trimcurve.IsClosed()<< ";" << trimcurve.IsPeriodic();
反向
AMCAX::Geom2Curve::Reverse 用于将 Geom2Curve 反向,改变自身,而 AMCAX::Geom2Curve::Reversed 用于获取反向的 Geom2Curve,不改变自身。反转后,曲线的起点和终点发生了对换。对于一般曲线,曲线参数范围不变,而对于裁剪曲线,可能会改变曲线的参数范围。如以下例子,一条裁剪直线原来的参数范围为 -1 到 3,反转后变为 -3 到 1。
std::vector<AMCAX::Point2> pts3 = {
};
auto bezier2 = std::make_shared<AMCAX::Geom2BezierCurve>(pts3);
std::cout << bezier2->FirstParameter() << std::endl;
std::cout << bezier2->LastParameter() << std::endl;
auto reversebezier = bezier2->Reversed();
std::cout << reversebezier->FirstParameter() << std::endl;
std::cout << reversebezier->LastParameter() << std::endl;
std::cout << reversebezier->Value(0) << std::endl;
std::cout << reversebezier->Value(1) << std::endl;
bezier2->Reverse();
std::cout << bezier2->FirstParameter() << std::endl;
std::cout << bezier2->LastParameter() << std::endl;
std::cout << bezier2->StartPoint() << std::endl;
std::cout << bezier2->EndPoint() << std::endl;
auto trimline2 = std::make_shared<AMCAX::Geom2TrimmedCurve>(line2, -1., 3.);
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(-3) << std::endl;
std::cout << reverseline->Value(1) << 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:584
在这里我们解释一下反转后,裁剪直线的参数范围变为 -3 到 1 的原因,这是因为裁剪曲线在反转的时候是先对其 basiscurve (无穷长的直线)做反转,然后再根据裁剪起始点和终止点的参数确定反转后的参数。
另外如果想计算某一参数的对称参数可通过 AMCAX::Geom2Curve::ReversedParameter 来实现。
std::cout<<trimline2->ReversedParameter(0.5)<<std::endl;
子类
除了 Geom2OffsetCurve 外,其他均与三维类似。
Geom2Line
Geom2Line 是一条无限长的 2D 直线,由一个 Point2 和一个 Direction2 定义,在 Point2 处的参数为 0.0,沿 Direction2 方向参数为正,参数变化与长度变化一致。直线的参数域为无穷大。
auto trimline = std::make_shared<AMCAX::Geom2TrimmedCurve>(line, 0.0, 1.0);
Class of making a 2D edge
定义 MakeEdge2d.hpp:22
Geom2Circle
Geom2Circle 是 2 维空间中的圆,由一个标架和半径定义,即在标架的 XOY 平面上的标准圆(圆心在标架原点,参数为 0 时,圆上的点在 x 轴,参数增加时逆时针转动)。圆的参数域为[0, 2*pi),意义为圆的参数坐标。
auto circle = std::make_shared<AMCAX::Geom2Circle>(
AMCAX::Frame2(), 1.0);
Geom2Ellipse
Geom2Ellipse 是 2 维空间中的椭圆,由一个标架和长短半径定义,即在标架的 XOY 平面上的标准椭圆(中心在标架原点,参数为 0 时,椭圆上的点在 x 轴,参数增加时逆时针转动)。椭圆的参数域为[0, 2*pi),意义为椭圆的参数坐标。
auto ellipse = std::make_shared<AMCAX::Geom2Ellipse>(
AMCAX::Frame2(), 2.0,1.0);
Geom2Hyperbola
Geom2Hyperbola 是 2 维空间中双曲线的右半支,由一个标架和实轴半径、虚轴半径定义,即在标架的 XOY 平面上的标准双曲线的右半支(中心在标架原点,参数为 0 时,双曲线上的点在 x 轴的正半轴上,参数增加时,点沿着双曲线的右半支移动,并且参数越大,在 XOY 平面上的 y 坐标就越大)。如果想获取双曲线的左半支,可以通过 AMCAX::Geom2Hyperbola::OtherBranch 获得。双曲线的参数域为[-∞, +∞],意义为双曲线的参数坐标。
auto hyperbola = std::make_shared<AMCAX::Geom2Hyperbola>(
AMCAX::Frame2(), 2.0, 1.0);
auto trimhyperbola = std::make_shared<AMCAX::Geom2TrimmedCurve>(hyperbola, 0.0, 2.0);
HyperbolaS< 2 > Hyperbola2
二维双曲线
定义 HyperbolaT.hpp:298
Geom2Parabola
Geom2Parabola 是 2 维空间中的抛物线,由一个标架和焦距定义,即在标架的 XOY 平面上的标准抛物线(顶点在标架原点,对称轴为 x 轴,参数为 0 时,抛物线上的点在原点,参数增加时,点沿着抛物线移动,并且参数越大,在 XOY 平面上的 y 坐标就越大)。抛物线的参数域为[-∞, +∞],意义为抛物线的参数坐标。
auto parabola = std::make_shared<AMCAX::Geom2Parabola>(
AMCAX::Frame2(), 1.0);
auto trimparabola = std::make_shared<AMCAX::Geom2TrimmedCurve>(hyperbola, -2.0, 2.0);
Geom2BezierCurve
Geom2BezierCurve 是 2 维空间中的 Bezier 曲线,由控制点、权重(可选)定义。曲线的次数为控制点数量减一,例如,如果有 4 个控制点,则曲线是 3 次 Bezier 曲线。另外 Bezier 曲线的参数域为 [0,1],当参数 t=0 时,曲线位于起点(第一个控制点),当参数 t=1 时,曲线位于终点(最后一个控制点)。对于标准的贝塞尔曲线,其节点向量为 {0, 1},且每个节点的重数都是次数 + 1。
std::vector<AMCAX::Point2> pts = {
};
auto bezier = std::make_shared<AMCAX::Geom2BezierCurve>(pts);
Geom2BSplineCurve
Geom2BSplineCurve 是 2 维空间中的 BSpline 曲线,由控制点、节点、节点重数、曲线次数、权重(可选)定义。
std::vector<AMCAX::Point2> pts2 = {
};
std::vector<double> knots2 = { 0.0, 0.25, 0.5,0.75,1.0 };
std::vector<int> mults2 = { 4, 1, 1,1,4 };
auto bspline = std::make_shared< AMCAX::Geom2BSplineCurve>(pts2, knots2, mults2, 3);
Geom2TrimmedCurve
Geom2TrimmedCurve 是 2 维空间中的裁剪曲线,由原曲线和两个裁剪参数组成。与 3 维相同,Trim 后的曲线一定是非周期的并且周期曲线可以超过定义域进行裁剪,如对圆:
auto circle = std::make_shared<AMCAX::Geom2Circle>(
AMCAX::Frame2(), 1.0);
auto trimcircle2 = std::make_shared<AMCAX::Geom2TrimmedCurve>(circle, -M_PI / 4, M_PI * 3 / 4);
Geom2OffsetCurve
Geom2OffsetCurve 是 2 维空间中的偏移曲线,由原曲线、偏移距离组成,其偏移方向为切向顺时针旋转90°。另外如果想获取偏移曲线的原曲线,可通过 AMCAX::Geom2OffsetCurve::BasisCurve 来获得。
auto circle2 = std::make_shared<AMCAX::Geom2Circle>(
AMCAX::Frame2(), 2.0);
double offset = 1.5;
auto circleoffset = std::make_shared<AMCAX::Geom2OffsetCurve>(circle2, offset);
auto basiscircle = circleoffset->BasisCurve();
三维参数曲面
常用功能
获得参数范围
Bounds() 获得全部参数,FirstUParameter() 获得起始 u 参数 ,LastUParameter() 获得结束 u 参数 ,FirstVParameter() 获得起始 v 参数 ,LastVParameter() 获得结束 v 参数。
double u1=0., u2=0., v1=0., v2=0.;
CylindricalSurface4.Bounds(u1, u2, v1, v2);
std::cout << u1 << "-" << u2 << std::endl;
std::cout << v1 << "-" << v2 << std::endl;
std::cout<<CylindricalSurface4.FirstUParameter()<<std::endl;
std::cout<<CylindricalSurface4.LastUParameter()<<std::endl;
std::cout<<CylindricalSurface4.FirstVParameter()<<std::endl;
std::cout<<CylindricalSurface4.LastVParameter()<<std::endl;
三维圆柱面的类
定义 Geom3CylindricalSurface.hpp:14
求值、求导
Value 或 D0 可以求值,D1,D2,D3,DN 可以求导。
std::cout << CylindricalSurface4.Value(1., 2.) << std::endl;
CylindricalSurface4.D0(1., 2., p1);
std::cout << p1 << std::endl;
CylindricalSurface4.D1(1., 2., p2, du1, dv1);
std::cout << p2 << std::endl;
std::cout << du1 << std::endl;
std::cout << dv1 << std::endl;
CylindricalSurface4.D2(1., 2., p3, du2, dv2,duu1,duv1,dvv1);
std::cout << p3 << std::endl;
std::cout << du2 << std::endl;
std::cout << dv2 << std::endl;
std::cout << duu1 << std::endl;
std::cout << duv1 << std::endl;
std::cout << dvv1 << std::endl;
CylindricalSurface4.D3(1., 2., p4, du3, dv3, duu2, duv2, dvv2,duuu,duuv,duvv,dvvv);
std::cout << p4 << std::endl;
std::cout << du3 << std::endl;
std::cout << dv3 << std::endl;
std::cout << duu2 << std::endl;
std::cout << duv2 << std::endl;
std::cout << dvv2 << std::endl;
std::cout << duuu << std::endl;
std::cout << duuv << std::endl;
std::cout << duvv << std::endl;
std::cout << dvvv << std::endl;
int nu = 4, nv = 4;
std::cout << CylindricalSurface4.DN(1., 2., nu, nv) << std::endl;
获得类型
Type() 可以获得类型,如平面、球等。
std::cout << int(CylindricalSurface4.Type()) << std::endl;
封闭性、周期性
IsUClosed() 获得 u 方向的封闭性 ,IsUPeriodic() 获得 u 方向的周期性 ,IsVClosed() 获得 v 方向的封闭性 ,IsVPeriodic() 获得 v 方向的周期性。
std::cout << CylindricalSurface4.IsUClosed() << std::endl;
std::cout << CylindricalSurface4.IsUPeriodic() << std::endl;
std::cout << CylindricalSurface4.IsVClosed() << std::endl;
std::cout << CylindricalSurface4.IsVPeriodic() << std::endl;
反向
UReverse() 可以将 u 方向反向 ,VReverse() 可以将 v 方向反向。需要注意的是,反向后 u 方向和 v 方向的起始和结束参数不会改变,仅是坐标上发生改变。
std::cout << CylindricalSurface4.Value(CylindricalSurface4.FirstUParameter(), CylindricalSurface4.FirstVParameter()) << std::endl;
std::cout << CylindricalSurface4.Value(CylindricalSurface4.LastUParameter(), CylindricalSurface4.LastVParameter()) << std::endl;
CylindricalSurface4.UReverse();
CylindricalSurface4.VReverse();
std::cout << CylindricalSurface4.Value(CylindricalSurface4.FirstUParameter(), CylindricalSurface4.FirstVParameter()) << std::endl;
std::cout << CylindricalSurface4.Value(CylindricalSurface4.LastUParameter(), CylindricalSurface4.LastVParameter()) << std::endl;
另外 UReversedParameter(t) 计算参数 t 在 u 方向上的对称参数,VReversedParameter(t) 计算参数 t 在 v 方向上的对称参数。
std::cout << CylindricalSurface4.UReversedParameter(2.) << std::endl;
std::cout << CylindricalSurface4.VReversedParameter(2.) << std::endl;
等参线
UIso() 可以获得 u 等参线,即参数域上直线 u=u0 对应的空间曲线 ,VIso() 可以获得 v 等参线,即参数域上直线 v=v0 对应的空间曲线。
std::shared_ptr< AMCAX::Geom3Curve >uiso = CylindricalSurface4.UIso(2.);
std::shared_ptr< AMCAX::Geom3Curve >viso = CylindricalSurface4.VIso(2.);
对于上面这个示例,UIso 是一个平行于 Z 轴的直线,位于圆柱的侧面,VIso 是一个半径为 r=2.0 的圆,位于高度 v=2.0 处。
子类
Geom3Plane
Geom3Plane 是 3 维空间中的平面,其参数域为无穷大。平面可根据 AMCAX::Frame3 创建,Frame3 的 XOY 为平面,OZ 为平面法向。参数域 u 方向即 OX 方向,v 方向即 OY 方向,在 (u, v) = (0, 0) 处的三维空间点为 Frame3 的标架原点。
三维平面的类
定义 Geom3Plane.hpp:14
Class of making a face
定义 MakeFace.hpp:22
Geom3SphericalSurface
Geom3SphericalSurface 是 3 维空间中的球面,其参数域为 [0, 2pi) x [-pi/2, pi/2],参数意义为球的参数坐标。圆面可根据 AMCAX::Frame3 和半径创建。Frame3 的原点为球心,XOY 平面上的圆为等参线 v=0,x 正半轴和 z 轴张成的半平面上的半圆为等参线 u=0,ox 向 oy 旋转为 u 方向正向,-oz 向 oz 旋转为 v 方向正向。
三维球面的类
定义 Geom3SphericalSurface.hpp:14
Geom3CylindricalSurface
Geom3CylindricalSurface 是 3 维空间中的圆柱面(无限长),其参数域为 [0, 2pi) x [-∞, ∞],参数意义为圆柱的参数坐标。圆柱面可根据 AMCAX::Frame3 和半径创建,xoy 平面上的圆为等参线 v=0,ox 向 oy 旋转为 u 方向正向,z 方向为 v 方向正向,v 方向的改变与弧长的改变一致。
Geom3ConicalSurface
Geom3ConicalSurface 是 3 维空间中的圆锥面(无限长),其参数域为[0, 2pi) x [-∞, ∞]。圆锥面可根据 Frame3、xoy 平面圆的半径和半角创建,xoy 平面上的圆为等参线 v=0,ox 向 oy 旋转为 u 方向正向,v 方向为倾斜的直线,与 z 方向夹角为锐角的方向为正向,v 方向的改变与弧长的改变一致。
三维圆锥曲面的类
定义 Geom3ConicalSurface.hpp:14
Geom3ToroidalSurface
Geom3ToroidalSurface 是 3 维空间中的圆环面,其参数域为 [0, 2pi) x [0, 2pi)。圆环面可根据由 Frame3、大半径和小半径创建。xoy 平面上的标准圆为等参线 v=0,xoz 平面上的标准圆为等参线 u=0。
三维环形曲面的类
定义 Geom3ToroidalSurface.hpp:14
Geom3BezierSurface
Geom3BezierSurface 是 3 维空间中的 Bezier 曲面,其参数域为 [0,1]x[0,1]。Bezier 曲面可根据控制点、权重(可选)创建,在创建时,需要注意权重的数量必须与控制点的数量一致,如果所有权重相等(例如都为 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 是 3 维空间中的 BSpline 曲面,BSpline 曲面可根据控制点、节点向量、节点重数、曲线次数创建。在创建时,需要满足以下条件:UKnots 的长度 = UMultiplicities 的长度;VKnots 的长度 = VMultiplicities 的长度;sum(UMultiplicities) = Poles.Rows() + UDegree + 1;sum(VMultiplicities) = Poles.Cols() + VDegree + 1;节点向量必须是单调递增的,且每个节点的重数不能超过曲线的次数。
poles2(0, 0).SetCoord(0.0, 0.0, 0.0);
poles2(0, 1).SetCoord(0.666667, 1., 0.333333);
poles2(0, 2).SetCoord(-0.666667, 0., -0.333333);
poles2(0, 3).SetCoord(0.0, 1., 0.0);
poles2(1, 0).SetCoord(0.666667, 1., 0.333333);
poles2(1, 1).SetCoord(1.44444, 2.22222, 0.777778);
poles2(1, 2).SetCoord(-1.22222, 1.22222, 0.111111);
poles2(1, 3).SetCoord(-0.666667, 2., 0.333333);
poles2(2, 0).SetCoord(0.333333, 1., -0.333333);
poles2(2, 1).SetCoord(1.11111, 0.222222, 0.111111);
poles2(2, 2).SetCoord(2.44444, 3.22222, 0.777778);
poles2(2, 3).SetCoord(1.66667, 2., 0.333333);
poles2(3, 0).SetCoord(1., 0.0, 0.0);
poles2(3, 1).SetCoord(1.66667, -1., 0.333333);
poles2(3, 2).SetCoord(1.66667, 2., 0.333333);
poles2(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 };
std::shared_ptr<AMCAX::Geom3BSplineSurface> BSplineSurface = std::make_shared<AMCAX::Geom3BSplineSurface>(poles2, uknots, vknots, umults, vmults, 3, 3);
Geom3SurfaceOfExtrusion
Geom3SurfaceOfExtrusion 是 3 维空间中的挤出面(拉伸面)(无限大),挤出面可根据母线(Geom3Curve)和挤出方向创建,u 方向为母线的参数方向,v 方向为挤出反向,等参线 v=0 为母线,任一 u 等参线为直线。u 参数域为母线参数域,v 参数域为无穷。
std::shared_ptr<AMCAX::Geom3Curve> curve = std::make_shared<AMCAX::Geom3Circle>(
AMCAX::Frame3(), 1.0);
std::shared_ptr<AMCAX::Geom3SurfaceOfExtrusion> SurfaceOfExtrusion = std::make_shared<AMCAX::Geom3SurfaceOfExtrusion>(curve,
AMCAX::Direction3(0.0, 0.0, 1.0));
std::shared_ptr<AMCAX::Geom3TrimmedSurface> trimex = std::make_shared<AMCAX::Geom3TrimmedSurface>(SurfaceOfExtrusion, 0., 2*M_PI, 0., 5.);
Geom3SurfaceOfRevolution
Geom3SurfaceOfRevolution 是 3 维空间中的旋转面,旋转面可根据母线(Geom3Curve)和旋转轴创建,u 参数域为 [0, 2pi),v 参数域为母线参数域,每条 v 等参线是一个圆心在旋转轴上的圆,每条 u 等参线可以由母线绕轴旋转得到。
std::shared_ptr<AMCAX::Geom3Curve> curve2 = std::make_shared<AMCAX::Geom3Circle>(
AMCAX::Frame3(), 1.0);
std::shared_ptr<AMCAX::Geom3TrimmedCurve> trimCurve = std::make_shared<AMCAX::Geom3TrimmedCurve>(curve2, 0.0, M_PI/4);
std::shared_ptr<AMCAX::Geom3SurfaceOfRevolution> SurfaceOfRevolution = std::make_shared<AMCAX::Geom3SurfaceOfRevolution>(trimCurve, axis);
Geom3TrimmedSurface
Geom3TrimmedSurface 是 3 维空间中的裁剪曲面,由原曲面和裁剪参数构建。可以在 u 方向裁剪、v 方向裁剪或 uv 方向一起裁剪原曲面。如果想获取原曲面可通过 AMCAX::Geom3TrimmedSurface::BasisSurface 来实现。
std::shared_ptr<AMCAX::Geom3CylindricalSurface> CylindricalSurface2= std::make_shared< AMCAX::Geom3CylindricalSurface>(
AMCAX::Frame3(), 3.0);
std::shared_ptr<AMCAX::Geom3TrimmedSurface> TrimmedSurface = std::make_shared<AMCAX::Geom3TrimmedSurface>(CylindricalSurface2, 0., 5., false);
auto basis = TrimmedSurface->BasisSurface();
Geom3OffsetSurface
Geom3OffsetSurface 是 3 维空间中的偏移曲面,其用于将原曲面的每个点沿法向偏移一定距离。如果想获取原曲面可通过 AMCAX::Geom3OffsetSurface::BasisSurface 来实现。
std::shared_ptr<AMCAX::Geom3CylindricalSurface> CylindricalSurface3 = std::make_shared< AMCAX::Geom3CylindricalSurface>(
AMCAX::Frame3(), 2.0);
std::shared_ptr<AMCAX::Geom3TrimmedSurface> TrimmedSurface2 = std::make_shared<AMCAX::Geom3TrimmedSurface>(CylindricalSurface3, 0., 5., false);
std::shared_ptr<AMCAX::Geom3OffsetSurface> offsetsurface1 = std::make_shared<AMCAX::Geom3OffsetSurface>(TrimmedSurface2, 2.);
auto basis2 = offsetsurface1->BasisSurface();
如果想获取偏移后的等价曲面可通过 AMCAX::Geom3OffsetSurface::Surface 来实现,如球偏移后还是球,圆柱偏移后还是圆柱。
std::shared_ptr<AMCAX::Geom3Surface> offsetsurface2 = offs.Surface();
三维偏移曲面的类
定义 Geom3OffsetSurface.hpp:18
事实上,上述所有类型偏移后的曲面(平面、球、圆柱、圆锥、圆环、挤出面、旋转面、Bezier、BSpline )都可以用原曲面类型表示,但仅实现了裁剪或非裁剪的平面、圆柱、圆锥、球、圆环的等价曲面,其余会返回空指针。