【二次开发】ObjectArx源码常用函数源码向量的用法


ObjectARX向量是几何计算的核心工具,主要用于表示方向、位移、旋转等操作。
1. 向量的基本概念与作用
-
向量(如 AcGeVector3d)表示三维空间中的方向和大小,不依赖坐标系原点。 -
常用于: -
计算两点间的相对位置 -
旋转、缩放、平移几何体 -
判断方向(如点在线段左侧还是右侧)
2. 常见向量操作
-
创建向量通过两点相减获得向量:
AcGeVector3d vec = ptB – ptA; // A → B 的向量
单位化(归一化)使用 .normalize() 将向量转为单位向量(长度为1):
AcGeVector3d unitVec = vec.normalize();
旋转向量绕指定轴旋转(如绕 Z 轴):
unitVec.rotateBy(angleInRadians, AcGeVector3d::kZAxis);
垂直向量获取与当前向量垂直的方向(用于偏移):
AcGeVector2d perpVec= vec.perpVector(); // 左侧逆时针90°
AcGeVector2d perpVecRight= perpVec.negate(); //右侧顺时针90°
判断平行或同向
isParallelTo():判断是否平行(含反向)
isCodirectionalTo():判断是否完全同向

求一圆的外切三角形的三个顶点坐标。
// cad x轴正方向为零度方向,逆时针为正
// centerPt为圆心坐标,radius为圆的半径,angle为三角形顶角偏移角度
AcGePoint3dArray GetCalculateVertexCoordinate
(const AcGePoint3d& centerPt,
double radius,double angle) {AcGePoint3d calculatePt;
calculatePt.x = centerPt.x+2*radius*cos(angle);
calculatePt.y = centerPt.y+2*radius*sin(angle);
calculatePt.z = centerPt.z;
AcGeVector3d vec(centerPt.x-calculatePt.x,centerPt.y-calculatePt.y,0); // 单位向量AcGeVector3d unitVec = vec.normalize() ;
AcGePoint3d calculatePt2;// 绕Z轴旋转// 以单位向量为基准,先偏移至最近计算的边// 求出一条边后,继续偏移,计算另一条unitVec.rotateBy(30*PI/180, AcGeVector3d::kZAxis); //AB间的向量=A~B点距离* AB间的向量的单位向量calculatePt2 = calculatePt + unitVec*sqrt((double)3)*2*radius;
AcGePoint3d calculatePt3;
unitVec.rotateBy(300*PI/180, AcGeVector3d::kZAxis);
calculatePt3 = calculatePt +unitVec*sqrt((double)3)*2*radius ;
AcGePoint3dArray array;
array.append(calculatePt);
array.append(calculatePt2);
array.append(calculatePt3);
return array;
}



求一圆的外切正方形的四个顶点坐标。
// cad x轴正方向为零度方向,逆时针为正
//centerPt为圆心坐标,
radius为圆的半径,
angle为正方形的第一个点的偏移角度
AcGePoint3dArray GetCalculateVertexZfx(
const AcGePoint3d& centerPt,
double radius,double angle){
AcGePoint3d ptA;ptA.x = centerPt.x + radius*sqrt((double)2) * cos(angle);ptA.y = centerPt.y + radius*sqrt((double)2) * sin(angle);ptA.z = centerPt.z;AcGeVector3d vec(centerPt.x-ptA.x, centerPt.y-ptA.y, 0);//// 单位向量AcGeVector3d unitVec = vec.normalize();//// 绕Z轴旋转// 以单位向量为基准,先偏移至最近计算的边// 求出一条边后,继续偏移,计算另一条unitVec.rotateBy( 45*PI/180, AcGeVector3d::kZAxis);
//// B点坐标 = A点坐标 + AB间的向量AcGePoint3d ptB;ptB = ptA + unitVec*2*radius;//C点坐标是和A点对称的,可以通过圆心算AcGePoint3d ptC;ptC.x = centerPt.x – radius*sqrt((double)2) * cos(angle);ptC.y = centerPt.y – radius*sqrt((double)2) * sin(angle);ptC.z = centerPt.z;//D点坐标可以通过向量 AB来旋转计算AcGePoint3d ptD;unitVec.rotateBy(-90*PI/180, AcGeVector3d::kZAxis);ptD = ptA+ unitVec*2*radius;AcGePoint3dArray array1;array1.append(ptA);array1.append(ptB);array1.append(ptC);array1.append(ptD);
return array1;}

1,向量如何确定方向?
向量就是一个坐标量的数值,向量本身与坐标系无关
2,向量normalize的作用
将向量正规化为单位向量
单位向量(unit vector): 范数为1的向量,若 v 为一非零向量,则
为一方向与 v 相同之单位向量,对一已知向量建构与其同向之单位元向量的程序称为向量正规化(normalization of a vector)
举例如下:
如果一个向量A取了normalize之后(设为A’),
点B+A’=点C,则点C和点B的距离为1
3,向量与距离的区别
两点间的向量不是两点间的距离:
A点坐标 + AB间的向量= B点坐标,
但是 A点坐标 + A~B点距离 ! = B点坐标,
但可以有AB间的向量=A~B点距离* AB间的向量的单位向量

原创文章版权归作者所有。本平台对转载的内容持中立观点,仅供读者参考,本平台将不承担任何责任。如文章图片涉及版权问题,请与我们联系,我们将在第一时间处理,谢谢!统赢PressCAD冲模绘图软件,面板背板专案设计软件,统赢慢丝编程,慢走丝加工技术,模具行业资讯,点关注 置顶公众号,更多精彩的内容等着你。
欢迎大家↓↓↓点好看和 分享 马上关注!
夜雨聆风