Avaruusaluksen liikkuminen maksiminopeudella - MATEMATIIKKAA

Voit pyytää apua ohjelmointiongelmiin täältä.
Post Reply
User avatar
skinkken
Advanced Member
Posts: 453
Joined: Sat Sep 01, 2007 4:00 pm
Location: Helsinki

Avaruusaluksen liikkuminen maksiminopeudella - MATEMATIIKKAA

Post by skinkken » Thu Mar 29, 2012 4:57 pm

Olen tekemässä ylhäältä päin kuvattua avaruuspeliä (Escape Velocity -tyylinen), ja ongelmana on että aluksella pääsee kovempaa vinosti kuin perusilmansuuntiin. Matematiikan taidot ei riitä.

Code: Select all

xliike=xliike+Cos(aluksen_kulma)*jotain
yliike=yliike+Sin(aluksen_kulma)*jotain
(xliike ja yliike ovat siis x- ja y-nopeudet)

Ongelma 1:
Jos tekee näin, alus kiihdyttää nopeammin vasemmalle ylös, oikealle ylös, oikealle alas ja vasemmalle alas.

Ongelma 2:
-Jos rajoitan xliikkeen ja yliikkeen -10 ja 10 välille, vinottain maksiminopeus on suurempi.
-Jos taas säädän oikean maksiminopeuden (x- ja y-nopeudesta laskettuna), ei voi muuttaa aluksen kulkusuuntaa kiihdyttämällä eri suuntaan jos nopeus on liian suuri, vaan pitää ensin jarruttaa kiihdyttämällä vastakkaiseen suuntaan.


Ongelma 1:n ratkaisu:
Pitäisi laskea kiihdytys jotenkin eri tavalla, että jos alus osoittaa vinoihin suuntiin, se ei kiihdytä nopeammin vaan yhtä nopeasti kuin muihinkin suuntiin.


Ongelma 2:n ratkaisu:
Haluaisin että nopeus (x- ja y-nopeudesta laskettuna) ei ylitä maksiminopeutta, mutta aluksen kulkusuuntaa voi kuitenkin muuttaa kiihdyttämällä eri suuntaan.

Tiedän että oikeasti avaruudessa ei ole maksiminopeutta mutta peliin haluan sellaisen.
Last edited by skinkken on Thu Mar 29, 2012 11:00 pm, edited 1 time in total.
Valmiit pelit: House of Horrors , Battle Zone , Über Ball , Itdoti , Space Chaos , Bloxxplosives
Projekti jota teen ehkä joskus vielä: viewtopic.php?f=11&t=2636 <-- Tämä rivi päivitetty 14.1.2013

User avatar
Latexi95
Guru
Posts: 1164
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: Avaruusaluksen liikkuminen maksiminopeudella - MATEMATII

Post by Latexi95 » Thu Mar 29, 2012 5:29 pm

Ratkaisuna on vektorin pituuden laskeminen. Eli pythagoraan lauseen avulla lasketaan paljonko alus nyt olisi liikkumassa. Ja mikäli se on liikaa, niin sitten jaa molemman vektorin komponentit nykyisellä pituudella ja sitten kerro maksimipituudella.

Code: Select all

nopeus# =Sqrt(liikeX*liikeX + liikeY *liikeY)
if nopeus# > maksiminopeus then
    liikeX = liikeX / nopeus *maksiminopeus
    liikeY = liikeY / nopeus *maksiminopeus
endif

User avatar
axu
Devoted Member
Posts: 854
Joined: Tue Sep 18, 2007 6:50 pm

Re: Avaruusaluksen liikkuminen maksiminopeudella - MATEMATII

Post by axu » Thu Mar 29, 2012 6:21 pm

skinkken wrote:Pitäisi laskea kiihdytys jotenkin eri tavalla, että jos alus osoittaa vinoihin suuntiin, se ei kiihdytä nopeammin vaan yhtä nopeasti kuin muihinkin suuntiin.

Code: Select all

xliike=xliike+Cos(aluksen_kulma)*kiihtyvyys
yliike=yliike+Sin(aluksen_kulma)*kiihtyvyys
Sinulla oli tuossa jälkimmäisessä lauseessa sinin sijasta kosini. Nyt se kiihdyttää oikein joka suuntaan (muista, että xliike ja yliike pitää olla liukulukuja, että liike on sulavaa).

Tekisin tuon maksiminopeuden lisäämällä alukseen jonkinverran kitkaa (tiedän, avaruudessa vastusvoima on erittäin pieni), jolloin alus on jopa mahdollista pysäyttää. Latexin koodia hieman muokattuna:

Code: Select all

