AMCAX Kernel
Geometry kernel for CAD/CAE/CAM
九韶内核 1.0.0.0
载入中...
搜索中...
未找到
几何基础

坐标

构建

使用默认构造函数会得到坐标原点,构建时需要输入浮点数。另外所有的几何都只支持输入浮点数,后续不再特殊说明。

Coord3(三维坐标)

AMCAX::Coord3 crd1(0.0, 0.0, 2.0);
Coord3d Coord3
三维坐标
定义 CoordT.hpp:2809

Coord2(二维坐标)

AMCAX::Coord2 crd2d(0.0,1.0);
Coord2d Coord2
二维坐标
定义 CoordT.hpp:2806

获取与更改

获取

获取坐标某一维度的值可以使用如下两种方法。

AMCAX::Coord3 crd(0.0, 1.0, 2.0);
double x = crd.X();
double y = crd.Y();
double z = crd.Z();
double x2 = crd[0];
double y2 = crd[1];
double z2 = crd[2];

更改

更改坐标某一维度的值可以使用如下两种方法。

AMCAX::Coord3 crd(0.0, 1.0, 2.0);
crd.SetXYZ(1.0, 0.0, 2.1);
crd.SetX(0.5);
crd.SetY(0.5);
crd.SetZ(0.5);

常用功能

运算

支持加减,数乘,内积,外积,另外也支持 == 和 !=。

加减

AMCAX::Coord3 crd1(2.0, 1.0, 2.0);
AMCAX::Coord3 crd2(0.2, 1.0, 1.0);
//+
AMCAX::Coord3 crd3 = crd1 + crd2;
//-
AMCAX::Coord3 crd4 = crd1 - crd2;

数乘

AMCAX::Coord3 crd5 = crd1 * 0.5;

内积

double t = crd1.Dot(crd2);

外积

