Osuvatko sylinterit?

Seuraa 
Viestejä45973
Liittynyt3.9.2015

Tarvitsisin kaavan millä voi tarkistaa, että osuvatko kaksi sylinteriä toisiinsa? Karkean tarkistuksen voi tehdä siten, että laskee niiden akselien minimietäisyyden toisistaan ja vertaa sitä sylinterien säteiden summaan. Tästä tulee kuitenkin paljon "false positive" tuloksia, joten täytyy keksiä joku lisätarkistus.

Voisin tehdä sylinteristä meshin, ja käyttää siihen yleisesti käytettyjä algoritmeja. Se olisi luultavasti hitaampaa, koska sylinteri on niin "matemaattinen muoto". Esim. kahden pallon tapaus olisi erittäin helppo siitä syystä.

Sylinterit esitetään siten, että tiedetään niiden keskipiste, akselin suuntavektori, säde ja korkeus.

Jos meillä on sylinterit A ja B, niin olisi kiva saada tietoon kappaleen "A AND B" massakeskipiste (edes suunnilleen), koska olen tekemässä fysiikkamoottoria joka käsittelee ainoastaan sylintereitä.

On helppo tarkistaa että onko piste sylinterin sisällä, kun sen paikkavektori (oletetaan sylinteri origoon) projosoidaan akselin suuntaiseen ja sitä vastaan kohtisuoraan komponenttiin, ja näiden pituuksia verrataan sylinterin säteeseen ja korkeuteen.

"Intersecting cylinders" hausta tulee aina jotain tällaisia tuloksia: http://local.wasp.uwa.edu.au/~pbourke/geometry/cylinders/ :/

Kommentit (10)

Stratonovich
Seuraa 
Viestejä358
Liittynyt14.6.2009
msdos464
Tarvitsisin kaavan millä voi tarkistaa, että osuvatko kaksi sylinteriä toisiinsa? Karkean tarkistuksen voi tehdä siten, että laskee niiden akselien minimietäisyyden toisistaan ja vertaa sitä sylinterien säteiden summaan. Tästä tulee kuitenkin paljon "false positive" tuloksia, joten täytyy keksiä joku lisätarkistus.

Etkös voi tehdä niin, että ensin lasket minimietäisyyden ja sen, että missä akselin pisteissä tämä tarkkaan ottaen toteutuu. Jos jompi kumpi on sylinterin ulkopuolella akselin suunnassa, vastaus hylätään ja oikea ääriarvo on oltava jossakin reunassa. Siispä sitten lasket kunkin päätepisteen kohdalta lähtevien kohtisuorien minimietäisyydet toisesta akselista ja teet vastaavan tarkistuksen. Sitten pitää vielä ilmeisesti tarkistaa kaikki päätepisteparit vähän vastaavalla logiikalla eli katsoa leikkaavatko ne ympyrät toisensa. Näin pikaisella miettimisellä.

Vierailija

Hmm... Sylintereille on helppo laskea bounding shpere, sillä säde on suoraan sqrt(r^2 + (h/2)^2). Jos sylinteri ei ole liian pitkulainen, niin tuo on vielä melko tarkka aproksimaatio.

Tarkemman tarkastelun voin tehdä siten, että aproksimoin sylinterin "kantta" esim. 16-kulmioksi ja tarkistan sylinterin vaipan muodostavat 16 viivaa, että ovatko ne osittain toisen sylinterin sisällä. Sen pitäisi onnistua melko helposti.

Olisi tietty kivempi saada tarkka vastaus, ettei tarvitsisi tehdä tällaista aproksimaatiota.

Neutroni
Seuraa 
Viestejä26890
Liittynyt16.3.2005

Ehkä tuossa voisi parametrisoida sylinterien akselisuorat sopivasti, ja määrittää funktion etäisyyksille. Lyhin etäisyys saadaan laskemalla funtkion ääriarvo, ja jos se on pienempi kuin säteiden summa, sylinterit leikkaavat. Se vie kyllä kellojaksoja siihen malliin, että jos vertailulla on kiire, kannattaa käyttää jotain approksimatiivista lähestymistapaa.

Vierailija

Kun itse väänsin enginentynkää joskus vuosia sitten, oli peliohjelmoijien julkaisu http://www.gamasutra.com informatiivinen resurssi ja muistaakseni sen artikkeleissa käsiteltiin laatikoiden ja pallojen lisäksi myös sylintereitä törmäystarkistuksessa. Pikaisella haulla löysin sieltä tämmöisen tarkoituksiisi ehkä vähän ylimalkaisen artikkelin, mutta löytänet sen lähdeviitteistä jotain hyödyllisiä linkkejä: http://www.gamasutra.com/resource_guide ... n_04.shtml

Ja Gamasutran fysiikka-osastolta voi löytyä hyödyllisiä artikkeleita: http://www.gamasutra.com/resource_guide ... ndex.shtml

Vierailija

No eikö tähän muka löydy Maolista kaavaa. Ja jos ei niin sit lyöt vaan ympyräpohjaisen pyramidin alan lausekkeen johonkin integroimiskaavan niii iha pakosti luulis irtoovan pari pojoo ,oli tehtäväanto mikä tahansa.

Vierailija
ppmk
No eikö tähän muka löydy Maolista kaavaa. Ja jos ei niin sit lyöt vaan ympyräpohjaisen pyramidin alan lausekkeen johonkin integroimiskaavan niii iha pakosti luulis irtoovan pari pojoo ,oli tehtäväanto mikä tahansa.



