Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: QB: törmäykset (VB6)

Sivun loppuun

Kipperi [29.09.2005 20:10:05]

#

Miten saa helpolla ja aloittelija-ystävällisellä tavalla määriteltyä, törmääkö esim. X Y:hyn. ja miksi tämä esimerkki ei älyä törmäystä:

x = 10
y = 200

do
x = x + .001
circle (x , 100),1,3
if x = y then print "TÖRMÄYS"
loop

rndprogy [29.09.2005 20:38:57]

#

sinun täytyy pyöristää x kokonaisluvuksi. En muista qb:stä enää kaikkia asioita mutta laita vaikka int(x).

Kipperi [29.09.2005 20:40:47]

#

eli siis if int(x)=y...? vai...?

rndprogy [29.09.2005 20:44:12]

#

Näinkin.

Kipperi [29.09.2005 20:47:18]

#

Onkos muita mahdollisia vaihtoehtoja...?

hunajavohveli [29.09.2005 20:53:36]

#

x = x + .001

Ei lisää x:ään aivan tarkalleen .001. Pyöristäminen auttaa, kuten tuossa äsken näytitkin.

Kipperi [29.09.2005 20:59:08]

#

Juu nyt rupes homma pelittään... Kun ei tuossa Qbasic käsikirjassa tollasia oikeen kerrota...

Antti Laaksonen [29.09.2005 21:13:54]

#

Liukulukuja (SINGLE, DOUBLE) ei voi vertailla tarkasti, vaan pitää tarkistaa, eroavatko luvut toisistaan tarpeeksi vähän. Syynä on lukujen tallennusmuodosta johtuvat pyöristysvirheet. Toinen vaihtoehto on käyttää kokonaislukuja (INTEGER, LONG), joita voi vertailla luotettavasti. Silloin tosin luvuissa ei voi olla desimaaliosuutta. Tämän rajoituksen voi tietyissä tapauksissa kiertää tallentamalla luvut esim. tuhatkertaisina, jolloin niihin tavallaan saa kolme desimaalia.

Jos kysymyksessä on kahden pisteen törmäys, tarkistukseen riittää tosiaan koordinaattien vertailu. Kahden suorakulmion törmäyksen voi myös melko helposti tarkistaa koordinaateista. Jos tällainen tarkistus täytyy tehdä, kannattaa hahmotella kaikki tapaukset kynällä ja paperilla ja miettiä, kuinka ne voi tunnistaa. Pelissä olevia kuvia voi myös usein kohdella tarkistuksissa suorakulmioina, jolloin välttyy monimutkaisemmilta törmäyslaskelmilta.

Heikki [29.09.2005 21:21:37]

#

Ja jos voit ajatella objektin ympyräksi, törmäystarkistus on vielä helpompaa. Kaksi ympyrää leikkaa toisensa, jos niiden keskipisteiden välinen etäisyys on pienempi kuin säteiden summa, ja kahden pisteen etäisyys lasketaan kaavalla sqrt ( (x2-x1)^2 + (y2-y1)^2 )

Kipperi [29.09.2005 21:41:02]

#

Enhän minä aloittelija tuollaisia oikein tahdo ymmärtää...:P Mutta jospa se tästä hiljalleen rupeis etenemään.

Kipperi [30.09.2005 22:30:10]

#

voisitko Heikki antaa pienen koodiesimerkin...?

Metabolix [30.09.2005 23:57:18]

#

Public Type Pallo
    X As Single
    Y As Single
    Säde As Single
End Type

Dim A As Pallo
Dim B As Pallo

' (A.X - B.X) = a         Yksi kolmion sivu
' (A.Y - B.Y) = b         Toinen kolmion sivu
' (A.Säde + B.Säde) = c
' Pythagoraan lause: a^2 + b^2 = c^2
' Siis jos (a^2 + b^2 < c^2), niin on tapahtunut törmäys.
' Yhtäsuuruus tarkoittaisi, että ympyrät juuri hipovat toisiaan
' Jos (a^2 + b^2 > c^2), niin ne eivät osu toisiinsa.

' Tämän voisi tietenkin laskea apumuuttujilla vähän kauniimmin...
If (((A.X - B.X) * (A.X - B.X)) + ((A.Y - B.Y) * (A.Y - B.Y))) < ((A.Säde + B.Säde) * (A.Säde + B.Säde)) Then
  ' Törmättiin
End If

Kipperi [05.10.2005 17:49:33]

#

Aaaargh... Sit lukion jälkeen nuo ehkä ymmärtää lopultakin... xD

Heikki [05.10.2005 18:19:15]

#

Itse asiassa tuo menee ihan yläastematikalla. On kaksi pistettä koordinaatistossa, muodostetaan näiden avulla suorakulmainen kolmio ja käytetään pythagoraan lausetta. Piirsin tästä pienen kuvan joka toivottavasti selventää asiaa hieman.

Metabolixin esimerkissä tuota kaavaa vaan muutetaan siten, että neliöjuurta ei oteta, vaan sen sijaan katsotaan onko etäisyyden neliö (eli siis se lauseke, mistä normaalisti otettaisiin neliöjuuri) pienempi kuin säteiden summan toinen potenssi.

Kipperi [05.10.2005 19:46:01]

#

Mutta entäs sama niiden pallojen kanssa...

hunajavohveli [05.10.2005 20:03:18]

#

No jos tuo etäisyys pallojen keskipisteiden välillä on pienempi kuin niiden yhteenlasketut säteet, tapahtuu törmäys.

Edit: Toinen kuva: http://koodaa.mine.nu/~vohveli/pallot.PNG

Kipperi [05.10.2005 20:13:39]

#

Koodinäyte?

Edit: Jossa on mukana myös itse pallo ja objekti mihin törmätään...

hunajavohveli [05.10.2005 20:17:04]

#

Sellaisenhan Metabolix jo antoi tuossa, mutta pistetään nyt vielä:

IF (x1-x2)^2 +(y1-y2)^2 < r1+r2 THEN Törmättiin

Kipperi [05.10.2005 20:23:20]

#

*AHAA-elämys* No nyt tais joku lähtee liikkeelle tuolla pääkopan sisässä...!

Edit: Miten hunajavohvelin esimerkissä määritetään muuttujat r1 ja r2?

Antti Laaksonen [05.10.2005 21:35:34]

#

Muuttujat r1 ja r2 tarkoittavat ympyröiden säteitä, mikä ilmenee myös kuvasta. Kaikki ympyrän kehällä olevat pisteet ovat yhtä etäällä sen keskipisteestä - säteen verran. Jos kahden ympyrän keskipisteet ovat niin lähellä toisiaan, että välissä ei ole tilaa molempien ympyröiden säteille, ympyrät osuvat toisiinsa.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta