Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java: Liikkeen suunta

olio00 [14.04.2011 19:59:25]

#

Miten saa toteutettua tälläisen: Kuvan pitäisi lähteä hiiren klikkauksen suuntaa suoraan tietystä pisteestä eli kaksi koordinaattia tiedetään.

Metabolix [14.04.2011 21:06:33]

#

Lue matematiikkaoppaasta kulmia ja vektoreita käsittelevät osat, niin tiedät, mitä laskea. Sitten tarvitset vain jonkin tavan muuttaa kuvan sijaintia; tämä riippuu täysin ohjelmasi rakenteesta.

Pete2 [14.04.2011 21:14:06]

#

/*
     Objekti ( x1, y1 ) siirtyy objektin ( x2, y2 ) suuntaan
     k on vakio, joka määrää siirrytyn matkan pituuden
*/

int s = Math.sqrt( Math.pow( x1 - x2, 2 ) + Math.pow( y1 - y2, 2 ) );
x1 += k * ( x1 - x2 ) / s;
y1 += k * ( y1 - y2 ) / s;

Kapteeni [15.04.2011 19:56:19]

#

Ehdottaisin Pete2:n koodiin kahta muutosta. Ensinnäkin, Math.sqrt palauttaa reaaliluvun, joten s-muuttuja voisi olla tyyppiä double. Jos Petellä on hyvä syy int-tyypin käyttöön, voi hän tietenkin kertoa.

Tämä ei ole välttämättä iso ero ohjelman toiminnan kannalta. Mielestäni ei kuitenkaan kannata pyöristää arvoja liian aikaisin, ellei ole varma ettei se haittaa.

Toinen kohta on tapaus, jossa s on nolla. Tämä seuraa siitä, kun x1==x2 ja y1==y2, eli klikkaus tapahtuu samassa paikassa kuin missä kuva on. Nollalla jakaminen on ongelmallista, joten suosittelisin seuraavaa muutosta.

if (s > minDistance) {
    x1 += k * ( x1 - x2 ) / s;
    y1 += k * ( y1 - y2 ) / s;
}

Tässä siis liike tapahtuu vain jos s, eli etäisyys kuvasta klikattuun kohtaan, on yli jonkin halutun minimin. MinDistance-vakiolla voi vaikuttaa siihen, kuinka kaukana klikkauskohdan pitää olla kuvan nykyisestä paikasta, jotta liikettä tapahtuisi. On nimittäin aika hassua, että kuvaa zuumaa yhtäkkiä jonkin matkaa johonkin yllättävään suuntaan, kun sen päälle klikkaa hiirellä.

Kokeilemalla eri arvoja tälle vakiolle saa ohjelmaan sopivan arvon löydettyä aika nopeasti. Voi olla, että riittää testata s>0:kin. Kokeilemalla se selviää, kun itse tietää miten ohjelmansa suunnilleen haluaa toimivan.

Tulipa pitkä selitys lyhyen korjausehdotuksen perusteeksi. Älkää nyt pahastuko. Ei ole aikaa kirjoittaa lyhyttä.

Pete2 [15.04.2011 23:39:25]

#

Muutokset ovat tietenkin aiheellisia, mutta en tarkoittanutkaan pätkää suoraan kopioitavaksi, vaan pelkästään matemaattiseksi malliksi, mitä nyt hieman javan syntaksia viestin sijainnin takia sisälsikin.

Et kuitenkaan huomauttanut huolimattomuusvirheestäni.

x1 += k * ( x2 - x1 ) / s;
y1 += k * ( y2 - y1 ) / s;

olio00 [16.04.2011 01:33:53]

#

Kiitos avusta. Ohjelmani toimii nytten niin kuin pitää, mutta joiduin vaihtaa
x1 += k * ( x2 - x1 ) / s;
y1 += k * ( y2 - y1 ) / s;

tälläiseksi:
x1 -= k * ( x2 - x1 ) / s;
y1 -= k * ( y2 - y1 ) / s;

Pete2 [16.04.2011 12:53:00]

#

Seuraavat toimivat:

x1 += k * ( x2 - x1 ) / s;
y1 += k * ( y2 - y1 ) / s;

x1 -= k * ( x1 - x2 ) / s;
y1 -= k * ( y1 - y2 ) / s;

Seuraavat eivät:

x1 += k * ( x1 - x2 ) / s;
y1 += k * ( y1 - y2 ) / s;

x1 -= k * ( x2 - x1 ) / s;
y1 -= k * ( y2 - y1 ) / s;

Vastaus

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

Tietoa sivustosta