【问题标题】:Distance from point to box boundary点到框边界的距离
【发布时间】:2021-08-18 04:57:19
【问题描述】:

在我使用 Pygame 编写的游戏中,我在从 (0,0)(1,1) 的框中有一个二维点 (x,y)(边长为 1 的完美正方形)。 我想在alpha 方向上计算从点到框边界的欧几里得距离,其中alpha 是以弧度为单位逆时针测量的方位角方向,从alpha=0 作为x 轴方向开始。

我写了一个 python 代码来计算这个距离,但我不确定这是最有效/最干净的方法:

import numpy as np


def get_distance_to_boundary(x, y, angle):
    cos_angle, sin_angle = np.cos(angle), np.sin(angle)
    if cos_angle == 0:
        return y if sin_angle < 0 else 1 - y
    if sin_angle == 0:
        return x if cos_angle < 0 else 1 - x
    x_target = 1 if cos_angle > 0 else 0
    y_target = y + (x_target - x) * np.tan(angle)
    if y_target > 1:
        return np.fabs((1 - y) / sin_angle)
    if y_target < 0:
        return np.fabs(y / sin_angle)
    return np.sqrt((x_target - x) ** 2 + (y_target - y) ** 2)

有更好的方法吗?

插图:

【问题讨论】:

    标签: python numpy distance euclidean-distance


    【解决方案1】:

    此方法更高效/更清洁,因为您不需要tanfabssqrt**2

    def distance(x,y,angle):
        cos_angle, sin_angle = np.cos(angle), np.sin(angle)
        if cos_angle == 0:
            return y if sin_angle < 0 else 1 - y
        if sin_angle == 0:
            return x if cos_angle < 0 else 1 - x
        distance_EW = (1-x)/cos_angle if cos_angle>0 else -x/cos_angle
        distance_NS = (1-y)/sin_angle if sin_angle>0 else -y/sin_angle
        return min(distance_EW, distance_NS)
    

    我将distance_EW 定义为目标在东墙上(如果 cos_angle>0)或在西墙上(如果 cos_angledistance_NS。

    ...

    警告:由于舍入错误,我的距离函数有时会产生与您的函数不同的结果!!当您的起点位于框的边界并且angle 接近 π/2 的倍数时,这尤其成问题。 我建议您设置某种容差,例如if abs(sin_angle) &lt; 1e-12:,而不是if sin_angle == 0:。这样,sin_angle = np.sin(np.pi) 将在 if 条件中被接受,即使它不完全等于 0(因为 np.sin(np.pi) 在 python 中是 1.2e-16)。

    【讨论】:

    • 旁注:如果你喜欢让你的代码像我一样难以辨认,那么你可以更简洁地定义距离:distance_EW = ((cos_angle&gt;0)-x)/cos_angledistance_NS = ((sin_angle&gt;0)-y)/sin_angle。 (如果其他人也必须阅读您的代码,请不要这样做)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 1970-01-01
    • 2012-06-14
    • 2017-02-21
    • 2013-07-17
    • 2012-06-12
    • 2021-12-06
    相关资源
    最近更新 更多