Featured Post

Helppo ja nopea kolmionpiirtorutiini.

Vau. Kehitys kehittynyt ja oppi opittu. public static void SolidTriangle(Point a, Point b, Point c, Color color) {             Point[] po...

Thursday, December 13, 2012

Laatikkotörmäys ja dieetti

Pienensin annoskokoa. Saas nähdä tuleeko miten nälkä. Tänään voisi käydä silleen nätisti salilla, lähinnä saunassa, mutta voisi myös kävellä. En varmaan rääkkää itseäni, on sen verta flunssainen olo.

BOX COLLISION

eli siis se laatikkotörmäys. Kun kaksi kappaletta liikkuu ruudulla, on hyvä tietää josko net ovat törmäämässä. 
Tähän tuli pyörä, vai liekkö tässä tapauksessa laatikko, keksittyä uudelleen. 

A

B


Eli meillä on laatikot A, ja B, joilla on koordinaatit x, y, leveys & korkeus w, h.

Pystyakselin törmäys:
Jos A.x + A.w // oikea ylänurkka
on suurempi tai yhtäsuuri kuin B.x // vasen ylänurkka
JA
A.x on pienempi kuin B.x + B.w
Niin, kappaleet ovat samalla pystylinjalla, ja voimme tarkistaa varsinaisen törmäyksen.
Jos samalla linjalla olevissa kappaleissa,
A.y + A.h eli kappaleen A alareuna, on suurempi kuin B.y,
JA
A.y on pienempi kuin B.y, A ja B ovat törmänneet reunoistaan, B:n yläreunasta.

alapuolen törmäykseen voimme vain nakata A:n ja B:n ristiin.

Vaakasuuntaisessa törmäyksessä käännämme vain  yhtälön kyljelleen.

A

B


Pseudokoodia:

if a.x+a.w <= b.x and a.x <= b.x+b.w then:
    if a.y+a.h >= b.y and a.y < b.y then:
        collision at b.y
    if b.y+b.h >= a.y and b.y < a.y then: 
        collision at b.y+b.h
if a.y+a.h <= b.y and a.y <= b.y+b.h then:



    if a.x+a.w >= b.x and a.x < b.x then:
        collision at b.x
    if b.x+b.w >= a.x and b.x < a.x then: 
        collision at b.x+b.w

Nyt, tämä koodi tuottaa ongelmia kun useassa tilanteessa rekisteröidään sekä x- ja y-akselin törmäys.
Tämän voi ratkaista laskemalla kollisio linjalle keskipisteestä. Esimerkiksi ylläolevassa kuvassa, kappaleen A keskipisteestä piirretyssä pysty- ja vaakasuuntaisissa linjoissa x-akselilla ei tapahdu törmäystä kappaleeseen B, kun taas y-akselilla tapahtuu. Yleisesti, boxcollision on lähinnä lähtökohta tarkemmalle törmäystarkastelulle

No comments:

Post a Comment