nopeus# = Sqrt(liikeX * liikeX + liikeY * liikeY)
uusi_nopeus# = nopeus# * 0.99
liikeX = (liikeX / nopeus) * uusi_nopeus#
liikeY = (liikeY / nopeus) * uusi_nopeus#
Tuo .99 määrittää kitkavoiman suuruuden. Mitä lähempänä 1:stä, sen vähemmän liikettä vastustetaan. 0 on minimi (jolloin alus ei liiku ollenkaan). Nuo sulut jakolaskun ympärillä on vain laskutoimituksen lukemista selventämään.

Jos kitkavakiota ei saa säädettyä sopivaksi niin, että alusten hidastuvuus olisi sopiva ja maksiminopeus kohdillaan, kolmas vaihtoehto on tietenkin lisätä molemmat rajoitteet:

Code: Select all

nopeus# = Sqrt(liikeX * liikeX + liikeY * liikeY)
If nopeus# > maksiminopeus Then
    liikeX = (liikeX / nopeus) * maksiminopeus
    liikeY = (liikeY / nopeus) * maksiminopeus
Else
    uusi_nopeus# = nopeus# * 0.99
    liikeX = (liikeX / nopeus) * uusi_nopeus#
    liikeY = (liikeY / nopeus) * uusi_nopeus#
EndIf
Jos tämä viesti on kirjoitettu alle 5 min. sitten, päivitä sivu. Se on saattanut jo muuttua :roll:
Image

User avatar
skinkken
Advanced Member
Posts: 453
Joined: Sat Sep 01, 2007 4:00 pm
Location: Helsinki

Re: Avaruusaluksen liikkuminen maksiminopeudella - MATEMATII

Post by skinkken » Thu Mar 29, 2012 11:00 pm

Kiitos ripeistä vastauksista.

Aloitusviestissä on virhe kun sen nopeasti tein esimerkiksi, pelin koodissa se on oikein. En nyt ole koneella, mutta tuo latexin maksiminopeus näyttäisi toimivalta(vaikkakin nopeuden osasin laskea jo alunperin, distancella: distance (0,0,cos(kulma)*kiihtyvyys,sin(kulma)*kiihtyvyys). Pythagoraan on varmaan nopeampi)(kamalia sulkusokkeloita näköjään teen viesteihin :?)

Itseasiassa aluksellani on myös vähän kitkaa, nopeudet kerrotaan 0.995 tai jotain.

Vielä tarvittais vastausta ongelmaan 1. Eli alus kiihdyttää 45 asteen kulmassa enemmän kuin nollakulmassa.
Valmiit pelit: House of Horrors , Battle Zone , Über Ball , Itdoti , Space Chaos , Bloxxplosives
Projekti jota teen ehkä joskus vielä: viewtopic.php?f=11&t=2636 <-- Tämä rivi päivitetty 14.1.2013

Awaclus
Forum Veteran
Posts: 2939
Joined: Tue Aug 28, 2007 2:50 pm

Re: Avaruusaluksen liikkuminen maksiminopeudella - MATEMATII

Post by Awaclus » Thu Mar 29, 2012 11:17 pm

skinkken wrote:Kiitos ripeistä
Ai näistä? Vai näistäkö kiität? :D

Sitten asiaan.
skinkken wrote:Itseasiassa aluksellani on myös vähän kitkaa, nopeudet kerrotaan 0.995 tai jotain.
Avaruudessa ei ole juurikaan kitkaa, ja sillä äärimmäisen vähäisellä määrällä kitkaa joka siellä kvanttifysiikan ansiosta on, on niin pieni vaikutus, että realistisesti toteutettuna pelaaja tuskin edes huomaisi sitä.

EDIT: huono lauseenrakenne korjattu

User avatar
axu
Devoted Member
Posts: 854
Joined: Tue Sep 18, 2007 6:50 pm

Re: Avaruusaluksen liikkuminen maksiminopeudella - MATEMATII

Post by axu » Fri Mar 30, 2012 9:49 am

skinkken wrote:En nyt ole koneella, mutta tuo latexin maksiminopeus näyttäisi toimivalta(vaikkakin nopeuden osasin laskea jo alunperin, distancella: distance (0,0,cos(kulma)*kiihtyvyys,sin(kulma)*kiihtyvyys). Pythagoraan on varmaan nopeampi)(kamalia sulkusokkeloita näköjään teen viesteihin :?)

