Tyhmät kysymykset (II/2009)

Voit pyytää apua ohjelmointiongelmiin täältä.
Locked
SPuntte
Tech Developer
Tech Developer
Posts: 650
Joined: Mon Aug 27, 2007 9:51 pm
Location: Helsinki, Finland
Contact:

Re: Tyhmät kysymykset (II/2009)

Post by SPuntte »

phons wrote:Ehkei niin tyhmä kysymys mutta kuitenkin. Eli ongelmana on "heilurin fysiikka". Eli siis ongelma on se etten osaa laskea narun heiluvan pään x- ja y:tä. Tai no joo osaan... Mutta siis että jos se lähetetään esim kulmasta 330, ja pituus on sata niin mikä on voima jolla se sitten liikkuu ja kuinka paljon se sitten vähitellen hiipuu... Ei tarvitse lähettää mitään tuhatrivistä koodia, vaan ihan suora selkeä selitys tämän laskemiseen riittää...
Kysymys ei todella ole mitenkään tyhmä, sillä heilurit ovat yleensä matemaattisesti hankalasti käsiteltäviä ilman fysikaalisia idealisointeja. Tämä tarkoittaa vaikkapa sitä, että heilurin naru on venymätön ja kiinnityskohdassaan kitkaton, heilurin paino on pistemäinen (käytännössä tietysti pieni ja massiivinen) sekä heilurin amplitudi eli heilahduksen suuruus pieni.

Ilmaus "voima, jolla se liikkuu" on aika epäselvä. Lisäksi en tiedä, miten tulet heiluria käyttämään, joten en osaa sanoa, pitäisikö ongelmaa lähestyä analyyttisesti vai numeerisesti.

Analyyttinen tarkoittaa sitä, että heilurin tilaa kuvaa jatkuva ajan funktio(=laskukaava), josta otat "ruutukaappauksia" kulloisenkin framen piirtohetkellä. Analyyttiseen malliin on kuitenkin erittäin hankalaa sisällyttää minkäälaista interaktiivisuutta: heiluri vain heiluu, eikä käyttäjä tai mahdolliset muut ohjelman tapahtumat voi siihen simulaation alun jälkeen vaikuttaa. Jos tämä kuulostaa hyvältä vaihtoehdolta, voit vaihtoehtoisesti joko muodostaa heilurisi ominaisuuksien perusteella 2. asteen differentiaaliyhtälön (joka on siis korkeakoulumatematiikkaa, missä en ole vielä kauhean hyvä, kun lukiossa edelleen heilun) ja ratkaista sen, tai sitten etsiä valmista ratkaisua googlesta hakusanoilla "matemaattinen heiluri" ja englanniksi "mathematical pendulum".

Vastaavasti numeerinen ratkaisu tarkoittaa, että integroit (suomeksi esim. lasket) heilurin tilaa framesta toiseen. Eli lasket edellä mainitsemiani "ruutukaappauksia" itse sen perusteella, mitä heilurille simulaatiossa kullakin hetkellä tapahtuu. Tämä mahdollistaa esimerkiksi heilurin törmäykset muihin kappaleisiin. Numeerisessa simulaatiossa myös käyttäjän on helpompi vaikuttaa heilurin liikkeeseen.

Jospa vastaisit kysymykseen, mitä aiot heilurillasi tehdä, ennenkuin selitän enempää?
CoolBasic henkilökuntaa
Tech-kehittäjä
CoolBasic Classic, Cool VES

CoolPhysicsEngine | MissileSystem | Jana-ympyrä -törmäys | cbSimpleTexture | CoolCPLX
phons
Guru
Posts: 1056
Joined: Wed May 14, 2008 10:11 am

Re: Tyhmät kysymykset (II/2009)

Post by phons »

No, tarkoitukseni olisi tehdä erääseen peliini sellainen tarzan-tyylinen juttu kun ukkeli ottaa narusta kiinni niin liitä sitten sen kanssa esim. jonkun ison rotkon yli, tällä hetkellä tämä "naru-systeemi" on aika oudon nälöinen. En oikein keksinyt miten tällaisen tehdä mutta sitten 7. luokan fysiikan tunnilla "leikittiin" heilurilla, ja tuli mieleen, että sen voisi tehdä samalla tavalla. Tosin nyt minusta tuntuu, että tämä käy liian vaikeaksi. Ja jos tiedät jonkun toisen tavan, helpomman, toteuttaa tämän niin kerro vaan.
Image
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Tyhmät kysymykset (II/2009)

