python - 两个数学问题

1 投票
3 回答
1804 浏览
提问于 2025-04-16 11:18

嘿,我在用pyGame,想要做以下几件事:

A) 我想写一个函数,能计算两个点之间的角度。我试着用math.atan2这个函数,但结果总是很奇怪。我试过用(delta X, delta Y)和(delta Y, delta X)这两种方式。有没有什么建议?

B) 给定一个长度和一个角度,想要根据这两个值从0开始返回一个点。比如,LengthDir(2, 45)用(长度, 角度)会返回(2, 2)。

谢谢你的帮助。我在网上找了很久,都没找到能帮我的东西...

3 个回答

0
import math

def dist(dx,dy):
    return math.sqrt(dx*dx + dy*dy)

def ang(dx, dy):
    return math.degrees(math.atan2(dy, dx))

def offs(dist, ang):
    ang = math.radians(ang)
    dx = dist * math.cos(ang)
    dy = dist * math.sin(ang)
    return dx,dy

.

dist(2,2) -> 2.8284
ang(2,2) -> 45.0
offs(2, 45) -> (1.414, 1.414)
1

你可以使用 cmath 这个库里的函数来在直角坐标系和极坐标系之间转换。举个例子:

import math, cmath

def LengthDir(r, phi):
   c = cmath.rect(r, math.radians(phi))
   return (c.real, c.imag)

def AngleBetween((x1, y1), (x2, y2)):
   phi = cmath.phase(x2 + y2*j) - cmath.phase(x1 + y1*j)
   return math.degrees(phi) % 360
4

math.atan2 这个函数返回的是 弧度。如果你需要得到角度,就把结果乘以 180/π。

def A(dx, dy):
  return math.atan2(dy, dx) * 180 / math.pi

同样,math 里的所有三角函数都是用弧度来计算的。如果你输入的是角度,记得先把它乘以 π/180。

def LengthDir(length, angle):
  radian_angle = angle * math.pi / 180
  return (length * math.cos(radian_angle), length * math.sin(radian_angle))

Python 还提供了很方便的函数 math.degreesmath.radians,这样你就不需要记住常数 180/π 了。

def A(dx, dy):
  return math.degrees( math.atan2(dy, dx) )

def LengthDir(length, angle):
  radian_angle = math.radians(angle)
  return (length * math.cos(radian_angle), length * math.sin(radian_angle))

撰写回答