Last active
July 30, 2025 18:21
-
-
Save h0tk3y/e78db9adb3333c0483f5834ed916ec24 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Четыре угла прямоугольника на местности: | |
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