AMCAX::Coord3 crd6 = crd1.Cross(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();

归一化

对坐标进行归一化有两种方式,一种不改变坐标本身,创建一个新的坐标,另一种则是直接改变坐标本身。

AMCAX::Coord3 crd2 = crd.Normalized();
//change
crd.Normalize();

输出与输入

我们内核支持对坐标进行输出<<,也支持输入>>。

输出

std::cout << crd1 << std::endl;

输入

std::istringstream is("0.0 1.0 2.0");
is >> crd7;

构建

使用默认构造函数会得到原点。可直接创建或者基于 Coord3/Coord2 构建。

Coord3(三维点)

AMCAX::Point3 p1(0.0, 1.0, 2.0);
AMCAX::Coord3 crd1(0.0, 1.0, 2.0);
AMCAX::Point3 p2(crd1);
PointT< double, 3 > Point3
三维点
定义 PointT.hpp:459

Coord2(二维点)

AMCAX::Point2 p3(0.0, 1.0);
AMCAX::Coord2 crd2(0.0, 1.0);
AMCAX::Point2 p4(crd2);
PointT< double, 2 > Point2
二维点
定义 PointT.hpp:456

获取与更改

获取

获取点某一维度的值可以使用如下两种方法。

AMCAX::Point3 p1(0.0, 1.0, 2.0);
double x = p1.X();
double y = p1.Y();
double z = p1.Z();
double x2 = p1[0];
double y2 = p2[1];
double z2 = p3[2];

更改

更改点某一维度的值可以使用如下两种方法。

AMCAX::Point3 p1(0.0, 1.0, 2.0);
p1.SetCoord(1.0, 0.0, 2.1);
p1.SetX(0.5);
p1.SetY(0.5);
p1.SetZ(0.5);

常用功能

运算

我们内核不支持对点做四则运算(加减乘除),事实上除 Coord 外,大部分几何都不支持四则运算,后续不再说明。但是如果需要对点做四则运算,可先获取点的 Coord ,然后再对 Coord 做运算。

AMCAX::Point3 p1(0.0, 1.0, 2.0);
AMCAX::Point3 p2(1.0, 2.0, 2.0);
const Coord3& crd3 = p1.Coord();
const Coord3& crd4 = p2.Coord();
const Coord3& crd5 = crd3 + crd4;
AMCAX::Point3 p3(crd5);

计算两点间的距离

AMCAX::Point3 p1(0.0, 1.0, 2.0);
AMCAX::Point3 p2(1.0, 2.0, 2.0);
double dis = p1.Distance(p2);

变换

大部分几何都支持变换,即平移、旋转、镜像,等比例放缩变换等,后续不再说明。

平移变换

AMCAX::TopoShape box = AMCAX::MakeBox(AMCAX::Point3(-5.0, -5.0, 0.0), AMCAX::Point3(5.0, 5.0, 3.0));
trans.SetTranslation(AMCAX::Vector3(1.0, 0.0, 0.0));
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
Class of transforming a shape
定义 TransformShape.hpp:12
constexpr void SetTranslation(const VectorT< OtherScalar, DIM > &vec) noexcept
设置变换为平移
定义 TransformationT.hpp:311
TransformationT< double, 3 > Transformation3
三维变换
定义 TransformationT.hpp:1102
VectorT< double, 3 > Vector3
三维向量
定义 VectorT.hpp:707

旋转变换

AMCAX::TopoShape box = AMCAX::MakeBox(AMCAX::Point3(-5.0, -5.0, 0.0), AMCAX::Point3(5.0, 5.0, 3.0));
trans.SetRotation(AMCAX::Axis3(), M_PI * 0.25);
void SetRotation(const PointT< OtherScalar, DIM > &point, const OtherScalar2 &angle) noexcept
设置变换为二维中绕点旋转某一角度
定义 TransformationT.hpp:138
AxisT< double, 3 > Axis3
三维轴
定义 AxisT.hpp:423

镜像变换

点镜像
AMCAX::TopoShape box = AMCAX::MakeBox(AMCAX::Point3(-5.0, -5.0, 0.0), AMCAX::Point3(5.0, 5.0, 3.0));
trans.SetMirror(AMCAX::Point3(10.,10.,10.));
constexpr void SetMirror(const PointT< OtherScalar, DIM > &point) noexcept
设置变换为通过点镜像
定义 TransformationT.hpp:89
轴镜像
AMCAX::TopoShape box = AMCAX::MakeBox(AMCAX::Point3(-5.0, -5.0, 0.0), AMCAX::Point3(5.0, 5.0, 3.0));
trans.SetMirror(AMCAX::Axis3(AMCAX::Point3(10.0, 20.0, 30.0), AMCAX::Direction3(0.0, 1.0, 1.0)));
DirectionT< double, 3 > Direction3
三维方向
定义 DirectionT.hpp:587
平面镜像
AMCAX::TopoShape box = AMCAX::MakeBox(AMCAX::Point3(-5.0, -5.0, 0.0), AMCAX::Point3(5.0, 5.0, 3.0));
trans.SetMirror(AMCAX::Frame3(AMCAX::Point3(10.0, 10.0, 10.0), AMCAX::Direction3(0.0, 0.0, 1.0)));
FrameT< double, 3 > Frame3
三维标架
定义 FrameT.hpp:885

等比例放缩变换

AMCAX::TopoShape box = AMCAX::MakeBox(AMCAX::Point3(-5.0, -5.0, 0.0), AMCAX::Point3(5.0, 5.0, 3.0));
trans.SetScale(AMCAX::Point3(), 0.5);
void SetScale(const PointT< OtherScalar, DIM > &point, const OtherScalar2 &s)
设置变换为按一个点进行缩放
定义 TransformationT.hpp:224

复合变换

复合变换的公式为sRx+b,其中,s为放缩因子,R为旋转矩阵,x为待变换的坐标,b为平移向量。

如构建如下变换:先绕x轴旋转pi/4,再缩放至0.2倍,最后沿x轴平移1个单位:

AMCAX::TopoShape box = AMCAX::MakeBox(AMCAX::Point3(-5.0, -5.0, 0.0), AMCAX::Point3(5.0, 5.0, 3.0));
trans.SetRotationPart(AMCAX::QuaternionT<double>(AMCAX::Coord3(1.0, 0.0, 0.0), M_PI * 0.25));
trans.SetScaleFactor(0.2);
trans.SetTranslationPart(AMCAX::Vector3(1.0, 0.0, 0.0));
四元数的类
定义 QuaternionT.hpp:19
void SetScaleFactor(const OtherScalar &s)
设置缩放因子
定义 TransformationT.hpp:376
constexpr void SetTranslationPart(const VectorT< OtherScalar, DIM > &vec) noexcept
设置变换中的平移部分
定义 TransformationT.hpp:337
void SetRotationPart(const QuaternionT< OtherScalar > &q) noexcept
设置三维中四元数变换的旋转部分
定义 TransformationT.hpp:176

将局部坐标系的物体变为全局坐标系(或另一坐标系)的变换

构建变换使得局部坐标系f2={O=(1,0,0), OZ=(1,1,0), OX=(0,0,1)}下的物体变换为全局坐标系下的物体:

AMCAX::Frame3 f2(AMCAX::Point3(1.0, 0.0, 0.0), AMCAX::Direction3(0.5, 0.5, 0.0), AMCAX::Direction3(0.0, 0.0, 1.0));
trans1.SetTransformation(f2, f1);
constexpr void SetTransformation(const AxisT< OtherScalar, DIM > &axisFrom, const AxisT< OtherScalar2, DIM > &axisTo) noexcept
设置变换为二维中两个局部坐标系之间的坐标变换
定义 TransformationT.hpp:254

将标架1平移、旋转到标架2的变换

构建变换使得全局坐标系的标架变换为另一标架f2={O=(1,0,0), OZ=(1,1,0), OX=(0,0,1)}:

AMCAX::Frame3 f2(AMCAX::Point3(1.0, 0.0, 0.0), AMCAX::Direction3(0.5, 0.5, 0.0), AMCAX::Direction3(0.0, 0.0, 1.0));
AMCAX::TopoShape box11 = AMCAX::MakeBox(f1, 2.0, 2.0, 2.0);
trans2.SetDisplacement(f1, f2);
AMCAX::TopoShape box12 = AMCAX::TransformShape(box11, trans2);
constexpr void SetDisplacement(const FrameT< OtherScalar, DIM > &frameFrom, const FrameT< OtherScalar2, DIM > &frameTo) noexcept
设置变换为三维中两个标架之间的变换
定义 TransformationT.hpp:239

变换的乘法

trans1 * trans2。即在trans2后再用trans1进行变换。

AMCAX::TopoShape box = AMCAX::MakeBox(AMCAX::Point3(-5.0, -5.0, 0.0), AMCAX::Point3(5.0, 5.0, 3.0));
trans11.SetScaleFactor(0.2);
trans22.SetMirror(AMCAX::Point3(10., 10., 10.));
AMCAX::TopoShape bbox = AMCAX::TransformShape(box, trans11*trans22);

向量与方向

Vector3 即数学上的向量,有方向有长度。Direction3 只有方向,其模长必须为 1.0。

构建

AMCAX::Vector3 vec; // (0.0,0.0,0.0)
AMCAX::Direction3 dir; // (1.0, 0.0, 0.0)
std::cout << vec << ' ' << dir << std::endl;
AMCAX::Vector3 vec1(0.1, 2.0, -3.3);
AMCAX::Direction3 dir1(0.1, 2.0, -3.3); // automatically normalized
std::cout << vec1 << ' ' << dir1 << std::endl;
AMCAX::Vector3 vec2(dir1);
AMCAX::Direction3 dir2(vec1);
std::cout << vec2 << ' ' << dir2 << std::endl;
AMCAX::Point3 p1(0.0, 0.0, 0.0);
AMCAX::Point3 p2(1.0, 0.0, 0.0);
AMCAX::Vector3 vec3(p1, p2); // build vector P1P2
std::cout << vec3 << std::endl;

获取与更改

与 Coord 类似,只不过 Direction 会自动归一化。

获取

获取向量/方向某一维度的值可以使用如下两种方法。

AMCAX::Vector3 vec; // (0.0,0.0,0.0)
AMCAX::Direction3 dir; // (1.0, 0.0, 0.0)
//vector
double x = vec.X();
double y = vec.Y();
double z = vec.Z();
double x2 = vec[0];
double y2 = vec[1];
double z2 = vec[2];
//direction
double x3 = dir.X();
double y3 = dir.Y();
double z3 = dir.Z();
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

更改

更改向量/方向某一维度的值可以使用如下两种方法。

//vector
vec.SetCoord(0.1, 2.0, -3.3);
vec.SetX(0.1);
vec.SetY(2.0);
vec.SetZ(-3.3);
//direction
dir.SetCoord(0.1, 2.0, -3.3);
dir.SetX(0.1);
dir.SetY(2.0);
dir.SetZ(-3.3);
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 类似。

加减

AMCAX::Vector3 vec1(0.1, 2.0, -3.3);
AMCAX::Vector3 vecc(2.1, 1.5, 2.3);
//+
AMCAX::Vector3 vecc1 = vecc + vec1;
//-
AMCAX::Vector3 vecc2 = vecc - vec1;

数乘

AMCAX::Vector3 vecc(2.1, 1.5, 2.3);
AMCAX::Vector3 vecc3 = vecc * 2.0;

内积

//vector
AMCAX::Vector3 vec1(0.1, 2.0, -3.3);
AMCAX::Vector3 vecc(2.1, 1.5, 2.3);
double t = vecc.Dot(vec1);
//direction
AMCAX::Direction3 dir1(0.1, 2.0, -3.3);
AMCAX::Direction3 dirr(2.3, 1.6, 1.3);
double t2 = dirr.Dot(dir1);

外积

//vector
AMCAX::Vector3 vec1(0.1, 2.0, -3.3);
AMCAX::Vector3 vecc(2.1, 1.5, 2.3);
AMCAX::Vector3 vecc4 = vecc.Cross(vec1);
//direction
AMCAX::Direction3 dir1(0.1, 2.0, -3.3);
AMCAX::Direction3 dirr(2.3, 1.6, 1.3);
AMCAX::Direction3 dirr2 = dirr.Cross(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()。可参考以下代码:

//vector
AMCAX::VectorT<double, 3> v1(1.0, 2.0, 3.0);
AMCAX::VectorT<double, 3> v2(-1.0, -2.0, -3.0);
AMCAX::VectorT<double, 3> v3(2.0, 4.0, 6.0);
//IsOpposite
bool op1 = v1.IsOpposite(v2, 0.1);
std::cout << op1 << std::endl;
//IsParallel
bool pa1 = v1.IsParallel(v3, 0.1);
std::cout << pa1 << std::endl;
//direction
AMCAX::DirectionT<double, 3> d1(1.0, 2.0, 3.0);
AMCAX::DirectionT<double, 3> d2(-1.0, -2.0, -3.0);
AMCAX::DirectionT<double, 3> d3(2.0, 4.0, 6.0);
//IsOpposite
bool op2 = d1.IsOpposite(d2,0.1);
std::cout << op2 << std::endl;
//IsParallel
bool pa2 = d1.IsParallel(d3, 0.1);
std::cout << pa2 << std::endl;
方向类,即单位向量
定义 VectorT.hpp:17
向量的模板类
定义 VectorT.hpp:30

Vector 可以计算其模长和对其进行归一化,与 Coord 类似。

模长

AMCAX::Vector3 vec1(0.1, 2.0, -3.3);
double length = vec1.Norm();

归一化

AMCAX::Vector3 vec1(0.1, 2.0, -3.3);
AMCAX::Vector3 vn = vec1.Normalized();
//change
vec1.Normalize();

Axis3 是三维空间中的轴,等价于一个 Point3 加一个 Direction3。构建方法如下:

AMCAX::Axis3 axis(p, dir);
//get
AMCAX::Point3 p1 = axis.Location();
AMCAX::Direction3 dir1 = axis.Direction();

此外内核支持计算轴的角度和模长。可参考以下代码:

AMCAX::Axis3 axis(p, dir);
AMCAX::Axis3 axis2(AMCAX::Point3(1.0, 2.0, 3.0), AMCAX::Direction3(0.0, 1.0, 1.0));
double angle = axis.Angle(axis2);

标架

定义

Frame3 是三维空间中的标架,即点和 3 个互相垂直的方向。

世界坐标系{O;x,y,z}就是一个常用的标架,也是 Frame3 默认构造函数的标架:

const AMCAX::Point3& p = frame.Location();
//get
const AMCAX::Direction3& x = frame.XDirection();
const AMCAX::Direction3& y = frame.YDirection();
const AMCAX::Direction3& z = frame.Direction();
AMCAX::Frame3 frame2(p, z, x);
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 方向一致就是右手系。

我们内核获取一个标架是否为右手系的方法是:

bool isRightHand = frame.IsDirect();
constexpr bool IsDirect() const noexcept
三维标架是否为右手标架
定义 FrameT.hpp:520

局部坐标系

标架可表示一个局部坐标系。局部坐标系的优势是可以将空间曲线曲面的构建简单化。

变换

主要有三种变换:从局部坐标系转换为全局坐标系、从一个局部坐标系转换到另一个局部坐标系、构建仿射变换使得一个标架(平移、旋转、镜像)变换为另一个标架,可参考上文变换部分的内容。

三维参数曲线

常见功能

获得参数范围

AMCAX::Geom3Curve::FirstParameter 用于获得曲线的起始参数, AMCAX::Geom3Curve::LastParameter 用于获得曲线的终止参数。

//1
std::vector<AMCAX::Point3> pts22 = {
AMCAX::Point3(0.5, 0.5,0.3),
AMCAX::Point3(1.0, 3.0,0.4),
AMCAX::Point3(3.0, 1.0,0.1),
AMCAX::Point3(3.8,2.0,0.6),
AMCAX::Point3(2.5,3.5,0.8),
AMCAX::Point3(1.0,0.5,0.9),
AMCAX::Point3(0.3,2.0,0.5)
};
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;//0,1
//2
std::shared_ptr< AMCAX::Geom3Parabola >parabola = p.Value();
AMCAX::Geom3TrimmedCurve trimcurve(parabola, -2.0, 2.0);
double fp2 = trimcurve.FirstParameter();
double lp2 = trimcurve.LastParameter();
std::cout << fp2 << "," << lp2 << std::endl;//-2,2
三维修剪曲线的类
定义 Geom3TrimmedCurve.hpp:12
构造三维几何抛物线的类
定义 MakeGeom3Parabola.hpp:13

求值和求导

AMCAX::Geom3Curve::ValueAMCAX::Geom3Curve::D0 用于求值,而 AMCAX::Geom3Curve::D1AMCAX::Geom3Curve::D2AMCAX::Geom3Curve::D3AMCAX::Geom3Curve::DN 用于求导。

//1
double t = 0.4 * (fp + lp);
AMCAX::Point3 p1 = bspline->Value(t);
AMCAX::Vector3 d1, d2, d3;
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;
AMCAX::Vector3 dn = bspline->DN(t, deriv);
//2
double t2 = 1.5;
AMCAX::Point3 p3 = trimcurve.Value(t2);
AMCAX::Vector3 dd1, dd2, dd3;
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::Vector3 ddn = trimcurve.DN(t2, deriv2);

获得类型

AMCAX::Geom3Curve::Type 用于获得曲线类型,如直线、圆、椭圆、抛物线等。曲线类型可参考枚举类 CurveType 。

std::cout << int(bspline->Type()) << ";" << int(trimcurve.Type());//7;8

封闭性、周期性

AMCAX::Geom3Curve::IsClosed 用于获得曲线的封闭性(起始点与终止点是同一个点), AMCAX::Geom3Curve::IsPeriodic 用于获得曲线的周期性。

std::cout <<bspline->IsClosed()<< ";" << bspline->IsPeriodic();//0;0
std::cout <<trimcurve.IsClosed()<< ";" << trimcurve.IsPeriodic();//0;0

反向

AMCAX::Geom3Curve::Reverse 用于将 Geom3Curve 反向,改变自身,而 AMCAX::Geom3Curve::Reversed 用于获取反向的 Geom3Curve,不改变自身。反转后,曲线的起点和终点发生了对换。对于一般曲线,曲线参数范围不变,而对于裁剪曲线,可能会改变曲线的参数范围。如以下例子,一条裁剪直线原来的参数范围为 -1 到 3,反转后变为 -3 到 1。

//1
//reversed
auto reverse = bspline->Reversed();
double fp3 = reverse->FirstParameter();
double lp3 = reverse->LastParameter();
std::cout << fp3 << "," << lp3 << std::endl;//0,1
std::cout << bspline->Value(fp) << std::endl;//0.5 0.5 0.3
std::cout << bspline->Value(lp) << std::endl;//0.3 2 0.5
std::cout<<reverse->Value(fp3)<<std::endl;//0.3 2 0.5
std::cout<<reverse->Value(lp3)<<std::endl;//0.5 0.5 0.3
//reverse
bspline->Reverse();
double fp4 = bspline->FirstParameter();
double lp4 = bspline->LastParameter();
std::cout << fp4 << "," << lp4 << std::endl;//0,1
std::cout << reverse->Value(fp4) << std::endl;//0.3 2 0.5
std::cout << reverse->Value(lp4) << std::endl;//0.5 0.5 0.3
//2
auto line2 = std::make_shared<AMCAX::Geom3Line>(AMCAX::Point3(0., 0., 0.), AMCAX::Direction3(1., 0., 0.));
auto trimline2 = std::make_shared<AMCAX::Geom3TrimmedCurve>(line2, -1.0, 3.0);
std::cout << trimline2->Value(-1.0) << std::endl;//-1 0 0
std::cout << trimline2->Value(3.0) << std::endl;//3 0 0
//reversed
auto reverse2 = trimline2->Reversed();
double fp5 = reverse2->FirstParameter();
double lp5 = reverse2->LastParameter();
std::cout << fp5 << "," << lp5 << std::endl;//-3,1
std::cout << reverse2->Value(fp5) << std::endl;//3 0 0
std::cout << reverse2->Value(lp5) << std::endl;//-1 0 0
//reverse
trimline2->Reverse();
double fp6 = trimline2->FirstParameter();
double lp6 = trimline2->LastParameter();
std::cout << fp6 << "," << lp6 << std::endl;//-3,1
std::cout << trimline2->Value(fp6) << std::endl;//3 0 0
std::cout <<trimline2->Value(lp6) << std::endl;//-1 0 0

在这里我们解释一下反转后,裁剪直线的参数范围变为 -3 到 1 的原因,这是因为裁剪曲线在反转的时候是先对其 basiscurve (无穷长的直线)做反转,然后再根据裁剪起始点和终止点的参数确定反转后的参数。

另外如果想计算某一参数的对称参数可通过 AMCAX::Geom3Curve::ReversedParameter 来实现。

std::cout << trimline->ReversedParameter(0.5) << std::endl;//-0.5

子类

Geom3Line

Geom3Line 是一条无限长的 3D 直线,由一个 Point3 和一个 Direction3 定义,在 Point3 处的参数为 0.0,沿 Direction3 方向参数为正,参数变化与长度变化一致。直线的参数域为无穷大。

auto line = std::make_shared<AMCAX::Geom3Line>(AMCAX::Point3(0., 1., 1.), AMCAX::Direction3(1., 2., 3.));
auto trimline = std::make_shared<AMCAX::Geom3TrimmedCurve>(line, 0.0, 1.0);
AMCAX::OCCTIO::OCCTTool::Write(AMCAX::MakeEdge(trimline), "trimline.brep");
Class of making an edge
定义 MakeEdge.hpp:24
static AMCAX_API bool Write(const TopoShape &s, std::ostream &os, int format=3)
Write a shape to a stream

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);
AMCAX::OCCTIO::OCCTTool::Write(AMCAX::MakeEdge(trimhyperbola), "trimhyperbola.brep");

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);
AMCAX::OCCTIO::OCCTTool::Write(AMCAX::MakeEdge(trimparabola), "trimparabola.brep");