Post by MaGetzUb »

phons wrote: Ilmoita tämä viesti
Vastaa lainaamalla
No, tarkoitukseni olisi tehdä erääseen peliini sellainen tarzan-tyylinen juttu kun ukkeli ottaa narusta kiinni niin liitä sitten sen kanssa esim. jonkun ison rotkon yli, tällä hetkellä tämä "naru-systeemi" on aika oudon nälöinen. En oikein keksinyt miten tällaisen tehdä mutta sitten 7. luokan fysiikan tunnilla "leikittiin" heilurilla, ja tuli mieleen, että sen voisi tehdä samalla tavalla. Tosin nyt minusta tuntuu, että tämä käy liian vaikeaksi. Ja jos tiedät jonkun toisen tavan, helpomman, toteuttaa tämän niin kerro vaan.
Dream Physics Enginelläni ainakin heilurin teko on helppoa. :D Mutta jos haluat itse pähkäillä sen niin ole hyvä vain. Tässä nyt on kuitenki sinulle tehty heiluri:

Code: Select all

Include "Dream Physics Libary.cb"

SCREEN 800,600

particle_1 = AddParticle(Screenwidth()/2,ScreenHeight()/2)
particle_2 = AddParticle(Screenwidth()/2,ScreenHeight()/2)
SetParDist(particle_1,particle_2,100)
SetParPosition(particle_1,ScreenWidth()/2,ScreenHeight()/2)
SetParPosition(particle_2,ScreenWidth()/2,ScreenHeight()/2+100)
AddText "Paina hiiren vasenta näppäintä siirtääksesi heilurin toista päätä"
AddText "Vaihda hiiren rullasta heilurin pituutta"
Repeat 
     
     
        
     
     SetParPosition(particle_1,ScreenWidth()/2,ScreenHeight()/2)
     If MouseDown(1) Then  SetParPosition(particle_2,MouseX(),MouseY())
          
     SetParDist(particle_1,particle_2,100+Mousez())
     DrawVector(particle_1,particle_2)

     Circle GetParX(particle_2)-10,GetParY(particle_2)-10,20     
     CalculateParPositions(0,0.3)
        
DrawScreen
Until KeyHit(1)
Ja jos sinulla ei ole Dream Physics Engine:ä niin voit ladata sen täältä. (ekasta viestistä löytyvä liite)
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
Feuer
Devoted Member
Posts: 520
Joined: Tue Jun 16, 2009 11:13 am
Contact:

Re: Tyhmät kysymykset (II/2009)

Post by Feuer »

Saako tyyppikokelman keskelle luotua jäseniä vai siirtyvätkö ne automaattisesti kokoelman loppuun?
Asus P8P67 LE/Intel Core i5 2500K/ GTX560/ 8GT RAM/750GT HDDt + 120GT SSD + 13" Macbook Pro
Blogi - Peräpohjola - MERPG
User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: Tyhmät kysymykset (II/2009)

Post by Jonez »

Siirtyvät loppuun, mutta voit heti luonnin jälkeen siirrellä niitä tyyppikokoelmassa miten haluat. Tyypit eivät ole täysin kuten taulukot, joten ihan suoraan seuraavanlainen systeemi ei toimi:

SIIRRÄ "tyyppi" KOKOELMAN TYYPIT kolmanneksi.

Siirtelyt tapahtuvat käyttäen komentoa Insert ja funktioita Before(), After(), First() ja Last(). Voit myös ottaa (vanhan) tyypin osoitteen ylös funktiolla ConvertToInteger(), ja asettaa juuri luodun tyypin tämän vanhan tyypin eteen:

Code: Select all

Type TYYPIT
    Field teksti As String
EndType

//Luodaan 10 jäsentä kokoelmaan, annetaan numero järjestyksessä.
For i = 1 To 10
    it.tyypit = New( tyypit )
    it\teksti = i
Next i

//Otetaan kolmannen jäsenen osoite ylös.
For kaikkiTYYPIT.TYYPIT = Each TYYPIT
    rivi + 1
    If rivi = 3 Then
        //muutetaan osoite luettavaksi kokonaislukusarjaksi
        otaTyyppi = ConvertToInteger( kaikkiTYYPIT )
    EndIf
Next kaikkiTYYPIT

//Luodaan uusi jäsen, eli nyt 11:sta jäsen.
uusiTyyppi.TYYPIT = New( TYYPIT )
uusiTyyppi\teksti = "Vika. Vai onko?"

