Вы должны обработать каждую точку хотя бы один раз, чтобы узнать их расстояние.Если вы не хотите повторять процесс много раз с разными линиями, просто вычисление расстояния каждой точки неизбежно.Таким образом, алгоритм должен быть O (n).
Так как вам не важно фактическое расстояние, мы можем упростить вычисление расстояния до точки.Точное расстояние вычисляется как ( source ):
d^2 = |r⨯(p-s)|^2 / |r|^2
, где ⨯
- это перекрестное произведение, а |r|^2
- это квадрат длины вектора r
.Поскольку |r|^2
является постоянным для всех точек, мы можем исключить его из вычисления расстояния без изменения результата:
d^2 = |r⨯(p-s)|^2
Сравните приблизительные квадратные расстояния и соблюдайте минимум.Преимущество этой формулы в том, что вы можете делать все с целыми числами, поскольку вы упомянули, что все координаты являются целыми числами.