数学编程题
函数 main() 接收两个表示从坐标原点出发的二维向量的元组 vector1 和 vector2,例如 (3,0) 表示从坐标原点 (0, 0) 到坐标 (3, 0) 的向量,
要求返回两个向量 vector1 和 vector2 的夹角(单位为度,数值大小在 0 到 180 之间),
并且要求结果恰好保留 2 位小数,例如向量 (3, 0) 和 (0, 4) 的夹角为 90.00。
删除下面代码中的 pass 语句,替换为自己的代码,完成要求的功能。
代码已导入的标准库对象不是必须使用的,可以自己决定是否使用。
from operator import mul
from math import acos, degrees
def main(vector1, vector2):
pass 嗯,上面的代码不对,还得考虑点在第几象限的问题,我再想一想
$ cat main.py
#!/usr/bin/env python
#coding=utf-8
from math import sqrt, pow, acos, fabs, degrees
def angle(A, B):
c = sqrt(pow(A, 2) + pow(A, 2))
n = 90 - degrees(acos(A / c))
c = sqrt(pow(B, 2) + pow(B, 2))
m = 90 - degrees(acos(B / c))
n = n if A >= 0 else (90 - n) * 2 + n
m = m if B >= 0 else (90 - m) * 2 + m
return fabs(n - m)
print(angle((3, 9), (4, 5)))
print(angle((3, 0), (0, 4)))
print(angle((-3, 9), (4, 5)))
print(angle((3, 0), (0, -4)))
$ ./main.py
20.224859431168056
90.0
57.094757077012105
90.0
$
本帖最后由 人造人 于 2022-3-19 22:54 编辑
不知道有没有漏掉一些特殊情况,多给几组输入输出看看
$ cat main.py
#!/usr/bin/env python
#coding=utf-8
from math import sqrt, pow, acos, fabs, degrees
def angle(A, B):
c = sqrt(pow(A, 2) + pow(A, 2))
n = acos(A / c)
c = sqrt(pow(B, 2) + pow(B, 2))
m = acos(B / c)
x = fabs(n - m)
return degrees(x)
print(angle((3, 9), (4, 5)))
print(angle((3, 0), (0, 4)))
print(angle((-3, 9), (4, 5)))
print(angle((3, 0), (0, -4)))
$ ./main.py
20.224859431168067
90.0
20.224859431168067
90.0
$
人造人 发表于 2022-3-19 22:53
不知道有没有漏掉一些特殊情况,多给几组输入输出看看
非常感谢大佬,但是有两组数据不通过,再看看是什么问题呗,
我不懂这个反余弦函数{:5_96:}
人造人 发表于 2022-3-19 21:01
嗯,上面的代码不对,还得考虑点在第几象限的问题,我再想一想
谢谢大佬,可以了,可以说说这道题的思路是怎样的吗?
反余弦是哪条边比哪条边呀,这数学好让人凌乱呀{:5_96:} isdkz 发表于 2022-3-19 23:49
谢谢大佬,可以了,可以说说这道题的思路是怎样的吗?
反余弦是哪条边比哪条边呀,这数学好让人凌乱 ...
https://baike.baidu.com/item/%E4%B8%89%E8%A7%92%E5%87%BD%E6%95%B0%E5%85%AC%E5%BC%8F/4374733?fr=aladdin
人造人 发表于 2022-3-19 23:56
https://baike.baidu.com/item/%E4%B8%89%E8%A7%92%E5%87%BD%E6%95%B0%E5%85%AC%E5%BC%8F/4374733?fr=ala ...
好的,谢谢大佬
页:
[1]