Geom3BezierCurve

Geom3BezierCurve 是 3 维空间中的 Bezier 曲线,由控制点、权重(可选)定义。曲线的次数为控制点数量减一,例如,如果有 4 个控制点,则曲线是 3 次 Bezier 曲线。另外 Bezier 曲线的参数域为 [0,1],当参数 t=0 时,曲线位于起点(第一个控制点),当参数 t=1 时,曲线位于终点(最后一个控制点)。对于标准的贝塞尔曲线,其节点向量为 {0, 1},且每个节点的重数都是次数 + 1。

std::vector<AMCAX::Point3> pts3 = {
AMCAX::Point3(0.0, 0.0,0.0),
AMCAX::Point3(2.0, 2.0,2.0),
AMCAX::Point3(4.0, 3.0,5.0),
AMCAX::Point3(6.0,2.0,4.0)
};
auto bezier = std::make_shared<AMCAX::Geom3BezierCurve>(pts3);

Geom3BSplineCurve

Geom3BSplineCurve 是 3 维空间中的 BSpline 曲线,由控制点、节点向量、节点重数、权重(可选)定义。

std::vector<AMCAX::Point3> pts = {
AMCAX::Point3(0.5, 0.5,0.3),
AMCAX::Point3(1.0, 3.0,0.4),
AMCAX::Point3(3.0, 1.0,0.1),
AMCAX::Point3(3.8,2.0,0.6),
AMCAX::Point3(2.5,3.5,0.8),
AMCAX::Point3(1.0,0.5,0.9),
AMCAX::Point3(0.3,2.0,0.5)
};
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);
AMCAX::OCCTIO::OCCTTool::Write(AMCAX::MakeEdge(trimcircle2), "trimcircle2.brep");

