计算坐标方位角函数
;;计算坐标方位角函数;;(azimuth (getpoint) (getpoint))
;;返回从pt1到pt2的方位角弧度值
;;by 半边书生
(defun azimuth (pt1 pt2 / dxy fwj)
(setq dxy (mapcar '- pt2 pt1))
(setq fwj (atan (car dxy) (cadr dxy)))
(if (< fwj 0) (setq fwj (+ fwj (* 2 pi))))
fwj
)
跟angle有区别吗? 这是解密angle 本帖最后由 cchessbd 于 2022-10-15 23:20 编辑
wzg356 发表于 2020-11-11 21:49
这是解密angle
经过仔细核对,楼主的函数有误。(atan y x) 参数用反了。幸亏我发现了这个错误!下面贴出autocad 2006自带的atan函数英文说明。
atan
Returns the arctangent of a number in radians(atan num1 ) Argumentsnum1A number.num2A number.Return ValuesThe arctangent of num1, in radians, if only num1 is supplied. If you supply both num1 and num2 arguments, atan returns the arctangent of num1/num2, in radians. If num2 is zero, it returns an angle of plus or minus 1.570796 radians (+90 degrees or –90 degrees), depending on the sign of num1. The range of angles returned is −pi/2 to +pi/2 radians.ExamplesCommand: (atan 1) 0.785398Command: (atan 1.0) 0.785398Command: (atan 0.5) 0.463648Command: (atan 1.0) 0.785398Command: (atan -1.0) -0.785398Command: (atan 2.0 3.0) 0.588003Command: (atan 2.0 -3.0) 2.55359Command: (atan 1.0 0.0) 1.5708
将y x参数改过来后,实际上得到的是极坐标下与x轴夹角的角度。极坐标下的方位角有更简单的函数。
而且与地勘的方位角是2个概念,因为地勘是以北向为轴。
好了,不多说了,我还是再去搬砖吧,因为刚刚做了几十个错的地勘方位角。。。
本帖最后由 cchessbd 于 2022-10-17 12:51 编辑
注意以下几句话是错误的:
进一步排错发现,楼主太马虎了。
第三象限的角度肯定是错的,因为第三象限atan 返回正值,在闭区间(0,90°);此时x轴方位角正确区间为(180,270)。
第二象限应该也是错的。此时atan 返回负值,在闭区间(-90°,0),加上360后在(270,360);而此时正确区间(90,180)。
综上,大家不要用这个函数。用系统自带的angle就行。
本帖最后由 cchessbd 于 2022-10-17 12:49 编辑
cchessbd 发表于 2022-10-16 01:32
进一步排错发现,楼主太马虎了。
经过实际运行,楼主函数是对的,没有问题。但是很奇怪,我之前读的几十个方位角不对是什么问题?
经过对 atan 函数在cad里面的运行测试。搞明白了(atan x y)和(atan num)函数的不同。
获取角度函数有三个,(angel pt1 pt2),(atan num),(atan x y)
对点P(x,y),从第一象限顺时针转到第四象限时,(atan x y) 返回以Y轴和OP夹角弧度值,。此时北向方位角和返回值一致
对点P(x,y),从第二象限逆时针转到第三象限时,(atan x y) 返回以Y轴和OP夹角弧度值,(0,-pi)。此时北向方位角需加上2*pi。
所以(atan x y)返回值区间为(-pi,pi]。这和数学中atan函数以及帮助里面的说明不一样。
附带英文帮助说明:The range of angles returned is -pi/2 to +pi/2 radians.即(-pi/2,pi/2),这个是(atan num)的返回值。
而(angel pt1 pt2)返回极坐标角,即与X轴夹角。区间按第一二三四象限逆时针的话,为[0,2*pi)。
页:
[1]