给定点A,B和C,如何确定ABC和ACB角都为锐角?

时间:2019-05-05 07:02:00

标签: algorithm geometry

我正在尝试找出一种有效的方法来确定在给定点A,B和C的x和y坐标下,从A到B到C的角度以及从A到C的角度是否都是B小于90度。

基本上,如果点A落在该图像的绿色区域内,strip defined by opposite points B and C on edges该方法应返回true,否则返回false。

我可以想到一些复杂的方法来做到这一点,但是我觉得应该有一个更简单的方法。由于我的程序会做很多事情,因此有效的解决方案会有所帮助。谢谢!

2 个答案:

答案 0 :(得分:1)

似乎您需要知道三角形ABC是否为锐角。

要判断三角形是否为锐角,平方时两条腿的长度之和必须大于斜边平方的长度。

hyp^2 < legA^2 + legB^2

如果您还没有每条腿的长度,则必须使用距离公式。

d = sqrt((Ax + Bx)^2 + (Ay + By)^2)

答案 1 :(得分:1)

您希望dot product BA·BC(即| BA || BC |cosθ,其中θ是BA和BC之间的角度)在0和BC 2 之间。在Python中:

def in_strip(ax, ay, bx, by, cx, cy):
    bcx = cx - bx
    bcy = cy - by
    strip_width_squared = bcx * bcx + bcy * bcy
    bax = ax - bx
    bay = ay - by
    dot_product = bax * bcx + bay * bcy
    return 0 < dot_product < strip_width_squared

如果点积小于0,则点A位于距离B更近的一侧的条带之外,如果点积大于BC 2 ,则它位于距离更近一侧的条带的外侧到C。

您可以将点积BA·BC看作两个长度的乘积:向量BC的长度|| BC |和平行于向量BC的向量BA的分量的长度(即投影到与其平行的直线上),| BA |cosθ。当A在包含B的条带的边缘时,该分量为0;当A在包含C的条带的边缘时,该分量为BC。

如果必须检查要包含在同一条带中的多个点,则使用上述点积可以节省几乎一半的计算。例如,这样(可以改进):

class Strip:
    def __init__(self, bx, by, cx, cy):
        self.bx,  self.by  = bx, by
        self.bcx, self.bcy = cx - bx, cy - by
        self.width_squared = self.bcx * self.bcx + self.bcy * self.bcy

    def contains(self, ax, ay):
        bax, bay = ax - self.bx, ay - self.by
        return 0 < bax * self.bcx + bay * self.bcy < self.width_squared