//muutetaan osoite takaisin 
kolmasTyyppi.TYYPIT = ConvertToType( otaTyyppi )

//asetetaan kolmannen jäsenen jälkeisen jälkeen (After)
Insert uusiTyyppi, After( kolmasTyyppi )

Repeat

    rivi = 0
    For it.tyypit = Each tyypit
        rivi + 1
        Text 20, 20 * rivi, it\teksti
    Next it
    
    DrawScreen
Forever
HUOM: Tyyppien siirtelyn kanssa täytyy olla erittäin varovainen. Ellet tiedä täysin mitä teet, saat helposti aikaan mavin. Jos edellisessä esimerkissä yrität siirtää jäsenen nr. 10 JÄLKEEN, seuraa mav (menee yli kokoelman). Jos yrität siirtää nr. 9:n jälkeen, se kyllä toimii, mutta se oikesti siirtää alkuperäiselle paikalle, eli siitä ei ole hyötyä. Jos siirrät numeron 10 KOHDALLE (pelkkä Insert), se toimii, mutta tulos on edelleen +-0.

Edellinen esimerkki toimisi täysin ilman ConvertToInteger():iä ja ConvertToType():ä näin:

Code: Select all

otaTyyppi = ConvertToInteger( kaikkiTYYPIT )
//muutetaan tälläaiseksi:
otaTyyppi.TYYPIT = kaikkiTYYPIT

//------------

//jolloin tätä ei tarvita:
kolmasTyyppi.TYYPIT = ConvertToType( otaTyyppi )

//------------

//ja tähän pieni muutos:
Insert uusiTyyppi, After( kolmasTyyppi )
//muuttuu:
Insert uusiTyyppi, After( otaTyyppi )
Mutta funktiota käytettäessä on pakko käyttää ConvertToInteger():iä, joten laitoin esimerkin suoraan tähän.

Tajusin tässä että näitä asioita on aika hankala selittää. Kannattaa katsoa tämä tutoriaali.
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
Tuxu
Member
Posts: 81
Joined: Tue Oct 14, 2008 5:54 pm
Location: Jyväskylä
Contact:

Re: Tyhmät kysymykset (II/2009)

Post by Tuxu »

Tyhmä kysymys: Miten saan CB:llä luotua tekstitiedoston(.txt) tyhjästä?
(en pikaisella etsinnällä onnistunut vastausta löytämään)
aivot pohtii ja raksuttaa
TuxuGames | Projektiblogi
Sly_Jack0
Devoted Member
Posts: 612
Joined: Mon Dec 10, 2007 8:25 am

Re: Tyhmät kysymykset (II/2009)

Post by Sly_Jack0 »

Avaat vain OpenToWrite()- tai OpentoEdit()-funktiolla tiedoston jota ei ole olemassa ja se luodaan automaagisesti.

Code: Select all

f = OpenToWrite("tätätiedostoaeiollutolemassa.txt")
CloseFile f
Tuxu
Member
Posts: 81
Joined: Tue Oct 14, 2008 5:54 pm
Location: Jyväskylä
Contact:

Re: Tyhmät kysymykset (II/2009)

Post by Tuxu »

Kiitos. Enpä tajunnut itse :P
aivot pohtii ja raksuttaa
TuxuGames | Projektiblogi
Guest

Re: Tyhmät kysymykset (II/2009)

Post by Guest »

Miksi ei toimi, eli laatikon pitäisi pienentyä kun hiirtä rullaaa alas,
Se isonee kun pyörittää ylös,
mutta laatikko ei pienene kun hiirtä rullaa alas.

Code: Select all

    koko = 20

    Repeat
    
       If MouseMoveZ() > 0 Then koko + 5
       If MouseMoveZ() < 0 Then koko - 5

       Box MouseX(), MouseY(), koko, koko
       DrawScreen
    
    Forever
Herra Siili
Advanced Member
Posts: 308
Joined: Tue Nov 25, 2008 8:06 pm
Contact:

Re: Tyhmät kysymykset (II/2009)

Post by Herra Siili »

Minä tekisin sen näin:

Code: Select all

koko = 20

Repeat

	koko = koko + MouseMoveZ()*5

	Box MouseX(), MouseY(), koko, koko
	DrawScreen

Forever
EDIT:

Miksi DrawScreen MAVaa?

Code: Select all

SCREEN 800,600

masterimage=MakeImage(30,30)
DrawToImage masterimage
	Color cbOrange
	Circle 15,15,15,1
	Color cbBlack
DrawToScreen
masterobject=MakeObject(72)
PaintObject masterobject,-masterimage
DeleteImage masterimage

