Я думаю, что есть 3 штуки к этому.
вычислите пересечение двух линий и удерживайте координаты X и Y этой точки
найдите участок, в котором находится данная точка. Это должно быть достаточно просто, потому что у вас есть наклон 2 линий, а также наклон линии, созданной данной точкой и точкой пересечения. Назовите их m_line1
, m_line2
и m_intersect
. Если m_intersect
Существует формула для расчета разреза с использованием этих значений и местоположения заданной точки.
- найти ближайшее целое число. Существует также прямое вычисление этого, когда вы знаете значения от # 1 выше, и наклоны от # 2. Вы можете перебор, но есть элегантное математическое решение.
Вот шаги, которые я предпринял, по крайней мере.
Обновлено, чтобы добавить больше вещества
Хорошо, я начну с обсуждения # 2.
Если вы вычислите наклон данной точки и точки пересечения, то вы получите m_intersection
. Это наклон линии, которая проходит через точку пересечения. Давайте предположим, что m_line1
является наибольшим из 2 уклонов, так что линия 1 находится «выше» линии 2 при увеличении x после пересечения. Это облегчает поиск названий разделов. Мы будем называть секцию A секцией, заданной полоской между line1 и line2 для x, большей, чем координата пересечения x, а затем назовем остальные 3 секции по часовой стрелке, так что A и C противоположны друг другу.
Если m_intersection
находится между m_line1
и m_lin2
, то оно должно быть в одной из 2 секций A или C . Какой раздел является простой проверкой значения координаты x относительно координаты x пересечения. Мы определили A как раздел с большим значением. Аналогичный расчет можно сделать, если уклон находится за пределами m_line1
или m_line2
.
Это дает вам раздел, в котором находится ваша точка. Все, что вы сделали, это вычислили 1 пересечение (5 умножений, 2 деления и несколько вычитаний, если вы делаете это традиционным способом), 3 склона, а затем пару целочисленных сравнений .
Edit # 3 - назад (не) популярным спросом!
Итак, вот как я вычислил # 3, ближайшую целую точку к пересечению. Возможно, он не самый лучший, но он использует бинарный поиск, поэтому это O (log n), где n связано с обратной величиной разности уклонов линий. Чем ближе они вместе, тем больше n.
Сначала возьмем разницу между наклонами двух линий. Скажи, что это 1/8. Это означает, что с точки пересечения вы должны пройти 8 единиц вдоль оси x, прежде чем вам будет гарантировано, что на оси y между двумя линиями есть целое число (оно может быть на одной из линий). Теперь, если само пересечение не находится на целочисленной координате х, то вам нужно выйти дальше, чтобы гарантировать, что ваша начальная точка находится на целочисленной координате х, но она ограничена. Если пересечение в точке х = 1,2, то в приведенном выше примере в худшем случае вы начнете с х = 41, а затем двигаетесь вниз на ~ 5 единиц вдоль оси у. Выберите либо потолок, либо этаж значения y, которое вы получите. Это не очень важно.
Теперь, когда у вас есть начальная точка, ближайшая точка может быть аппроксимирована бинарным поиском. Ваш новый отрезок линии находится между пересечением и начальной точкой, а ваши единицы движения кратны наклону этого отрезка. Рассчитайте среднюю точку отрезка и посмотрите, находится ли он между двумя линиями. Добавьте или вычтите 1, если это не прямое попадание, и если любое из этих попаданий, уменьшите оставшееся расстояние пополам и сделайте это снова. В противном случае ищите следующую половину сегмента.
Если у вас нет разницы наклона <1, я думаю, что проблема может быть проще (грубая сила пространства вокруг пересечения). Но это всего лишь особый случай поиска выше, когда вам не нужно далеко ходить, чтобы найти отправную точку. </p>