我正在尝试找出一种有效的方法来确定在给定点A,B和C的x和y坐标下,从A到B到C的角度以及从A到C的角度是否都是B小于90度。
基本上,如果点A落在该图像的绿色区域内,该方法应返回true,否则返回false。
我可以想到一些复杂的方法来做到这一点,但是我觉得应该有一个更简单的方法。由于我的程序会做很多事情,因此有效的解决方案会有所帮助。谢谢!
答案 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