明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1053|回复: 19

[提问] 【已解决,勿删】地勘中关于剖线方位角与倾角角度关系解法。

[复制链接]
发表于 2022-11-7 20:10:36 | 显示全部楼层 |阅读模式
本帖最后由 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坐标系整体转动。这样的话就更形象了。









 楼主| 发表于 2022-11-7 21:22:32 | 显示全部楼层
本帖最后由 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了。感觉这个计算过程很复杂。

 楼主| 发表于 2022-11-7 22:16:40 | 显示全部楼层
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) ) 了。
好的,非常感谢以上几位大大的解答。读书就是向量这里没学好啊。

点评

OA=(list (cos a) (sin a)) 即 x1=(cos a),y1=(sin a)顺序应该没错  发表于 2022-11-7 22:28
 楼主| 发表于 2022-11-7 22:18:20 | 显示全部楼层
本帖最后由 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
_$

点评

角度为弧度  发表于 2022-11-7 22:27
发表于 2022-11-7 21:06:23 | 显示全部楼层
本帖最后由 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)))))

点评

谢谢您!  发表于 2022-11-8 08:19
发表于 2022-11-7 21:49:58 | 显示全部楼层
本帖最后由 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)

点评

谢谢您!坐标确定是 (sin a),(cos a),而不是(cos a),(sin a)  发表于 2022-11-8 08:20
 楼主| 发表于 2022-11-7 21:58:40 | 显示全部楼层
本帖最后由 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 呢?我感觉还得推导三角公式才行。好多年没用都交给老师了。
而且这个算来算去,肯定有误差影响。

点评

向量OA=(list (cos a) (sin a))  发表于 2022-11-7 22:03
发表于 2022-11-7 22:08:18 | 显示全部楼层
是夹角还是到角?
发表于 2022-11-7 22:11:07 | 显示全部楼层
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
   )
)
 楼主| 发表于 2022-11-7 22:33:54 | 显示全部楼层
本帖最后由 cchessbd 于 2022-11-7 22:41 编辑
cchessbd 发表于 2022-11-7 22:18
谢谢,如果这个可以那就简单了,版主大大真是神人,无所不知!佩服佩服。

很遗憾,测试了下,这个不行 ...

好的,有时间再测一下。得睡觉了,我写了一个函数,初步测了下,好像可以

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-16 00:55 , Processed in 0.178275 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表