Dim pumpkin(100)

For i=0 To 100
	pumpkin(i)=CloneObject(masterobject)
	ScreenPositionObject pumpkin(i),Rand(790),Rand(590)
	kulma=Rand(360)
	RotateObject pumpkin(i),kulma
	ShowObject pumpkin(i),ON
Next i

DeleteObject masterobject

Repeat
	For i=0 To 100
		MoveObject pumpkin(i),3
		If ObjectSX(pumpkin(i))<0 Or ObjectSX(pumpkin(i))>790 Then
			TurnObject pumpkin(i),180
		EndIf
		If ObjectSY(pumpkin(i))<0 Or ObjectSY(pumpkin(i))>590 Then
			TurnObject pumpkin(i),180
		EndIf
	Next i
	DrawScreen
Forever

Function ObjectSX(obj)
    Return ObjectX(obj)+ScreenWidth()/2-CameraX()
EndFunction

Function ObjectSY(obj)
    Return -ObjectY(obj)+ScreenHeight()/2+CameraY()
EndFunction
[/edit]
a.k.a. Gehock
Noviisi
Newcomer
Posts: 11
Joined: Thu Sep 10, 2009 11:51 pm

Re: Tyhmät kysymykset (II/2009)

Post by Noviisi »

Herra Siili wrote:Miksi DrawScreen MAVaa?
Koska poistat masterobjectin, josta on olemassa klooneja?
phons
Guru
Posts: 1056
Joined: Wed May 14, 2008 10:11 am

Re: Tyhmät kysymykset (II/2009)

Post by phons »

Sekä käytät 101 taulukkoa vaikka loit vain 100, eli For looppi päättyy 99.
Image
User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: Tyhmät kysymykset (II/2009)

Post by Jonez »

phons wrote:Sekä käytät 101 taulukkoa vaikka loit vain 100, eli For looppi päättyy 99.
Dim varaa soluja 0 - varausmäärä, eli varausmäärä + 1.

Dim taulu( 10 ) luo siis 11 solua. Herra Siili käyttää sitä juuri oikein.

MakeMemBlock() varaa muistia eri tavalla: 0 - varausmäärä - 1 tavua.
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
Guest

Re: Tyhmät kysymykset (II/2009)

Post by Guest »

Osaako Writeline tai muu vastaava tarkistaa avatusta tekstitiedostosta että onko siellä jo ennestään kirjoitusta, ja jos on niin ei sitten kirjoittaisi sen päälle, vaan osaisi vaihtaa riviä?
Henkru
Advanced Member
Posts: 359
Joined: Sun Aug 26, 2007 2:46 pm

Re: Tyhmät kysymykset (II/2009)

Post by Henkru »

Guest wrote:Osaako Writeline tai muu vastaava tarkistaa avatusta tekstitiedostosta että onko siellä jo ennestään kirjoitusta, ja jos on niin ei sitten kirjoittaisi sen päälle, vaan osaisi vaihtaa riviä?

Code: Select all

f = OpenToEdit("asd.txt")
If FileSize("asd.txt") <> 0 Then SeekFile f, FileSize("asd.txt")
WriteLine f, "jotakin"
CloseFile f
skorpioni-cb
Advanced Member
Posts: 364
Joined: Wed Dec 03, 2008 3:48 pm
Location: Turku

Re: Tyhmät kysymykset (II/2009)

Post by skorpioni-cb »

Todella tyhmä kysymys:

"Voiko taulukon laittaa fuktioon?" Toisin muotoiltu:

"Voiko Dim-komennon laittaa Function ja EndFunction-systeemien väliin?"
En tiedä, mitä tiedän, mutta tiedän ettei se ole mitään kaunista.

I know not what I know, but I do know that it's not beautiful.
Sumppi
Active Member
Posts: 163
Joined: Wed Dec 03, 2008 8:07 pm

Re: Tyhmät kysymykset (II/2009)

Post by Sumppi »

skorpioni-cb wrote:Todella tyhmä kysymys:

"Voiko taulukon laittaa fuktioon?" Toisin muotoiltu:

"Voiko Dim-komennon laittaa Function ja EndFunction-systeemien väliin?"
Minkä takia et voinut itse kokeilla asiaa, vaan kysyit täällä? Olisit saanut itse kokeilemalla vastauksen paljon nopeammin.

Code: Select all

Print aaa()
WaitKey
Function aaa()
    Dim taulukko(1)
    If taulukko(1)=0 Then Return "onnistui!"
