乐于分享
好东西不私藏

【源码】坐标正反算

【源码】坐标正反算
;;;作者:XYY;;;时间:2026/6/1;;;坐标正反算主函数(defun C:zbzf(/ rec2p pol2r zfk pt1 pt2 pold polang polrad)  (setq rec2p(lambda(x y)(list(sqrt(+(* x x)(* y y)))(angle'(0 0)(list x y))))	pol2r(lambda(r a)(list(* r(cos a))(* r(sin a)))))  (setq zfk(getstring"\n坐标正算或[坐标反算(P)]: ")	pt1(cdr(reverse(getpoint(if(or(= zfk "P")(= zfk "p"))"\n指定第一点: ""\n指定基点: ")))))  (princ(strcat"N="(rtos(car pt1)2 3)",E="(rtos(cadr pt1)2 3)))  (if(or(= zfk "P")(= zfk "p"))    ;;;坐标反算    (progn    (setq pt2(cdr(reverse(getpoint"\n指定第二点: ")))	  pold(apply'rec2p(mapcar'- pt2 pt1)))    (princ(strcat"N="(rtos(car pt2)2 3)",E="(rtos(cadr pt2)2 3)))    (princ(strcat"\n两点距离: "(rtos(car pold)2 4)"m, 方位角: "(D_ms(cadr pold)))))    ;;;坐标正算    (progn    (setq polang(getreal"\n输入方位角(D.MS): ")	  polrad(getreal"\n输入长度(m): ")	  pt2(mapcar'+ pt1 (pol2r polrad(rad1 polang))))    (princ(strcat"\n方向点坐标: N="(rtos(car pt2)2 3)",E="(rtos(cadr pt2)2 3)))))  (entmake(list'(0 . "LINE")(cons 10(reverse pt1))(cons 11(reverse pt2))))  (entmake(list'(0 . "TEXT")(cons 1 "P1")(cons 10(reverse pt1))(cons 40 2)))  (entmake(list'(0 . "TEXT")(cons 1 "P2")(cons 10(reverse pt2))(cons 40 2)))  (princ))(prompt"\n*** 输入命令\"ZBZF\"进行坐标计算. ***")
已关注
关注
重播 分享
注:代码缺少的子函数功能: 
1. rad1:角度(D.ms)转为弧度,例(rad1 46.32185) 返回0.81225; 
2. d_ms:弧度转为DMS字符,例(D_ms 0.81225) 返回“ 46d32'18.5\" ”。 
读者自行完善上述函数,代码即可运行。