Nyt osaat liikuttaa esinettä ja kuten elämä on osoittanut, jokainen liikkuva esine törmää ennemmin tai myöhemmin johonkin. Jos liikkuva esine olet esimerkiksi sinä ja olet onnekas, saatat törmätä johonkin pehmeään, kuten sänkyyn, mutta joskus voit törmätä myös koviin esineisiin. Tiiliseinä. Sementtilattia. Suljettu ovi. Monet muut epämiellyttävän kovat esineet ovat siellä villimaailmassa odottamassa vain törmäävänsä sinuun tai muihin liikkuviin esineisiin. Joten on hyvä terveydelle ja yleensä viisasta tietää, minkä esineiden kanssa saatat törmätä tulevaisuudessa.
Tiedämme kohteen liikevektorin. Ja tiedämme vektorin, joka muodostaa seinän (ok, seinä näyttää ohuelta viivalta, mutta sinun on silti oltava varovainen). Haluamme tietää, törmääkö liikkuva esine seinään, milloin ja missä, tai muotoilla se uudelleen “missä kaksi vektoria leikkaavat?”
Katsotaan ensin, milloin ne eivät risteä. Vektorit eivät voi leikkiä, kun ne ovat yhdensuuntaisia. Ja vektorit ovat yhdensuuntaisia, kun niiden yksikkövektorit ovat yhtä suuret (ei tarvitse olla samansuuntaisia, ne voivat olla myös vastakkaisia):
(v1.dx==v2.dx ja v1.dy==v2.dy) tai
(v1.dx==-v2.dx ja v1.dy==-v2.dy)
Jos ne eivät ole yhdensuuntaisia, niin leikkaus tapahtuu ennemmin tai myöhemmin. Vihreä viiva on liikevektori, jonka alkupiste on p0, punainen viiva on seinä, jonka aloituspiste on p0 ja sininen viiva on alkupisteiden välinen vektori:
Leikkauspisteen koordinaatit voidaan laskea seuraavasti:
v3={vx:v2.p0.x-v1.p0.x, vy:v2.p0.y-v1.p0.y};
var t = perP(v3, v2)/perP(v1, v2);
ip={};
ip.x=v1.p0.x+v1.vxt; ip.y=v1.p0.y+v1.vyt;
function perP(va, vb){
pp = va.vxvb.vy – va.vyvb.vx;
paluu pp;
}
Ensin löydetään vektori v3 aloituspisteiden väliltä. Tässä käytetty funktio laskee 2 vektorin perp-tulon. Perp-tulo on samanlainen kuin pistetulo vain ensimmäisen vektorin sijaan, sen normaalia käytetään. Pistetuote oli:
dp = v1.vxv2.vx + v1.vyv2.vy;
ja normaali oli:
v.rx = -v.vy;
v.ry = v.vx;
joten kun korvaamme v1:n sen normaalilla, saamme:
pp = -v1.vyv2.vx + v1.vxv2.vy;
joka on juuri se, mitä funktio löytää.
Kahden perp-tulon välinen suhde “t” on täsmälleen 1, kun leikkauspiste on täsmälleen liikevektorin 1 loppupisteessä. Jos “t” on välillä 0 ja 1, leikkauspiste on vektorissa. Kuitenkin, jos “t” on negatiivinen, vektorit ovat leikkaaneet joskus aiemmin ja jos se on suurempi kuin 1, niin leikkaus tapahtuu joskus tulevaisuudessa.
Tietenkin, jos haluat tietää, onko leikkauspiste jommassakummassa vektorissa, sinun on löydettävä t myös v2:lle:
v3={vx:v1.p0.x-v2.p0.x, vy:v1.p0.y-v2.p0.y};
var t = perP(v3, v1)/perP(v2, v1);
Yritä tässä esimerkissä vetää pisteitä ja katso, missä vektorit leikkaavat:
Jos olet kiinnostunut todellisesta tavasta, jolla risteysalgoritmi löydetään, lue blogia lisää.