Geom3OffsetCurve

Geom3OffsetCurve 是 3 维空间中的偏移曲线,由原曲线、偏移距离和参考方向组成。其作用为:将原曲线沿垂直于切向的一个方向偏移指定距离,偏移方向为切向和参考方向的外积方向,如下图所示。其中,蓝色箭头为切向,绿色箭头为参考方向,红色箭头为外积方向,即偏移方向。

以 xoy 平面的标准圆为例,当参考方向为 oz 时,偏移方向为向外。以下为偏移后的结果:

另外如果想获取偏移曲线的原曲线,可通过 AMCAX::Geom3OffsetCurve::BasisCurve 来获得。

auto circle2 = std::make_shared<AMCAX::Geom3Circle>(AMCAX::Frame3(), 2.0);
double offset = 1.5;
AMCAX::Direction3 direction(0.0, 0.0, 1.0);
auto circleoffset = std::make_shared<AMCAX::Geom3OffsetCurve>(circle2, offset, direction);
AMCAX::OCCTIO::OCCTTool::Write(AMCAX::MakeEdge(circleoffset), "circleoffset.brep");
auto basiscircle = circleoffset->BasisCurve();

二维参数曲线

常见功能

获得参数范围

AMCAX::Geom2Curve::FirstParameter 用于获得曲线的起始参数, AMCAX::Geom2Curve::LastParameter 用于获得曲线的终止参数。