Vielä tarvittais vastausta ongelmaan 1. Eli alus kiihdyttää 45 asteen kulmassa enemmän kuin nollakulmassa.
Muistaakseni Distance on nopeampi. En osaa sanoa enempää tuohon ykköskohtaan, sen pitäisi toimia täysin moitteettomasti tuolla tavalla. Yksi mahdollisuus, joka tulee mieleen, on että laitat kitkan erikseen X- ja Y-komponentteihin, mutta sillä pitäisi olla päinvastainen vaikutus. Ja on se niin pieni, ettei sitä edes huomaa.
Onhan nuo nopeuden komponentit (xliike ja yliike) liukulukuja? Jos ne ovat kokonaislukuja, nuo kosinit ja sinit voivat pyöristyä ylöspäin sopivassa kulmassa niin, että kokonaiskiihtyvyys onkin suurempi.
Chaosworm wrote:Avaruudessa ei ole juurikaan kitkaa, ja sillä äärimmäisen vähäisellä määrällä kitkaa joka siellä kvanttifysiikan ansiosta on, on niin pieni vaikutus, että realistisesti toteutettuna pelaaja tuskin edes huomaisi sitä.
Avaruudessa tietääkseni ei ole absoluuttista tyhjiötä, eli siellä on myös hiukkasia, jotka vastustavat liikettä. Ja onneksi peleissä ei ole kyse realistisuudesta, vaan hauskanpidosta. Nyrkkisääntönä pelattavuus > realistisuus.
Jos tämä viesti on kirjoitettu alle 5 min. sitten, päivitä sivu. Se on saattanut jo muuttua :roll:
Image

User avatar
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: Avaruusaluksen liikkuminen maksiminopeudella - MATEMATII

Post by koodaaja » Fri Mar 30, 2012 10:15 am

Itse katsoisin kauneimmaksi ratkaisuksi määrätä erilaisten alusten liikkuvuus niihin käytettävän kitkakertoimen ja työntövoiman perusteella. Tämä ei välttämättä ole realistisin, mutta kenties intuitiivisin ratkaisu. Seuraa vielä hassunhauska esimerkkiohjelma muutamalla satunnaisarvolla.

Code: Select all

Dim x#(9), y#(9), xvel#(9), yvel#(9), ang#(9), col#(9), thrust#(9), fric#(9), i

For i = 0 To 9
    x(i) = 200
    y(i) = 150
    thrust(i) = Rnd(.001, .01)
    fric(i) = Rnd(.98, 1.0)
    col(i) = (Rand(255) Shl 16)+(Rand(255) Shl 8)+Rand(255)
Next i

Repeat
    Lock
    For i = 0 To 9
        ang(i) = WrapAngle(ang(i)+LeftKey()-RightKey())
        
        xvel(i) = xvel(i) * fric(i) + thrust(i) * Cos(ang(i)) * (UpKey()-DownKey())
        yvel(i) = yvel(i) * fric(i) - thrust(i) * Sin(ang(i)) * (UpKey()-DownKey())
        
        x(i) = x(i) + xvel(i)
        y(i) = y(i) + yvel(i)
        
        Color 0, 0, col(i)
        
        Line x(i)+2.5*Cos(ang(i)), y(i)-2.5*Sin(ang(i)), x(i)+2.5*Cos(ang(i)+135), y(i)-2.5*Sin(ang(i)+135)
        Line x(i)+2.5*Cos(ang(i)), y(i)-2.5*Sin(ang(i)), x(i)+2.5*Cos(ang(i)-135), y(i)-2.5*Sin(ang(i)-135)
    Next i
    Unlock
    DrawScreen
Forever

User avatar
skinkken
Advanced Member
Posts: 453
Joined: Sat Sep 01, 2007 4:00 pm
Location: Helsinki

Re: Avaruusaluksen liikkuminen maksiminopeudella - MATEMATII

Post by skinkken » Fri Mar 30, 2012 3:15 pm

axu wrote:
skinkken wrote:En nyt ole koneella, mutta tuo latexin maksiminopeus näyttäisi toimivalta(vaikkakin nopeuden osasin laskea jo alunperin, distancella: distance (0,0,cos(kulma)*kiihtyvyys,sin(kulma)*kiihtyvyys). Pythagoraan on varmaan nopeampi)(kamalia sulkusokkeloita näköjään teen viesteihin :?)

Vielä tarvittais vastausta ongelmaan 1. Eli alus kiihdyttää 45 asteen kulmassa enemmän kuin nollakulmassa.
En osaa sanoa enempää tuohon ykköskohtaan, sen pitäisi toimia täysin moitteettomasti tuolla tavalla. Yksi mahdollisuus, joka tulee mieleen, on että laitat kitkan erikseen X- ja Y-komponentteihin, mutta sillä pitäisi olla päinvastainen vaikutus. Ja on se niin pieni, ettei sitä edes huomaa.
Onhan nuo nopeuden komponentit (xliike ja yliike) liukulukuja?
Tänään päivällä laskeskelin ja tajusin että toimiihan se sittenkin. :D Hämäsi vain tuo maksiminopeusjuttu.

Ongelmat taitaisi siis olla tältäerää ratkaistu (en tosin ole vielä kokeillut, mutta saan varmaan toimimaan). Kiitos kaikille avusta!

Chaosworm, sanalla ripeistä tarkoitan adjektiivia ripeä elatiivina monikossa.
Valmiit pelit: House of Horrors , Battle Zone , Über Ball , Itdoti , Space Chaos , Bloxxplosives
Projekti jota teen ehkä joskus vielä: viewtopic.php?f=11&t=2636 <-- Tämä rivi päivitetty 14.1.2013

Post Reply