【已解决,勿删】地勘中关于剖线方位角与倾角角度关系解法。
本帖最后由 cchessbd 于 2024-4-26 16:20 编辑最近几天思考了很久,也写了很多lisp函数和语句,但是不能完全得出正确结果,可能是以前数学没学好。只能发出来求助大家了,集思广益吧。
问题描述(此问题即为判断岩层是左倾还是右倾,理正勘察的算法,估计只有他自己看得懂哦^_^):
矢量OA,OB,定义从Y轴沿顺时针方向与OA、OB的夹角为a,b;a,b值均属于 [0,360)。
定义:变量flag,当OA,OB之间夹角θ,θ属于 [0,180) ,θ<90°时为1,其余时间为-1。
求flag用a,b 表示的解。可以分区间解。
当然如果有会用矢量求解的更好,但是我得想怎么把角度转换为矢量表示了,这个更头疼。。。
经过大家热烈的讨论,初步得到lisp的函数flagAB,还有斑斑大大的弧度版(部分解有问题),谢谢各位大大的热心指点。
一大早把括号变了下,仔细检查,昨晚一个字母没改到,flagAB应该是没问题了。
这个可以验证本人写的纯区间解,由于过于复杂就不贴了。期待有更简单纯a,b无sin cos的版本解。
(defun flagAB (a b)
(if (< 0 (+
(* (sin (* pi (/ a 180.0 ))) (sin (* pi (/ b 180.0 ))))
(* (cos (* pi (/ a 180.0 ))) (cos (* pi (/ b 180.0 ))))
))
1
-1
)
)
贴一些正确的测试值吧;
(flagAB 90 180);-1
(flagAB 90 185);-1
(flagAB 30 330);1
(flagAB 30 230);-1
(flagAB 30 280);-1
(flagAB 30 130);-1
下面是liuhe大侠的版本,这个更加简洁,综合来看我lisp写的有问题,我的遗漏了一些角度。这个应该OK。
(defun flag1 (a b)
(if (and (<=(abs (- a b)) 270)(>=(abs (- a b)) 90))
-1
1
)
)
贴一些正确的测试值吧;
(flag1 90 180);-1
(flag1 90 185);-1
(flag1 30 330);1
(flag1 30 230);-1
(flag1 30 280);-1
(flag1 30 130);-1
(flag1 80 350);-1
通过对比发现(flagAB 90 180) 值为1,就有点误差了,这应该是函数转换引起的计算误差。不过对于地勘来说这个角度差值为90,实际使用上还是没问题。
突然想到可以把OA,OB组合为一个整体,夹角为锐角,在OXY坐标系整体转动。这样的话就更形象了。
本帖最后由 cchessbd 于 2022-11-7 21:33 编辑
kkq0305 发表于 2022-11-7 21:06
设向量OA(x1,y1),向量OB(x2,y2) 则有flag是否小于90度与x1x2+y1y2的正负有关,x1x2+y1y2>0 flag
看不太懂额,大神,能解释一下吗?还有,从角度a,b,怎么得出 x1,x2,y1,y2呢?
哦,明白了,如果限定 向量OA(x1,y1),向量OB(x2,y2)在半径为1的圆周上,那 OA,OB夹角<90°就能从几何上得到,
[(x1-x2)^2+(y1-y2)^2]^1/2<2^1/2,可以得到x1x2+y1y2>0。
那得另外写个函数来转换a,b到 x1,x2,y1,y2了。感觉这个计算过程很复杂。
cchessbd 发表于 2022-11-7 21:58
可是a,b才是已知量,怎么得到x1,y1 x2,y2 呢?我感觉还得推导三角公式才行。好多年没用都交给老师了。
...
大致理解大大的思路了。OA=(list (cos a) (sin a)),这个应该是极坐标下的情况。
现在a,b为与y轴 顺时针夹角的情况下,那依照sin,cos函数的规律,应该是OA=(list (sin a) (cos a) ) 了。
好的,非常感谢以上几位大大的解答。读书就是向量这里没学好啊。 本帖最后由 cchessbd 于 2022-11-7 22:20 编辑
caoyin 发表于 2022-11-7 22:11
或者这样行不行?
(defun flag1 (a b)
(if (< (rem (+ (- a b) PI) PI) (/ PI 2))
谢谢,如果这个可以那就简单了,版主大大真是神人,无所不知!佩服佩服。
很遗憾,测试了下,这个不行
FLAG1
_$ (flag1 90 180)
1
_$ (flag1 91 180)
1
_$ (flag1 90 185)
1
_$ (flag1 30 340)
1
_$ (flag1 30 240)
1
_$
本帖最后由 kkq0305 于 2022-11-7 21:25 编辑
设向量OA(x1,y1),向量OB(x2,y2) 则有flag是否小于90度与x1x2+y1y2的正负有关,x1x2+y1y2>0 flag<90°
(defun slflag(x1 y1 x2 y2) (not (minusp (+ (* x1 x2) (* y1 y2)))))
本帖最后由 caoyin 于 2022-11-7 22:04 编辑
1.二楼的代码是向量点积的方法
2.角度和向量是一回事
角度a=(angle '(0 0) (list x1 y1))
或
角度a=(atan (/ y1 x1))
向量OA=(list (cos a) (sin a))即 x1=(cos a),y1=(sin a) 本帖最后由 cchessbd 于 2022-11-7 22:00 编辑
caoyin 发表于 2022-11-7 21:49
1.二楼的代码是向量点积的方法
2.角度和向量是一回事
角度a=(angle '(0 0) (list x1 y1))
可是a,b才是已知量,怎么得到x1,y1 x2,y2 呢?我感觉还得推导三角公式才行。好多年没用都交给老师了。
而且这个算来算去,肯定有误差影响。
是夹角还是到角?
cchessbd 发表于 2022-11-7 21:58
可是a,b才是已知量,怎么得到x1,y1 x2,y2 呢?我感觉还得推导三角公式才行。好多年没用都交给老师了。
...
或者这样行不行?
(defun flag1 (a b)
(if (< (rem (+ (- a b) PI) PI) (/ PI 2))
1
-1
)
) 本帖最后由 cchessbd 于 2022-11-7 22:41 编辑
cchessbd 发表于 2022-11-7 22:18
谢谢,如果这个可以那就简单了,版主大大真是神人,无所不知!佩服佩服。
很遗憾,测试了下,这个不行 ...
好的,有时间再测一下。得睡觉了,我写了一个函数,初步测了下,好像可以
页:
[1]
2