Код пытается найти точку пересечения двух сегментов - AB и CD.
Есть много различных способов, чтобы объяснить, как он это делает, в зависимости от того, как интерпретировать эти операции.
Скажем, точка А имеет координаты (ха, уа), B - (хь, Yb) и так далее. Скажем,
dxAB = xb - xa
dyAB = yb - ya
dxCD = xd - xc
dyCD = yd - yc
Следующая система двух линейных уравнений
| dxAB dxCD | | t | | xc-xa |
| | * | | = | |
| dyAB dyCD | | u | | yc-ya |
если решена tи u, даст вам пропорциональное положение точки пересечения на линии АВ (значение t) и по линии CD (значение u). Эти значения будут лежать в диапазоне , [0, 1]если точка принадлежит соответствующему сегменту , так и вне этого диапазона , если точка лежит вне отрезка (на линии , содержащей сегмент).
Для решения этой системы линейных уравнений можно использовать хорошо известное правило Крамера . Для этого нам понадобится определитель
| dxAB dxCD |
| |
| dyAB dyCD |
что именно determinant(b - a, c - d)из вашего кода. ( На самом деле, что я здесь determinant(b - a, d - c), но это не очень важно для целей данного объяснения. Код , который вы размещены по какой - то причине свопы C и D, см PS примечание ниже).
И мы также должны определитель
| xc-xa dxCD |
| |
| yc-ya dyCD |
что именно determinant(c-a,c-d)из вашего кода, и определитель
| dxAB xc-xa |
| |
| dyAB yc-ya |
который точно determinant(b-a,c-a).
Разделив эти детерминанты в соответствии с правилом Крамера даст нам значение tи u, что это именно то , что делается в коде, который размещен.
Затем код продолжает проверять значения tи uпроверить , если отрезки действительно пересекаются, то есть ли как tи uпринадлежат [0, 1]диапазону. И если они делают, он вычисляет фактическую точку пересечения путем оценки a*t+b*(1-t)( то же самое, что можно было бы оценить c*u+d*(1-u)). (Опять же , см PS примечание ниже).
PS В исходном коде точки D и C являются «местами» в том смысле , что код делает c - d, где я делаю d - cв моем объяснении. Но это не имеет никакого значения для общей идеи алгоритма, пока один внимательном со знаками.
Это своп C и D точки также является причиной для a*(1-t)+t*bвыражения используется при оценке точки пересечения. Обычно, как в моем объяснении, one'd ожидал увидеть что - то вроде a*t+b*(1-t)там. (У меня есть сомнения по этому поводу , хотя. Я бы ожидал увидеть a*t+b*(1-t)там даже в вашей версии. Может быть ошибкой.)
PPS Автор , если код забыл проверить det == 0(или очень близко к 0), что будет происходить в случае , когда сегменты параллельны.