//1
std::vector<AMCAX::Point2> pts22 = {
AMCAX::Point2(0.5, 0.5),
AMCAX::Point2(1.0, 3.0),
AMCAX::Point2(3.0, 1.0),
AMCAX::Point2(3.8,2.0),
AMCAX::Point2(2.5,3.5),
AMCAX::Point2(1.0,0.5),
AMCAX::Point2(0.3,2.0)
};
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;//0,1
//2
std::shared_ptr< AMCAX::Geom2Parabola >parabola2 = std::make_shared< AMCAX::Geom2Parabola>(AMCAX::Frame2(), 2.0);
AMCAX::Geom2TrimmedCurve trimcurve(parabola2, -2.0, 2.0);
double fp2 = trimcurve.FirstParameter();
double lp2 = trimcurve.LastParameter();
std::cout << fp2 << "," << lp2 << std::endl;//-2,2
二维修剪曲线的类
定义 Geom2TrimmedCurve.hpp:12
FrameT< double, 2 > Frame2
二维标架
定义 FrameT.hpp:882

求值和求导

AMCAX::Geom2Curve::ValueAMCAX::Geom2Curve::D0 用于求值,而 AMCAX::Geom2Curve::D1AMCAX::Geom2Curve::D2AMCAX::Geom2Curve::D3AMCAX::Geom2Curve::DN 用于求导。

