Project1

标题: 求一个计算角度的算式。 [打印本页]

作者: 芯☆淡茹水    时间: 2018-4-5 20:18
标题: 求一个计算角度的算式。
本帖最后由 芯☆淡茹水 于 2018-4-5 20:44 编辑

    咳~,本人的数学是体育老师教的.....,以前学的各X函数已经忘得差不多了。

最近想实现一个功能,遇到一个难题:

如下图:
已知两点 A 和 B ,以及其坐标 A(x1,y1) , B(X2,Y2)  ,以正上方(12点方向)为 0 度,顺时针,求图中 ? 号的角度。
也就是 A 面向 B 时,以12点方向为基准, A 的角度。 当然 B 也可能在 360 度的任意位置。




例如比较简单的: x2 > x1 and y2 == y1  , 那么此时是 90 度。
作者: 文雅夕露    时间: 2018-4-5 20:34
图中?号的角度不是120度吗?
好像是三角函数得知的。
其实我是在胡扯的。
作者: 灯笼菜刀王    时间: 2018-4-5 21:06
本帖最后由 灯笼菜刀王 于 2018-4-5 21:11 编辑

咱的数学也基本忘光了(←那你进来干嘛?)

不过俗话说的好,学习差的学生都会耍点小手段=3=

咱提供下想法,看看能不能有帮助

因为不管B怎么移动,只要是二次元,它一定会处于直角坐标系里, 把A点当原点,先用两点的XY判断B的位置,这样把360度的范围缩小到45度, X相当就是360度或者180度,Y相等就是90度或者270度,(X1-X2).abs == (Y1-Y2).abs 就是45度,135度, 225度,315度

然后,用A的X和B的Y当做0,(或者相反) ,这样就画出一个直角三角形了, 也能得到 两个直角边的具体数值, 即另外的那个非0的坐标

已知直角三角形的两个直角边, 求另外两个角的角度(怎么搞忘记了,tan的用法),  

再根据前面B在A直角坐标系里的位置,加上相应的整数角度就OK了不是么?
作者: 失落的乐章    时间: 2018-4-5 21:11
本帖最后由 失落的乐章 于 2018-4-5 22:30 编辑

直角三角形的第三点为 C(x1, y2)
AC = |y1 - y2|
BC = |x1 - x2|
∠BAC = arctan(BC / AC)

B 在 A 的右下方时,所求的角 = 180° - ∠BAC;
B 在 A 的右上方时,所求的角 = ∠BAC;
B 在 A 的左上方时,所求的角 = 360° - ∠BAC;
B 在 A 的左下方时,所求的角 = 180° + ∠BAC.
(数学水平不行,应该有更简便的方法。借回答这个问题的机会回忆了一下多年前学的数学知识,只能想起这么多了……)
作者: 刀光渴    时间: 2018-4-5 21:13
?=arctan(x2-x1/y2-y1)  【 y2=y1 时?=90 】
大概是这样吧。。。
但是不懂程序
作者: guoxiaomi    时间: 2018-4-5 21:49
敲黑板,求角度要用 Math.atan2(y, x) 返回值是 -PI ~ +PI
  1. x, y = x1-x2, y1 - y2
  2. t = 1.5 * Math::PI - Math.atan2(y, x)
复制代码


作者: chd114    时间: 2018-4-5 22:14
知道3个点和坐标系就能算了吧···
把点连起来得到两点间距离,然后就是楼上的方法了···
作者: SailCat    时间: 2018-4-6 10:51
你的坐标系和RM的坐标系是不一样的,和平面直角坐标系就更不一样。
Math.atan2(y,x)返回的结果是基于平面直角坐标系的。而且值域是(-pi, pi]

如果你的(x1, y1), (x2,y2)是以RM的坐标系(左上角)为(0,0)的话
Math.atan2(y2-y1, x2-x1)得到的值是1/2pi-你那个角度的结果,因此

rad_angle = Math::PI / 2 - Math.atan2(y2 - y1, x2 - x1)
grd_angle = rad_angle / Math::PI * 180
grd_angle += 360 if grd_angle < 0
以上

作者: 芯☆淡茹水    时间: 2018-4-6 13:01
本帖最后由 芯☆淡茹水 于 2018-4-6 13:22 编辑
SailCat 发表于 2018-4-6 10:51
你的坐标系和RM的坐标系是不一样的,和平面直角坐标系就更不一样。
Math.atan2(y,x)返回的结果是基于平面直 ...



     唔~,这种方法试验是最接近的,弄了个简单的测试。

把发射的导弹作为 A 点,目标作为 B 点。
导弹图片是这样的,初始正上方, 0 度。


然后加入“发射”,  发射时初始 270或90 度 ±45 度,有一段不“指向”目标的时间(直接保持方向飞),过后随时根据角度算式“指向”目标。
目标为 对面飞船 的中心坐标。根据导弹自身方向的X,Y移动量已经写好,然后加入角度算式:


结果测试是酱紫:
到了快接近目标时,有些像是在画圆。



电脑开录屏就有些卡。

如果初始就指向目标中心, 运动轨迹是这样:
感觉好像什么东西刚好反了。




作者: myownroc    时间: 2018-4-6 15:44
如果只求[0, π]之间的夹角,直接向量点乘就好了;

如果求的是[0, 2π]之间的夹角,就需要用到向量叉乘了,比如这篇:https://blog.csdn.net/hy3316597/article/details/52732963

另外这是啥引擎?Cocos Creator?
作者: 芯☆淡茹水    时间: 2018-4-6 21:31
本帖最后由 芯☆淡茹水 于 2018-4-6 21:36 编辑

    唉~,还是老老实实,中规中矩的用了 4L 的办法,再结合 8L 实际角度换算,把它做了出来。
先把直线上的角度优先剔出来判断,以免后面运算又出什么幺蛾子。







作者: yanzhllwc    时间: 2019-12-25 17:01
这也太牛了吧、、、





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1