乐于分享
好东西不私藏

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

【二次开发】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间的向量=AB点距离* 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点坐标 + AB点距离 ! = B点坐标,

但可以有AB间的向量=AB点距离* AB间的向量的单位向量


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

迎大家↓↓↓点好看和 分享         马上关注!

评论处请大家帮忙补充文章或者解释不对或欠缺的地方,这样下一个看到的人会学到更多,你知道的正是大家需要的。。。