//1
double t = 0.4 * (fp + lp);
AMCAX::Point2 p1 = bspline2->Value(t);
AMCAX::Vector2 d1, d2, d3;
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;
AMCAX::Vector2 dn = bspline2->DN(t, deriv);
//2
double t2 = 1.5;
AMCAX::Point2 p3 = trimcurve.Value(t2);
AMCAX::Vector2 dd1, dd2, dd3;
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::Vector2 ddn = trimcurve.DN(t2, deriv2);
VectorT< double, 2 > Vector2
二维向量
定义 VectorT.hpp:704

获得类型

AMCAX::Geom2Curve::Type 用于获得曲线类型,如直线、圆、椭圆、抛物线等。曲线类型可参考枚举类 CurveType 。

std::cout << int(bspline2->Type()) << ";" << int(trimcurve.Type());//7;8

封闭性、周期性

AMCAX::Geom2Curve::IsClosed 用于获得曲线的封闭性(起始点与终止点是同一个点), AMCAX::Geom2Curve::IsPeriodic 用于获得曲线的周期性。

std::cout <<bspline2->IsClosed()<< ";" << bspline2->IsPeriodic();//0;0
std::cout <<trimcurve.IsClosed()<< ";" << trimcurve.IsPeriodic();//0;0

反向

AMCAX::Geom2Curve::Reverse 用于将 Geom2Curve 反向,改变自身,而 AMCAX::Geom2Curve::Reversed 用于获取反向的 Geom2Curve,不改变自身。反转后,曲线的起点和终点发生了对换。对于一般曲线,曲线参数范围不变,而对于裁剪曲线,可能会改变曲线的参数范围。如以下例子,一条裁剪直线原来的参数范围为 -1 到 3,反转后变为 -3 到 1。

//1
std::vector<AMCAX::Point2> pts3 = {
AMCAX::Point2(0.0, 0.0),
AMCAX::Point2(2.0, 2.0),
AMCAX::Point2(4.0, 3.0),
};
auto bezier2 = std::make_shared<AMCAX::Geom2BezierCurve>(pts3);
std::cout << bezier2->FirstParameter() << std::endl;//0
std::cout << bezier2->LastParameter() << std::endl;//1
// reversed
auto reversebezier = bezier2->Reversed();
std::cout << reversebezier->FirstParameter() << std::endl;//0
std::cout << reversebezier->LastParameter() << std::endl;//1
std::cout << reversebezier->Value(0) << std::endl;//4 3
std::cout << reversebezier->Value(1) << std::endl;//0 0
//reverse
bezier2->Reverse();
std::cout << bezier2->FirstParameter() << std::endl;//0
std::cout << bezier2->LastParameter() << std::endl;//1
std::cout << bezier2->StartPoint() << std::endl;//4 3
std::cout << bezier2->EndPoint() << std::endl;//0 0
//2
auto line2 = std::make_shared<AMCAX::Geom2Line>(AMCAX::Point2(0., 0.), AMCAX::Direction2(1., 0.));
auto trimline2 = std::make_shared<AMCAX::Geom2TrimmedCurve>(line2, -1., 3.);
std::cout << trimline2->StartPoint() << std::endl;//-1 0
std::cout << trimline2->EndPoint()<< std::endl;//3 0
// reversed
auto reverseline = trimline2->Reversed();
std::cout << reverseline->FirstParameter() << std::endl;//-3
std::cout << reverseline->LastParameter() << std::endl;//1
std::cout << reverseline->Value(-3) << std::endl;//3 0
std::cout << reverseline->Value(1) << std::endl;//-1 0
//reverse
trimline2->Reverse();
std::cout << trimline2->FirstParameter() << std::endl;//-3
std::cout << trimline2->LastParameter() << std::endl;//1
std::cout << trimline2->StartPoint() << std::endl;//3 0
std::cout << trimline2->EndPoint() << std::endl;//-1 0
DirectionT< double, 2 > Direction2
二维方向
定义 DirectionT.hpp:584

在这里我们解释一下反转后,裁剪直线的参数范围变为 -3 到 1 的原因,这是因为裁剪曲线在反转的时候是先对其 basiscurve (无穷长的直线)做反转,然后再根据裁剪起始点和终止点的参数确定反转后的参数。

另外如果想计算某一参数的对称参数可通过 AMCAX::Geom2Curve::ReversedParameter 来实现。

std::cout<<trimline2->ReversedParameter(0.5)<<std::endl;//-0.5

子类

除了 Geom2OffsetCurve 外,其他均与三维类似。

Geom2Line

Geom2Line 是一条无限长的 2D 直线,由一个 Point2 和一个 Direction2 定义,在 Point2 处的参数为 0.0,沿 Direction2 方向参数为正,参数变化与长度变化一致。直线的参数域为无穷大。

auto line = std::make_shared<AMCAX::Geom2Line>(AMCAX::Point2(0., 1.), AMCAX::Direction2(1., 2.));
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);
AMCAX::Hyperbola2 otherbranch= hyperbola->OtherBranch();
AMCAX::OCCTIO::OCCTTool::Write(AMCAX::MakeEdge2d(trimhyperbola), "trimhyperbola.brep");
AMCAX::OCCTIO::OCCTTool::Write(AMCAX::MakeEdge2d(otherbranch,0.0,2.0), "otherbranch.brep");
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);
AMCAX::OCCTIO::OCCTTool::Write(AMCAX::MakeEdge2d(trimparabola), "trimparabola.brep");

Geom2BezierCurve

Geom2BezierCurve 是 2 维空间中的 Bezier 曲线,由控制点、权重(可选)定义。曲线的次数为控制点数量减一,例如,如果有 4 个控制点,则曲线是 3 次 Bezier 曲线。另外 Bezier 曲线的参数域为 [0,1],当参数 t=0 时,曲线位于起点(第一个控制点),当参数 t=1 时,曲线位于终点(最后一个控制点)。对于标准的贝塞尔曲线,其节点向量为 {0, 1},且每个节点的重数都是次数 + 1。

