Skip to content

Instantly share code, notes, and snippets.

@h0tk3y
Last active July 30, 2025 18:21
Show Gist options
  • Save h0tk3y/e78db9adb3333c0483f5834ed916ec24 to your computer and use it in GitHub Desktop.
Save h0tk3y/e78db9adb3333c0483f5834ed916ec24 to your computer and use it in GitHub Desktop.
Четыре угла прямоугольника на местности:
0 = (0, 0),
(x, 0),
(0, y),
(x, y)
Векторы сторон:
m1 = 0 -> (x, 0) = (x - 0, 0 - 0) = (x, 0)
n1 = 0 -> (0, y) = (0 - 0, y - 0) = (0, y)
Вектор искомой точки выразим через два числа a и b и векторы сторон:
o = a * m1 + b * n1 =(покоординатно)= (a * x, b * y)
Эти же числа будут фигурировать в искомой точке плана (потому что точка находится в том же месте плана)
Четыре угла прямоугольника на плане:
c = (p, q),
(r, s),
(t, u),
(v, w)
Векторы соответствующих сторон плана:
m2 = c -> (r, s) = (p, q) -> (r, s) = (r - p, s - q)
n2 = c -> (t, u) = (p, q) -> (t, u) = (t - p, u - q)
Эти векторы откладываются от точки c, то есть в глобальных координатах искомая точка на плане выглядит так:
Вектор искомой точки, выраженный через векторы на плане:
o = c + a * m2 + b * n2 =(покоординатно)= (p + a * (r - p) + b * (t - p), q + a * (s - q) + b * (u - q))
Приравниваем покоординатно, для координаты x:
a * x = p + a * (r - p) + b * (t - p)
Для координаты y:
b * y = q + a * (s - q) + b * (u - q)
Это система уравнений.
Переводим уравнения в канонический вид (линейные комбинации слева, нули справа):
a * (x - r + p) + b * (t - p) - p = 0
a (-s + q) + b * (y - u + q) - q = 0
Так как x, y, p, q, r, s, t, u – константы для этого уравнения, для удобства переименуем
коэффициенты перед a и b:
a * k1 + b * k2 - p = 0 (*)
a * k3 + b * k4 - q = 0
Домножим первое уравнение на k3, второе на k1, чтобы получить одинаковые коэффициенты перед a:
a * k1 * k3 + b * k2 * k3 - p * k3 = 0
a * k1 * k3 + b * k1 * k4 - q * k1 = 0
Приравняем левые части и отнимем из обоих a * k1 * k3:
b * k2 * k3 - p * k3 = b * k1 * k4 - q * k1
b * (k2*k3 - k1*k4) = p*k3 - q*k1
b = (p*k3 - q*k1) / (k2*k3 - k1*k4)
Тут надо проверить, не делим ли на ноль – если это так, то у нас бесконечное множество решений.
(есть метод решения такой системы через детерминант ее матрицы, там это явно проверяют)
И выразим а через b из уравнения (*):
a = (p - b * k2) / k1
Подставляем обратно k1, k2, k3, k4:
b = p * (q - s) - q * (x - r + p) / ((t - p) * (q - s) - (x - r + p) * (y - u + q))
a = (p - b * (t - p)) / (x - r + p)
Коэффициенты a, b известны, осталось проверить, находится ли они оба в [0, 1] –
это условие, что точка лежит в прямоугольнике.
Отдельно проверить случай, когда план точно совпадает с комнатой, тогда решений бесконечно много, можно выбрать любое –
это и есть случай, когда детерминант равен нулю.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment