Требуется, чтобы произведение dot 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 | и длинысоставляющая вектора BA, параллельная вектору BC (т. е. проекция на параллельную ему прямую), | BA | cosθ.Этот компонент равен 0, когда A находится на краю полосы, которая содержит B, и равен BC, когда A находится на краю полосы, которая содержит C.
Использование вышеуказанного точечного продукта экономит почти половинурасчеты, если вам нужно проверить несколько точек для включения в одну полосу.Например, вот так (можно улучшить):
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