std::vector<AMCAX::Point2> pts = {
AMCAX::Point2(0.0, 0.0),
AMCAX::Point2(2.0, 2.0),
AMCAX::Point2(4.0, 3.0),
};
auto bezier = std::make_shared<AMCAX::Geom2BezierCurve>(pts);

Geom2BSplineCurve

Geom2BSplineCurve 是 2 维空间中的 BSpline 曲线,由控制点、节点、节点重数、曲线次数、权重(可选)定义。

std::vector<AMCAX::Point2> pts2 = {
AMCAX::Point2(0.5, 0.5),
AMCAX::Point2(1.0, 3.0),
AMCAX::Point2(3.0, 1.0),
AMCAX::Point2(3.8,2.0),
AMCAX::Point2(2.5,3.5),
AMCAX::Point2(1.0,0.5),
AMCAX::Point2(0.3,2.0)
};
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);
AMCAX::OCCTIO::OCCTTool::Write(AMCAX::MakeEdge2d(trimcircle2), "trimcircle2.brep");

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);
AMCAX::OCCTIO::OCCTTool::Write(AMCAX::MakeEdge2d(circleoffset), "circleoffset.brep");
auto basiscircle = circleoffset->BasisCurve();

三维参数曲面

常用功能

获得参数范围

Bounds() 获得全部参数,FirstUParameter() 获得起始 u 参数 ,LastUParameter() 获得结束 u 参数 ,FirstVParameter() 获得起始 v 参数 ,LastVParameter() 获得结束 v 参数。

AMCAX::Geom3CylindricalSurface CylindricalSurface4(AMCAX::Frame3(), 2.0);
double u1=0., u2=0., v1=0., v2=0.;
CylindricalSurface4.Bounds(u1, u2, v1, v2);
std::cout << u1 << "-" << u2 << std::endl;//0-6.28319
std::cout << v1 << "-" << v2 << std::endl;//-1e+100-1e+100
std::cout<<CylindricalSurface4.FirstUParameter()<<std::endl;//0
std::cout<<CylindricalSurface4.LastUParameter()<<std::endl;//6.28319
std::cout<<CylindricalSurface4.FirstVParameter()<<std::endl;//-1e+100
std::cout<<CylindricalSurface4.LastVParameter()<<std::endl;//1e+100
三维圆柱面的类
定义 Geom3CylindricalSurface.hpp:14

求值、求导

Value 或 D0 可以求值,D1,D2,D3,DN 可以求导。

AMCAX::Geom3CylindricalSurface CylindricalSurface4(AMCAX::Frame3(), 2.0);
//value D0
std::cout << CylindricalSurface4.Value(1., 2.) << std::endl;//1.0806 1.68294 2
CylindricalSurface4.D0(1., 2., p1);
std::cout << p1 << std::endl;//1.0806 1.68294 2
//D1
CylindricalSurface4.D1(1., 2., p2, du1, dv1);
std::cout << p2 << std::endl;//1.0806 1.68294 2
std::cout << du1 << std::endl;//-1.68294 1.0806 0
std::cout << dv1 << std::endl;//0 0 1
//D2
CylindricalSurface4.D2(1., 2., p3, du2, dv2,duu1,duv1,dvv1);
std::cout << p3 << std::endl;//1.0806 1.68294 2
std::cout << du2 << std::endl;//-1.68294 1.0806 0
std::cout << dv2 << std::endl;//0 0 1
std::cout << duu1 << std::endl;//-1.0806 -1.68294 -0
std::cout << duv1 << std::endl;//0 0 0
std::cout << dvv1 << std::endl;//0 0 0
//D3
CylindricalSurface4.D3(1., 2., p4, du3, dv3, duu2, duv2, dvv2,duuu,duuv,duvv,dvvv);
std::cout << p4 << std::endl;//1.0806 1.68294 2
std::cout << du3 << std::endl;//-1.68294 1.0806 0
std::cout << dv3 << std::endl;//0 0 1
std::cout << duu2 << std::endl;//-1.0806 -1.68294 -0
std::cout << duv2 << std::endl;//0 0 0
std::cout << dvv2 << std::endl;//0 0 0
std::cout << duuu << std::endl;//1.98294 -1.0806 0
std::cout << duuv << std::endl;//0 0 0
std::cout << duvv << std::endl;//0 0 0
std::cout << dvvv << std::endl;//0 0 0
//DN
int nu = 4, nv = 4;
std::cout << CylindricalSurface4.DN(1., 2., nu, nv) << std::endl;//0 0 0

获得类型

Type() 可以获得类型,如平面、球等。

std::cout << int(CylindricalSurface4.Type()) << std::endl;//2

封闭性、周期性

IsUClosed() 获得 u 方向的封闭性 ,IsUPeriodic() 获得 u 方向的周期性 ,IsVClosed() 获得 v 方向的封闭性 ,IsVPeriodic() 获得 v 方向的周期性。

std::cout << CylindricalSurface4.IsUClosed() << std::endl;//1
std::cout << CylindricalSurface4.IsUPeriodic() << std::endl;//1
std::cout << CylindricalSurface4.IsVClosed() << std::endl;//0
std::cout << CylindricalSurface4.IsVPeriodic() << std::endl;//0

反向

UReverse() 可以将 u 方向反向 ,VReverse() 可以将 v 方向反向。需要注意的是,反向后 u 方向和 v 方向的起始和结束参数不会改变,仅是坐标上发生改变。

