Teen tke:hen entiteetteille törmäystarkistusta, jossa tarkastellaan johtaako uuteen pisteeseen liikkuminen törmäykseen seinätilen kanssa. Entiteetillä on suojavyöhyke(ympyrä), jonka säde on EntityHitboxRadius ja paikka EntityPos. Sanotaan että tilen suorakulmio on vaikka TileRect ja sen keskikohta TileRectPos. Miten tarkistetaan leikkaako ympyrä suorakulmiota? Pää alkaa olla kahden viikon ohjelmointiputken jälkeen niin puhki että ei pysty enää miettimään simmpeleitäkään matemaattisia ongelmia.
Pseudo käy hyvin, Pascalia suosin.
Ehkäpä tästä on apua: http://www.suomipelit.com/index.php?c=naytaartikkeli&id=67&s=3
MR.Coodari kirjoitti:
Ehkäpä tästä on apua: http://www.suomipelit.com/index.php?c=naytaartikkeli&id=67&s=3
*Huokaus* joo taidan yrittää huomenna nyt väsyttää liikaa edes tuon koodin kääntämiseen. Kiitos kuitenkin linkistä, enköhän saa tuon avulla toimimaan. Hommaa tosiaan vielä helpottaa se että tile-suorakulmion sivut ovat aina koordinaattiakselien suuntaiset.
Pelkkä suorakulmion sijainti ja keskipiste ei riitä kertomaan, leikkaako suorakulmio ja ympyrä. Tarkistus käy Pythagoraan lauseella, jos tiedät suorakulmion kulmien koordinaatit. Laske suorakulmion sivujen etäisyydet ympyrän keskipisteestä. Suorakulmio leikkaa ympyrää, jos näistä neljästä etäisyydestä pienin on pienempi kuin ympyrän säde ja jokin suorakulmion kärkipiste on kauempana ympyrän keskipisteestä kuin ympyrän säde.
Jaska kirjoitti:
Pelkkä suorakulmion sijainti ja keskipiste ei riitä kertomaan, leikkaako suorakulmio ja ympyrä.
Luonnollisesti. En hoksannut mainita että esimerkissäni TileRect on Delphin TRect-tyyppiä eli suorakulmio.
Jaska kirjoitti:
Tarkistus käy Pythagoraan lauseella, jos tiedät suorakulmion kulmien koordinaatit. Laske suorakulmion sivujen etäisyydet ympyrän keskipisteestä. Suorakulmio leikkaa ympyrää, jos näistä neljästä etäisyydestä pienin on pienempi kuin ympyrän säde ja jokin suorakulmion kärkipiste on kauempana ympyrän keskipisteestä kuin ympyrän säde.
Noinhan se loogisesti tuntuu menevän. Taitaa olla suomennos ylläolevan linkin koodista. Joka tapauksessa kiitos molemmille, toteutan tämän huomenna. Muistakaa ladata tke:n beta niin saatte rebootata koneen :)
Onhan mahdollista, että ympyrä leikkaa suorakulmion laitaa, mutta ei koske yhteenkään kulmaan. Pelkkä kulmien testaus ei paljasta tätä tapausta.
Tällä sivulla on interaktiivinen demo ja JS-koodia.
http://www.kevlindev.com/geometry/index.htm
Koodi selvittää myös, missä kohdissa leikkaus tapahtuu. Se voi olla enemmän, kuin mitä Janezki tarvitsee. Siinä tapauksessa seuraava menettely voisi olla riittävä.
Tarkastellaan, miten k-akselien suuntainen suorakulmio jakaa tason yhdeksään eri alueeseen. Yksi näistä on suorakulmion sisusta. Muut kahdeksan syntyvät suorakulmion laitojen suuntaisten suorien rajaamina.
Voimme testata muutamalla testillä, missä näistä alueista ympyrän keskipiste on. Esimerkiksi testaamalla suorakulmion laitojen rajaamia y-koordinaatteja voi selvitä, että keskipiste on joko suorakulmion yläpuolella, sen tasolla (ylä- ja alalaidan välissä) tai alapuolella y-koordinaatin suhteen.
Kun sama tehdään myös x-koordinaatin suhteen, saadaan yhdeksän eri mahdollista yhdistelmää. Nämä jakautuvat kolmeen erilaiseen tapaukseen.
1) Keskipiste on suorakulmion sisällä. Nyt tutkitaan sädettä. Jos keskipiste +- säde eri koordinaattiakselien suunnissa jää aina suorakulmion sisään, ympyrä on kokonaan suorakulmion sisällä. Jos taas jokainen nurkka on lähempänä keskipistettä, kuin mikä on säteen pituus, suorakulmio on kokonaan ympyrän sisäslä. Muutoin on leikkaus olemassa. (Ehkä sisälläolokin lasketaan leikkaukseksi Janezkin ohjelmassa? Silloin pääsee vähemmällä.)
2) Keskipiste on suoraan suorakulmion yläpuolella. Taas tarkastellaan sädettä. Siirrymme ympyrän keskipisteestä suoraan alaspäin säteen verran, mikä antaa ympyrän alimman pisteen. Jos olemme yhä suorakulmion yläpuolella, ei leikkausta voi olla. Jos olemme suorakulmion ylälaidan alapuolella, on leikkaus olemassa, ellemme ole niin alhaalla, että alalaidan nurkat ovat ympyrän sisällä. Tämän tarkistus ratkaisee tilanteen. (Taas sen voi sivuuttaa, jos sisälläolo riittää.)
3) Keskipiste on sekä ylä- että vasemmalla puolella. Nyt ympyrää lähin nurkka on suorakulmion ylempi vasen nurkka. Jos sen etäisyys ympyrän keskipisteestä on pienempi kuin säde, mutta vastakkaisen nurkan etäisyys ei ole, on leikkaus olemassa. Jos vastakkainenkin nurkka on ympyrän sisällä, on koko suorakulmio ympyrän sisällä.
Symmetrian avulla kaksi viimeistä tapausta yleistyvät suorakulmion eri puolille.
Pekka Karjalainen kirjoitti:
Onhan mahdollista, että ympyrä leikkaa suorakulmion laitaa, mutta ei koske yhteenkään kulmaan. Pelkkä kulmien testaus ei paljasta tätä tapausta.
Niinhän Jaska juuri opastikin:
Jaska kirjoitti:
Laske suorakulmion sivujen etäisyydet ympyrän keskipisteestä. Suorakulmio leikkaa ympyrää, jos näistä neljästä etäisyydestä pienin on pienempi kuin ympyrän säde ja jokin suorakulmion kärkipiste on kauempana ympyrän keskipisteestä kuin ympyrän säde.
Periaatteessa minulle riittää että lasken lähimmän etäisyyden ympyrän keskipisteestä suorakulmion kehään. On mahdotonta että entiteetti pääsisi pompsahtamaan tilen sisälle yhdellä loikalla, tai että tile jäisi kokonaan EntityHitboxin sisälle.
Kas joo.
Näköjään toimi huomattavasti yksinkertaisemmalla mekaniikalla. Laajensin suorakulmion sädettä EntityHitBoxRadiuksen verran ja testasin osuuko entiteetin keskipiste tämän suorakulmion sisälle. Toimii hyvin jos entiteetin ja tilen halkaisija on samaa suuruusluokkaa. Olisin tietty voinut vain verrata keskipisteiden etäisyyksiä mutta tuo toteutus oli tällä kertaa nopeampi. TRect-luokalle olisi pitänyt tehdä ensin funktio joka laskee suorakulmion keskipisteen.
Aihe on jo aika vanha, joten et voi enää vastata siihen.