Koden forsøker å finne skjæringspunktet mellom to segmenter - AB og CD.
Det er mange forskjellige måter å forklare hvordan den gjør det, avhengig av hvordan du tolker disse operasjonene.
La oss si at punkt A har koordinatene (xa, ya), B - (xb, yb) og så videre. La oss si
dxAB = xb - xa
dyAB = yb - ya
dxCD = xd - xc
dyCD = yd - yc
Det følgende system av to lineære ligninger
| dxAB dxCD | | t | | xc-xa |
| | * | | = | |
| dyAB dyCD | | u | | yc-ya |
hvis løses for tog uvil gi den forholdsmessige posisjonen til skjæringspunkt på linje AB (verdi t) og på linje CD (verdi u). Disse verdiene vil ligge i området fra [0, 1]om punktet hører til det tilsvarende segment og utenfor dette området hvis det punkt ligger utenfor segmentet (på linjen som inneholder segmentet).
For å løse dette systemet av lineære ligninger vi kan bruke den velkjente Cramers regel . For at vi trenger determinant av
| dxAB dxCD |
| |
| dyAB dyCD |
som er nøyaktig determinant(b - a, c - d)fra koden. (Egentlig det jeg har her er determinant(b - a, d - c), men det er egentlig ikke viktig i forbindelse med denne forklaringen. Koden du skrev for noen grunn bytter C og D, se PS merknad nedenfor).
Og vi vil også trenge determinant av
| xc-xa dxCD |
| |
| yc-ya dyCD |
som er nøyaktig determinant(c-a,c-d)fra koden, og determinant av
| dxAB xc-xa |
| |
| dyAB yc-ya |
som er nøyaktig determinant(b-a,c-a).
Splitte disse determinanter i samsvar med Cramers regel vil gi oss verdiene av tog u, som er nøyaktig hva som er gjort i koden du postet.
Koden deretter fortsetter å teste verdiene tog ufor å sjekke om segmentene faktisk krysser hverandre, det vil si om både tog utilhører [0, 1]variere. Og hvis de gjør, beregner den faktiske skjæringspunktet ved å evaluere a*t+b*(1-t)(ekvivalent, kan det evaluere c*u+d*(1-u)). (Igjen, se PS merknad nedenfor).
PS I den opprinnelige koden punktene D og C er "byttet" i en forstand at koden gjør c - d, hvor jeg gjør d - ci min forklaring. Men dette gjør ingen forskjell for den generelle ideen om algoritmen, så lenge man er forsiktig med skilt.
Dette bytte av C og D punkt er også årsaken til at a*(1-t)+t*buttrykket blir brukt ved vurdering av skjæringspunktet. Normalt, som i min forklaring, one'd forvente å se noe sånt a*t+b*(1-t)der. (Jeg har mine tvil om dette selv. Jeg forventer å se a*t+b*(1-t)det selv i din versjon. Kan være en bug.)
PPS Forfatteren hvis koden glemte å sjekke for det == 0(eller svært nær 0), som vil skje i tilfelle når segmentene er parallelle.