std::cout << CylindricalSurface4.Value(CylindricalSurface4.FirstUParameter(), CylindricalSurface4.FirstVParameter()) << std::endl;// 2 0 -1e+100
std::cout << CylindricalSurface4.Value(CylindricalSurface4.LastUParameter(), CylindricalSurface4.LastVParameter()) << std::endl;//2 -4.89859e
CylindricalSurface4.UReverse();
CylindricalSurface4.VReverse();
std::cout << CylindricalSurface4.Value(CylindricalSurface4.FirstUParameter(), CylindricalSurface4.FirstVParameter()) << std::endl;//2 0 1e+100
std::cout << CylindricalSurface4.Value(CylindricalSurface4.LastUParameter(), CylindricalSurface4.LastVParameter()) << std::endl;//2 4.89859e-16 -1e+100

另外 UReversedParameter(t) 计算参数 t 在 u 方向上的对称参数,VReversedParameter(t) 计算参数 t 在 v 方向上的对称参数。

std::cout << CylindricalSurface4.UReversedParameter(2.) << std::endl;//4.28319
std::cout << CylindricalSurface4.VReversedParameter(2.) << std::endl;//-2

等参线

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 的标架原点。

AMCAX::Geom3Plane plane(frame);
AMCAX::OCCTIO::OCCTTool::Write(AMCAX::MakeFace(plane.GetPlane(), 0., 2., 0., 2.), "plane.brep");
三维平面的类
定义 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 方向正向。

AMCAX::OCCTIO::OCCTTool::Write(AMCAX::MakeFace(SphericalSurface.GetSphere(), 0., 1., 0., 1.), "SphericalSurface.brep");
三维球面的类
定义 Geom3SphericalSurface.hpp:14

Geom3CylindricalSurface

Geom3CylindricalSurface 是 3 维空间中的圆柱面(无限长),其参数域为 [0, 2pi) x [-∞, ∞],参数意义为圆柱的参数坐标。圆柱面可根据 AMCAX::Frame3 和半径创建,xoy 平面上的圆为等参线 v=0,ox 向 oy 旋转为 u 方向正向,z 方向为 v 方向正向,v 方向的改变与弧长的改变一致。

AMCAX::Geom3CylindricalSurface CylindricalSurface(AMCAX::Frame3(), 2.0);
AMCAX::OCCTIO::OCCTTool::Write(AMCAX::MakeFace(CylindricalSurface.GetCylinder(), 0., 2., 0., 2.), "CylindricalSurface.brep");

Geom3ConicalSurface

Geom3ConicalSurface 是 3 维空间中的圆锥面(无限长),其参数域为[0, 2pi) x [-∞, ∞]。圆锥面可根据 Frame3、xoy 平面圆的半径和半角创建,xoy 平面上的圆为等参线 v=0,ox 向 oy 旋转为 u 方向正向,v 方向为倾斜的直线,与 z 方向夹角为锐角的方向为正向,v 方向的改变与弧长的改变一致。

AMCAX::Geom3ConicalSurface ConicalSurface(AMCAX::Frame3(), 2.0, 45.0 * M_PI / 180.0);
AMCAX::OCCTIO::OCCTTool::Write(AMCAX::MakeFace(ConicalSurface.GetCone(), 0., 2., 0., 2.), "ConicalSurface.brep");
三维圆锥曲面的类
定义 Geom3ConicalSurface.hpp:14

Geom3ToroidalSurface

Geom3ToroidalSurface 是 3 维空间中的圆环面,其参数域为 [0, 2pi) x [0, 2pi)。圆环面可根据由 Frame3、大半径和小半径创建。xoy 平面上的标准圆为等参线 v=0,xoz 平面上的标准圆为等参线 u=0。

AMCAX::Geom3ToroidalSurface ToroidalSurface(AMCAX::Frame3(), 2.0, 1.0);
AMCAX::OCCTIO::OCCTTool::Write(AMCAX::MakeFace(ToroidalSurface.GetTorus(), 0., 2., 0., 2.), "ToroidalSurface.brep");
三维环形曲面的类
定义 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);
AMCAX::Array2<double> weights(4, 4);
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);
二维数组模板类
定义 Array2.hpp:17
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 等参线可以由母线绕轴旋转得到。

AMCAX::Direction3 dir(1.0, 0.0, 0.0);
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);
AMCAX::Axis3 axis(p, dir);
std::shared_ptr<AMCAX::Geom3SurfaceOfRevolution> SurfaceOfRevolution = std::make_shared<AMCAX::Geom3SurfaceOfRevolution>(trimCurve, axis);
AMCAX::OCCTIO::OCCTTool::Write(AMCAX::MakeFace(SurfaceOfRevolution, AMCAX::Precision::Confusion()), "SurfaceOfRevolution.brep");

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);
AMCAX::OCCTIO::OCCTTool::Write(AMCAX::MakeFace(TrimmedSurface2, AMCAX::Precision::Confusion()), "TrimmedSurface2.brep");
std::shared_ptr<AMCAX::Geom3OffsetSurface> offsetsurface1 = std::make_shared<AMCAX::Geom3OffsetSurface>(TrimmedSurface2, 2.);
auto basis2 = offsetsurface1->BasisSurface();

如果想获取偏移后的等价曲面可通过 AMCAX::Geom3OffsetSurface::Surface 来实现,如球偏移后还是球,圆柱偏移后还是圆柱。

AMCAX::Geom3OffsetSurface offs(TrimmedSurface2, 2.);
std::shared_ptr<AMCAX::Geom3Surface> offsetsurface2 = offs.Surface();
三维偏移曲面的类
定义 Geom3OffsetSurface.hpp:18

事实上,上述所有类型偏移后的曲面(平面、球、圆柱、圆锥、圆环、挤出面、旋转面、Bezier、BSpline )都可以用原曲面类型表示,但仅实现了裁剪或非裁剪的平面、圆柱、圆锥、球、圆环的等价曲面,其余会返回空指针。