EndFunction 
Grandi wrote:Sumpille piste. Jos nimimerkin m-kirjain muutetaan r:ksi, p-kirjain v:ksi ja 3 viimeistä kirjainta "vor":iksi, saadaan "survivor", eli suomeksi selviytyjä. Melkoinen yhteensattuma!
User avatar
axu
Devoted Member
Posts: 854
Joined: Tue Sep 18, 2007 6:50 pm

Re: Tyhmät kysymykset (II/2009)

Post by axu »

Sumppi wrote:
skorpioni-cb wrote:Todella tyhmä kysymys:

"Voiko taulukon laittaa fuktioon?" Toisin muotoiltu:

"Voiko Dim-komennon laittaa Function ja EndFunction-systeemien väliin?"
Minkä takia et voinut itse kokeilla asiaa, vaan kysyit täällä? Olisit saanut itse kokeilemalla vastauksen paljon nopeammin.

Code: Select all

Print aaa()
WaitKey
Function aaa()
    Dim taulukko(1)
    If taulukko(1)=0 Then Return "onnistui!"
EndFunction 
Mutta tuossa pitää huomata että taulukko luodaan joka kerta uusiksi kun funktiota käytetään(eli nollautuu), enkä muutenkaan olisi kovin varma onko tuo nyt ihan järkevää(mieleeni hiipii ajatus jos se aina varaa uuden tilan taulukolle vaikka vanhakin olisi käytössä...).

[offtopic]Olen eriä mieltä, jos jokin kysymys vaivaa(ja tämähän on tyhmät kysymykset -topic) niin saa tulla kysymään ;)
Oma-aloitteisuus ei ole kyllä pahasta.[/offtopic]
Jos tämä viesti on kirjoitettu alle 5 min. sitten, päivitä sivu. Se on saattanut jo muuttua :roll:
Image
User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: Tyhmät kysymykset (II/2009)

Post by Jonez »

skorpioni-cb wrote:Todella tyhmä kysymys:

"Voiko taulukon laittaa fuktioon?" Toisin muotoiltu:

"Voiko Dim-komennon laittaa Function ja EndFunction-systeemien väliin?"
Voi, mutta en suosittele: joka funktiokutsulla luodaan aina uusi taulukko muistiin, eikä sitä saa poistettua mitenkään, paitsi ehkä jonkinlaisella high-tech-muistinsörkkimisellä. Ohjelman muistinkäyttö kasvaa nopeasti erittäin suuriin lukemiin. Jos välttämättä haluat jonkinlaisen taulukkosysteemin funktioosi, käytä globaalia taulukkoa (eli aivan normaalia funktion ulkopuolella luotua), tai vaikka muistipaloja. Muista kuitenkin tuhota ne ennen kuin poistut funktiosta.
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
SPuntte
Tech Developer
Tech Developer
Posts: 650
Joined: Mon Aug 27, 2007 9:51 pm
Location: Helsinki, Finland
Contact:

Re: Tyhmät kysymykset (II/2009)

Post by SPuntte »

Kaiken järjen mukaan tuon pitäisi heittää erroria toisella funktion kutsukerralla (linukka alla, joten en pääse kokeilemaan), kun jo olemassaolevaa taulukkoa yritetään määrittää uudestaan. Tämä johtuu siis siitä, että nykyiset CB:n taulukot ovat globaaleja.

Jos funktiossa on pakko luoda (tai ylikirjoittaa) taulukko, oikea koodaustapa on seuraava: taulukko alustetaan ohjelman alussa ja vain "uudelleenalustetaan" funktiossa tarvittaessa. Alustuskoolla ei ole väliä, jos funktio osaa säätää sitä itse. Kyseisessä tapauksessa järkevin alustuskoko on 1 solu eli Dim taulu(0), jolloin aikaa ei mene hukkaan.

Vielä koodina

Code: Select all

//Ohjelman alustuslausekkeet
...
Const KOKO = 1337
Dim taulu(KOKO - 1) As Tyyppi
...
//Pääohjelma
Repeat
    ...
    turhaFunktio()
    ...
Until AurinkoSammunut = True
...
//Funktiot
Function turhaFunktio()
    ...
    ReDim taulu(KOKO - 1)
    ...
EndFunction
CoolBasic henkilökuntaa
Tech-kehittäjä
CoolBasic Classic, Cool VES

CoolPhysicsEngine | MissileSystem | Jana-ympyrä -törmäys | cbSimpleTexture | CoolCPLX
Locked