ATAN2是一个函数,在C 语言里返回的是指方位角,C 语言中atan2的函数原型为 double atan2(double y, double x) ,返回以弧度表示的 y/x 的反正切。y 和 x 的值的符号决定了正确的象限。也可以理解为计算复数 x+yi 的辐角,计算时atan2 比 ATAN稳定(如:ATAN(y/x),当 y 远远大于 x 时,计算结果是不稳定的。ATAN2(y,x)的做法:当 x 的绝对值比 y 的绝对值大时使用 ATAN(y/x);反之使用 ATAN(x/y)。这样就保证了数值稳定性。)
ATAN2(x,y)返回的是原点至点(x,y)的方位角。返回值的单位为弧度,取值范围为(-π,π】
DMIS5.2标准如下:
tan()正切函数,求某个角的正切值
在直角三角形 ABC 中(其中角 C 为 90°),角 A 的正切就是它的对边长度和临边长度的比值,如下图所示,tanA = a / b。
1.ATAN2(y,x)反正切函数,atan(y/x) 的增强版,能确定象限.
ATAN2(y,x) 函数的功能是求 y/x 的反正切值。ATAN2(y,x)是ATAN(y/x) 的增强版,能够确定角度所在的象限。
反正切函数 ATAN2(y,x)和正切函数 tan() 的功能恰好相反:tan() 是已知一个角的弧度值,求该角的正切值;而ATAN2(y,x)是已知一个角的正切值(也就是 y/x),求该角的弧度值。
2.参数
(1)Y表示位于 Y 轴上的值。
(2)X表示位于 X 轴上的值。
注意,x 和 y 同时为 0 时将导致域错误,因为此时的角度是不存在的,或者说是没有意义的。
3.返回值
ATAN2函数返回的是原点至点(x,y)的方位角,即与 x 轴的夹角。也可以理解为复数 x+yi 的辐角。返回值的单位为弧度,取值范围为(-π,π】
返回 y/x 的反正切值,以弧度表示,取值范围为(-π,π]。如上图所示,tan(θ) = y/x,θ = atan2(y, x)。
当 (x, y) 在象限中时:
当 (x, y) 在第一象限,0 < θ < π/2
当 (x, y) 在第二象限,π/2 < θ ≤ π
当 (x, y) 在第三象限,-π < θ < -π/2
当 (x, y) 在第四象限,-π/2 < θ < 0
当 (x, y) 在象限的边界(也就是坐标轴)上时:
当 y 是 0,且 x 为非负值,θ = 0
当 y 是 0,且 x 是负值,θ = π
当 y 是正值,且 x 是 0,θ = π/2
当 y 是负值,且 x 是 0,θ = -π/2
由此可知,一般情况下用 atan() 即可,当对所求出角度的象限有特殊要求时,应使用 atan2()。
小知识:ATAN(Y/X)反正切函数,求反正切值
atan() 函数的功能是求反正切值。
反正切函数 atan() 和正切函数 tan() 的功能正好相反。tan() 是已知一个角的弧度值 x,求该角的正切值 y;而 atan() 是已知一个角的正切值 y,求该角的弧度值 x。
正切值为 x 的角的度数,以弧度表示,区间为(-π/2, π/2)。
注意:atan() 并不能确定角度所在的象限,例如求得的度数是 45°,并不能说明是第一象限的角度,还有可能是第三象限的角度。如果想进一步确定角度所在的象限,请使用 atan2()。
4.角度和弧度
度和弧度都是衡量角的大小的单位,就像米(m)和英寸(in)都是用来衡量长度的单位。度用°来表示,弧度用rad表示。
度和弧度之间可以相互转换,转换规则为:
1rad = (180/π)° ≈ 57.3°
1° = (π/180)rad ≈ 0.01745rad
示例
求 90° 角的弧度值:
90 × (π/180) = π/2(rad)
弧度的定义
在一个圆中,弧长等于半径的弧,其所对的圆心角就是 1rad。也就是说,两条射线从圆心向圆周射出,形成一个夹角和夹角正对的一段弧。当这段弧的长度正好等于圆的半径时,两条射线的夹角的弧度为 1。
根据定义,圆一周的弧度数为 2πr/r = 2π,360° = 2πrad,平角(即 180° 角)为 πrad,直角为 π/2rad。
在具体计算中,角度以弧度给出时,通常不写弧度单位,直接写值。最典型的例子是三角函数,例如sin(8π)、tan(3π/2)。
说明:
在数学坐标系中,结果为正表示从 X 轴逆时针旋转的角度,结果为负表示从 X 轴顺时针旋转的角度。
ATAN2(y, x) 与 ATAN(y/x)稍有不同,ATAN2(y,x)的取值范围介于 -pi 到 pi 之间(不包括 -pi),
而ATAN(y/x)的取值范围介于-pi/2到pi/2之间(不包括±pi/2)。
若要用度表示反正切值,请将结果再乘以 180/3.14159。
另外要注意的是,函数atan2(y,x)中参数的顺序是倒置的,atan2(y,x)计算的值相当于点(x,y)的角度值。
6.RationalDMIS 7.1旋转坐标系(自动计算旋转角度(三角函数功能))
测量一件零件之前,必须先分析图纸,使用零件的基准特征来建立零件坐标系。
建立零件坐标系有三个作用:准确测量二维和一维元素,二是方便进行尺寸评价,三是实现批量自动测量。
在测量过程中,我们往往需要利用的基准建立坐标系来评价公差,进行辅助测量,指定零件位置等,这个坐标系称为“零件坐标系”。建立零件坐标系要根据零件图纸指定的A,B,C基准的顺序指定第一轴,第二轴和坐标零点,顺序不能颠倒。
在实际应用中,根据零件在设计,加工时的基准特征情况,可以选择3-2-1法(面——线——点法),三点拟合坐标系,2点偏移队列坐标系,多点拟合坐标系,迭代对齐坐标系,合并坐标系。
手动采集元素构建坐标系,为了告诉测量机工件的位置。在手动坐标系之后,我们需要更改模式为程序模式,创建自动程序(自动程序是可以自动执行的),自动坐标系是为了加强坐标系的精度。精建坐标系时。不必与手动建坐标系完全一样,但必须按照图纸要求进行操作。
(1)采集第一基准元素——找正第一轴向
建立(找正)第一轴必须用平面或轴线。
关于第一轴向元素选择:平面,圆柱,圆锥,3D直线(台阶圆柱)
圆柱和圆锥可以被认为是轴,用于指定方向。球和圆可以被认为是点,用于定义位置。平面的方向由其法向矢量决定。
一般情况下,如果设计图上没有特别指定构建坐标系的方法,而且几何公差和尺寸也没有参照物,那么就用最好的工作表面作为主要的基准方向,该面应该尽可能的大,或者使用一个圆柱转轴,如果它作为基准足够长。
坐标系的第一轴为了能够与第二轴垂直,一般采用平面,因为平面的法向矢量与平面肯定是垂直的。如果第一轴采用圆柱轴线定义,则同时确定了与其相垂直的坐标平面。
(2)采集BC基准两圆孔,构造直线(最佳拟合)。
(3)3-2-1法建立零件坐标系
(4)旋转坐标系
旋转角度正负——右手定则
当图纸求坐标系需要做旋转时,使用的方法分别有两种方式。
(1)通过输入图纸上的角度进行旋转,这个角度可以通过正切函数计算(计算机计算器或者手机计算器)。
(2)自动计算旋转角度——推荐(山涧果子)
通过输入X,Y坐标值,使用高级功能(RTOD(),ATAN2(Y,X)三角函数的计算方式),将夹角计算出来
ATAN2(x,y):计算x/y的反正切值,单位:弧度
RTOD(x):将弧度值转换成度
夹角:ATAN2(80,60)*180/π或RTOD(ATAN2(80,60))
由于 ATAN2(Y,X) 函数的参数是弧度,所以在坐标系旋转时,需要先将 弧度值转换为角度值。 ——RTOD(ATAN2(Y,X))或ATAN2(Y,X)*180/π
RationalDMIS7.1内部函数功能列表:
拓展知识:
关于一个平面两个偏置圆,第二轴向时旋转角度好还是偏置直线好?
我认为按理论来说这两种方法是一致的。但是在用户使用过程中发现是有区别的。直接按理论角度旋转坐标系的方向很稳定。但是构造偏置线的方法时只使用这个圆心点到直线的距离,没有考虑两圆心点之间的距离,当两圆心点变化时,造成偏置线角度的变化。这是坐标系不稳定的原因之一。
建议大家最好从图纸提供的理论值中,计算出要偏置的角度,每次使用两圆心找正旋转轴后,偏置这个理论角度。这会使坐标系与两孔的位置无关。
$$/* Header
DMISMN/'Created by [山涧果子] on Saturday, November 23, 2019', 4.0
UNITS/MM, ANGDEC, MMPS
WKPLAN/XYPLAN
PRCOMP/ON
TECOMP/ON
FLY/1.0000
MODE/MAN
SNSET/APPRCH, 2.0000
SNSET/RETRCT, 2.0000
SNSET/DEPTH, 0.0000
SNSET/SEARCH, 10.0000
SNSET/CLRSRF, 10.0000
RECALL/D(MCS)
SNSLCT/S(21-2)
GEOALG/BF, LSTSQR
GEOALG/ANGLB, DEFALT
GEOALG/CIRCLE, LSTSQR
GEOALG/ARC, LSTSQR
GEOALG/PLANE, LSTSQR
$$
$$
$$*/
MODE/MAN
F(PLN1)=FEAT/PLANE,CART,35.2867,37.7873,0.0000,-0.0000,0.0000,1.0000
$$ Measurement points are created through actual points
MEAS/PLANE, F(PLN1), 4
PTMEAS/CART, -24.3514, 92.1369, -0.0000, -0.0000, 0.0000, 1.0000
PTMEAS/CART, -24.9065, -10.2913, -0.0000, -0.0000, 0.0000, 1.0000
PTMEAS/CART, 94.7980, -20.6403, 0.0000, -0.0000, 0.0000, 1.0000
PTMEAS/CART, 95.6068, 89.9439, -0.0000, -0.0000, 0.0000, 1.0000
ENDMES
D(CRD1) = DATSET/FA(PLN1), ZDIR
F(CIR1)=FEAT/CIRCLE,INNER,CART,0.0000,0.0000,-5.3727,0.0000,0.0000,1.0000, 10.0000
$$ Measurement points are created through actual points
MEAS/CIRCLE, F(CIR1), 4
PTMEAS/CART, -2.6091, 4.2653, -5.3727, 0.5218, -0.8531, -0.0000
PTMEAS/CART, 4.9604, 0.6281, -5.3727, -0.9921, -0.1256, -0.0000
PTMEAS/CART, -0.1224, -4.9985, -5.3727, 0.0245, 0.9997, -0.0000
PTMEAS/CART, -2.0506, -4.5602, -5.3727, 0.4101, 0.9120, -0.0000
ENDMES
F(CIR2)=FEAT/CIRCLE,INNER,CART,60.0000,80.0000,-3.7877,0.0000,0.0000,1.0000, 10.0000
$$ Measurement points are created through actual points
MEAS/CIRCLE, F(CIR2), 4
PTMEAS/CART, 58.1471, 84.6440, -3.7877, 0.3706, -0.9288, -0.0000
PTMEAS/CART, 62.8181, 84.1302, -3.7877, -0.5636, -0.8260, -0.0000
PTMEAS/CART, 60.3429, 75.0118, -3.7877, -0.0686, 0.9976, -0.0000
PTMEAS/CART, 57.6742, 75.5739, -3.7877, 0.4652, 0.8852, -0.0000
ENDMES
$$ CREATED BY : External-Array Software, Inc
$$ DATE : Jan 19, 2009
$$ DISLAIMER:
$$ This Macro has been tested internally but not been tested with
$$ other DMIS compatible software. This Macro is provided as sample
$$ and can be modifed for your own use. External-Array doesn't not
$$ guarantee the quality of this Macro.
$$ FUNCION: Create a nominal line using two actual features
$$ DI, DJ, DK are the normal vector of the plane that the line lies on
M(EASI_2PT_TO_LINE) = Macro/'FEAT1', 'FEAT2', 'FEATLINE', DI, DJ, DK
DECL/LOCAL,DOUBLE,DVALUE[6]
DECL/LOCAL,INTGR, INDEX1, INDEX2
CALL/M(EASI_GETX_INDEX), FEAT1, INDEX1
CALL/M(EASI_GETX_INDEX), FEAT2, INDEX2
DVALUE[1] = OBTAIN/FA(@FEAT1),INDEX1
DVALUE[2] = OBTAIN/FA(@FEAT1),INDEX1+1
DVALUE[3] = OBTAIN/FA(@FEAT1),INDEX1+2
DVALUE[4] = OBTAIN/FA(@FEAT2),INDEX2
DVALUE[5] = OBTAIN/FA(@FEAT2),INDEX2+1
DVALUE[6] = OBTAIN/FA(@FEAT2),INDEX2+2
F(@FEATLINE) = FEAT/LINE,BND,CART,DVALUE[1],DVALUE[2],DVALUE[3],$
DVALUE[4],DVALUE[5],DVALUE[6],$
DI, DJ, DK
ENDMAC
CALL/M(EASI_2PT_TO_LINE),(CIR1),(CIR2),(LN_BF1), 0.0000, 0.0000, 1.0000
CONST/LINE,F(LN_BF1),BF,FA(CIR1),FA(CIR2)
D(CRD2) = DATSET/FA(PLN1), ZDIR, ZORIG, FA(LN_BF1), XDIR, FA(CIR1), XORIG
D(CRD2) = TRANS/ZORIG, -0, YORIG, FA(CIR1), XORIG, -0
D(CRD3) = ROTATE/ZAXIS, -RTOD(ATAN2(80,60))