Kyseessä on fysiikkamoottori, joten pulmaan pitäisi kyllä saada ihan täsmällinen vastaus. Koititko itse miettiä ollenkaan ratkaisua tähän?

Neutroni
Seuraa 
Viestejä26890
Liittynyt16.3.2005
ppmk
No eikö tähän muka löydy Maolista kaavaa.



No ei löydy. Maolista ei löydy kaavoja mihinkään koulukurssien ulkopuolisiin ongelmiin. Ani harvoin niitä löytyy laajemistakaan taulukkokirjoista. Eivät ne ongelmia muuten olisikaan.

ppmk
Ja jos ei niin sit lyöt vaan ympyräpohjaisen pyramidin alan lausekkeen johonkin integroimiskaavan niii iha pakosti luulis irtoovan pari pojoo ,oli tehtäväanto mikä tahansa.



Kouluissa opettajat varmaan antavat idiooteille armopisteet satunnaisen kaavan kopioinnista, ettei heidän tarvitsisi sietää niitä kertaamassa vuodesta toiseen samoja kursseja. Sääli sinänsä, mutta ei sitä tietysti muuta voida, jos poliitikkojen pakkomielle on haluta jokaiselle alamaiselle yliopistopahvit. Mutta fysiikkaa mallintava tietokoneohjelma ei toimi alkuunkaan järkevästi tuossa tapauksessa. Käyttäjä huomaa karkeana virheenä, jos sylinterit läpäisevät toisensa tai simulaatio käyttäytyy muuten räikeästi todellisuudesta poiketen. Tosielämän ongelmista ei yleensä jaeta armopisteitä, vaan ne arvostellaan "oikein" tai "väärin" -asteikolla.

jto
Seuraa 
Viestejä161
Liittynyt17.10.2009
msdos464
Hmm... Sylintereille on helppo laskea bounding shpere, sillä säde on suoraan sqrt(r^2 + (h/2)^2). Jos sylinteri ei ole liian pitkulainen, niin tuo on vielä melko tarkka aproksimaatio.

Kelpaisiko rekursiivinen ratkaisu?

Sylinterin ja pallon osuminen on (tarkemmin miettimättä, mutta pitäisi toimia) helppo tarkistaa. Jos pallon keskipisteen paikkavektorin (katsottuna sylinterin keskipisteestä) projektio sylinterin akselille on sylinterin pituuden puolikasta pienempi, riittää tarkastella sylinterin ja pallon säteiden summaa. Jos tuo projektio on pidempi, sylinteri ja pallo voivat osua sylinterin päässä, minkä myös pystyy tarkistamaan (?, punkku vähän estää tarkempaa ajattelua).

Nyt sitten laitetaan toisen sylinterin keskipisteeseen pallo, jonka säde on sylinterin säde, ja tarkistetaan osuuko tämä pallo toiseen sylinteriin. Jos osuu, myös sylinterit osuvat toisiinsa, jos ei osu, tiedetään, että osuminen on mahdollista vain sylinterin jommassa kummassa päässä. Jaetaan sylinteri kahtia ja valitaan jatkotarkasteluun se puolikassylinteri, jonka keskipiste on lähempänä toisen sylinterin keskipistettä (mutua). Toistetaan homma toisellekin sylinterille ja jatketaan rekursiivisesti, kunnes bounding sphere kertoo, että sylinterit eivät osu tai sitten osuma on todennettu.

Ongelmaksi tietysti tulee, että etukäteen ei tiedetä tarvittavaa rekursioaskeleiden lukumäärää. Toisaalta, jos tuota rekursiota pyöritetään n askelta, niin tiedetään, että tarkasteltavat sylinterit ovat lyhyitä ja lähellä toisiaan, jolloin analyyttinen ratkaisukin voisi olla mahdollinen.

edit: homma toimii tietysti vain siihen pisteeseen asti, jossa sylinterin keskipisteeseen asetettava pallo on kokonaan sylinterin sisällä, eli sylinterin pituus suurempi kuin halkaisija.

edit2: sylinteriin asetettavaa palloa ei tarvitse asettaa sylinterin keskipisteeseen, vaan siten että se on kokonaan sylinterin sisällä (ja sylinteri jaetaan siitä pisteestä). Tällöin äärellisellä määrällä rekursioaskeleita päädytään tilanteeseen, jossa sylintereiden pituus on korkeintaan halkaisija ja keskipisteiden etäisyys korkeintaan bounding sphere -pallojen säteiden summa. Jos ratkaisua ei ole tullut, niin tuosta voi jatkaa approksimatiivisillä menetelmillä tai sitten joku fiksu keksii analyyttisen ratkaisun tuohon tilanteeseen.

Vierailija

Mä olen ainakin löytänyt Maolista ratkaisun moniin ,jopa useisiin , koulukurssien ulkopuolisiin ongelmiin. Jos haluan esim. tietää onko nakkiimakkarassa enempi kaloreja kuin lauantaimakkarassa( s. 140) tai ,että suhiseeko tuuli esteissä ja että leviääkö aaltojen vaahto tuulennopeuden ollessa 10.6m/s ,voin huoletta unohtaa murheeni ja tarttua Maoliin kuin vanhaan ystävään , vastaus o taattu.

Uusimmat

Suosituimmat