Ahoj programátoři, vítejte u dalšího kola minisoutěže o placku a
samolepky. Naprogramujte v Javě (nebo v jiném libovolném jazyce) Koperníkův
model sluneční soustavy. Jedná se o model 9ti planet (i s Plutem), které
obíhají kolem slunce po kruhových drahách. Můžete přidat i měsíce.
Důležité je, aby se planety pohybovaly stejnými rychlostmi, jako ve
skutečnosti (samozřejmě v převedeném měřítku). Dbejte na objektový
návrh, nejhezčí funkční soustava vyhrává
Slunce má průměr 1,4 mil. km. Pokud bych ho měl ve velikosti jednoho
pixelu, Země by byla asi 110 pixelů od něj, Jupiter 550 pixelů a Neptun 3300
pixelů. Tak velký monitor nemám.
Už dávno jsem chtěl něco takového napsat, aby se i planety ovlivňovaly
mezi sebou a mezi ně strčit vlastní kosmickou loď řítící se v jejich
gravitačním poli. Třeba se k tomu konečně rozhoupu.
Ona to není až zase taková sranda, ale když se zvolí ten správný
datový model, tak by to mělo jít skoro samo. Chci to udělat v Javě, na
něčem se ji naučit musím
Zkusím.
Na tohle nepotřebuješ žádné vysvětlování od učitele, stačí ti
jednoduché vzorce v pravouhlém trojúhelníku (sinus, cosinus).
Konkrétně pokud máš:
alfa - úhel (pozice planety) od shora podle směru hodinek
r - poloměr (vzdálenost planety)
x - pozice planety směrem doprava od Slunce
y - pozice planety směrem nahoru od Slunce
tak platí:
x = sin(alfa) * r
a
y = cos(alfa) * r
Včera jsem dal dohromady model. Čísla jsem si vycucal z prstu a tak první
událostí bylo, že mi uletěl Měsíc z gravitačního vlivu Země. Přitom
jsem se sekl v jeho rychlosti jen o 20 %.
To nejtěžší, tedy grafiku, mám teprve před sebou, takže máš stále
šanci. Jestli se nepletu, tak důležitá je grafická prezentace a ještě
jsem nenakreslil ani pixel.
Tak jsem si to vyzkoušel a narychlo splácal tohle: http://leteckaposta.cz/309316270
Nevypadá to zrovna podle představ, s grafikou se mi dělat nechce, ale je
zajímavé to pozorovat, asi si z toho udělám spořič
enter - zpomalení času 100x
mezerník - zrychlení času 100x
T - zobrazení oběžných drah
Nad tím jsem ani nepřemýšlel, prostě jsem to udělal jako kružnice. Na
elipsy nemám dostatečné znalosti matematiky Spíše jsem se snažil tak
nějak vyměřit poměry vzdáleností, velikostí atd. Také jsem se snažil o
tak nějak objektový kód i když je to v C++, snad se mi to trochu povedlo.
Jenom ty měsíce mi dělají hrozný bordel v kódu
S těmi měsíci ti to věřím. V mém modelu jsem je musel řešit v
počátečních datech. Pak už si cestují po svém. Při ladění hodnot si je
však vypisuji ve vztahu k domovské planetě.
Ono hlavně těch měsíců je tam nějak moc (jenom Saturn jich má 24) a
každý se musí definovat zvlášť. Jelikož se mi s tím nechtělo piplat,
tak jsem je udělal rovnou v main.
Plánuji, že u Země udělám jeden měsíc, u Marsu dva, u Jupitera čtyři
a u Saturnu nevím. Nebudu tam dávat každý šutr. Naopak bych tam rád
přidal Ceres, když už tam má být i Pluto.
Slunce, planety i měsíce mám v jednom enum i s počátečními daty a
mechanikou pohybu.
Ano, na to jsem tě zapomněl upozornit. V programovacích jazycích se
obvykle (narozdíl od základní školy) nepočítají úhly ve stupních, ale v
radiánech (180°=pi rad).
Řekl bych, že když to tam nebudeš mít, tak nebudeš diskvalifikován, na
druhou stranu, když to tam mít budeš dostaneš body navíc. Ale u mě to bylo
jen přidání jednoho mínuska.
Tak teď jsem se dočetl, že všechny velké měsíce sluneční soustavy
kromě Tritonu obíhájí ve stejném směru jako planety obíhají. Je to
celkem zajímavá probleematika, když si člověk uvědomí, že většina
věcí obíhá čí se otáčí stejným směrem.
Je spíš zvláštní ten jeden měsíc, který obíhá obráceně.
Obíhání v jednom směru má svou příčinu, ale Triton byl zřejmě až
dodatečně zachycen z Kuiperova pásu. Navíc neobíhá úplně obráceně, ale
má blíž k polární dráze. I tak je to velmi zvláštní jev.
Model Sluneční soustavy jsem si dávno chtěl udělat kvůli experimentům
s trójany.
Tak sem přidám své dílo, je to v C#. Objekty tam jsou, měsíce jsem
přidal ty největší. Plátno se přizpůsobuje velikosti okna, je tam režim
celé obrazovky.
Dá se to plně ovládat jak myší, tak klávesnicí (zobrazení trajektorií,
popisků, měsíců, fullscreen, zrychlení času).
Pro prohlížení měsíců doporučuji zapnout zrychlení na hodiny, pro
prohlížení vnitřních planet zrychlení na dny (a vypnout měsíce) a pro
prohlížení vnějších planet zrychlení na roky (a vypnout měsíce). https://www.dropbox.com/…soustava.zip
Potřebuješ .NET framework, ale ten je součástí Windows. Nevím v jaké
verzi to dělal, zkus stáhnout 4.5. Každopádně by to stejně nemělo napsat
tuto hlášku, platná aplikace to je.
Já to tak původně dělal taky, že jsem jenom vydělil vzdálenost všech
měsíců nějakou konstantou, jenže většina z nich byla strašně blízko
povrchu planet a jiné zase strašně daleko, nakonec jsem to udělal takhle:
log10(d)*1.25
Podobně jsem počítal i vzdálenost planet od slunce a velikost planet a
měsíců jsem dělal odmocninou
Vypadalo to dobre nez jsem koukl na kod. Pojmenovani trid a promennych hruza.
To pojmenovavaji i spoluzaci lip, kteri o programovani nemaji ani tucha. Mit 3
tridy v jednom souboru je taky dobry, navic uplne zbytecny I ty ostatni tridy uplne
nanic. V Paiting magicky cisla everywhere , boze kdyby jsi trochu vic
premyslel nad objektovym pristupem mozna by tech cisel nebylo tolik. To je
takova slatanina, ze nevim co driv vytknout Podle tech pojmenovani muzu
jen hadat pomoci kristalove koule co co ma delat
Jak píše Fugi, určitě bych pojmenoval metody podle toho, co dělají, je
tam třeba metoda podminka() a getUhelJeden() taky úplně nechápu Jinak mi to tak hrozné
nepřijde, ale jen jsem to prolétl, kouknu pořádně zítra až to budu
hodnotit.
Bohužel, jsem na to neměl tolik času. Chtěl jsem si to vypiplat
pořádně ale musím dělat nějakou blbost v Java EE a mám na to deadline.
Ale myslím, že i přes nedostatek času to nebude k zahození jelikož je
skoro 5 ráno a já už to dodělal. (nedodělal ale chce se mi příšerně
spát)
Mělo by to na každym monitoru jít v pohodě ale pro jistotu : takhle to
mělo vypadat v idealním světě. viz obrázek
Hmm ve 3 ? Nešlo by to dýl ? Okolo 6 ? Já si klidně teď stáhnu všechny
soustavy, mrknu se na ně a sepíšu svůj názor. Teď otázka, chceš názor
čistě jak to vypadá nebo i z programátorského hlediska ? Obávám se že
druhá možnost nebude u mě úplně objektivní
Oficiálně by to mělo končit dnes ve 3. Chtělo by to hodnotit obojí, jak
vypadá výsledek a i jak vypadá postup. Hodnocení je vždycky trochu
subjektivní, proto je více porotců
Můj výtvor:
Pozadí se zapíná a vypíná klávesou B, trajektorie klávesou L.
Pohyb planet se zrychlí šipkou doprava, zpomalí šipkou doleva a extrémě
zpomalí klávesou S.
Kliknutím na objekt(planety, ...) si v levé části obrazovky zobrazíte
informace.(to blikání je tam úmyslně) Kódy: https://dl.dropboxusercontent.com/…r_system.zip Program: https://dl.dropboxusercontent.com/…stem_run.zip
Tak já se nebudu s vámi předhánět v přesnosti na milimetry, rychlostmi
na km/h přesnými ani 34626506532985620 měsíci. Raději zkusím něco
origálního.
Takže v mojí sluneční soustava krom 8 planet, 1 hvězdy a jedné
trpasličí planety, létají rakety, logicky vylétávájí z planety země.
Tyto rakety pokud narazí do planety tak se u nich napíše nějaký komentář
posádky. Rakey se
generují automaticky, nebo je můžete vygenerovat stisknutím klávesy R.
No z té stránky to stahovat nebudu blokuje to antivir.
Nianstaloval jsem http://www.microsoft.com/…rmation.aspx?… což by mělo
pomoct, nepomohlo. ať to zkusí někdo jiný a řekne mi jestli to funguje nebo
ne
a co další z porodců? Těm to taky nejde? Každopádně je divný že to
hlásí že tam není i když tam je. Máš to ve Windows/System32? nebo taky
můžeš zkusit jen Windows/system. Taky je tu možnost, pokud si dobře
pamatuju, že máš windows 8 a třeba na to máš jinou knihovnu co já vím.
Kluci, musím říct, že jsem opravdu nadšený z toho, jak vás Koperník
chytl, nečekal jsem takovou odezvu. Hodnotili jsme spolu s Petr Nymsa a
došli k následujícímu pořadí. Bylo to dost těžké, hlavně kvůli tolika
jazykům a kvůli tomu, že úroveň vašich výtvorů byla vcelku vysoká.
1. Frunta (90 bodů)
sdraco: Překvapil hezký kód v C++ a rotace obrázků planet.
Zirko: Splnil zadání, pěkné zrychlení, má dokonce měsíce!
1. Winitrix (90 bodů, ano, zas 2 první místa)
sdraco: Podívaná je dokonalá, dal jsem ti za vzhled ještě bod navíc. Máš
tam nějaké třídy s malým písmenem nebo flyingPlanets (množné číslo), i
když třída reprezentuje jednu planetu. Místo img by bylo vhodnější zvolit
jiný název místo zkratky, je tam čeká metoda aktualizuj(). Návrh není
špatný, ale chtělo by to lépe dodržovat zásany pojmenovávání tříd a
proměnných. Hudba pěkná (i když wave je dost velký), citát také
Zirko: Pěkné grafické zpracování, hudba, nabízí pár funkcí (3). Ke
kódu výhrady nemám, asi bych to napsal stejně.
2. Michal (85 bodů)
sdraco: To předávání pictureboxu je trochu divoké, předává se graphics,
jinak pěkné.
Zirko: Spousta funkcí, možností nastavení, grafika pěkná. Kód mi přijde
špatný. Všechno je public, hodně zvláštní předávání. Objekty Planeta
přijímají Scenu, což je trochu divné. Statické metody ve Scéně, špatný
návrh. Stejně tu scénu předává, může metody zavolat z předané.
3. Luckin (80 bodů)
sdraco: Škoda že je vše v jednom souboru a ty měsíce v Main
Zirko: Měsíce, zrychlení, je to C++, nikdy jsem v něm nedělal ale nevypadá
to nijak špatně.
4. Misaz (65 bodů)
sdraco: Škoda, že nejsou třídy rozděleny v souborech, třídy by měly
začínat velkým písmenem, při stisku R těch raket vzniká nějak hodně
Nicméně oproti tvé
fontáně obrovský kus práce, ten kód je úplně někde jinde, moc
chválím.
Zirko: pěkný nápad s raketkami. Grafika celkem pěkná. V kódu opět
zbytečné public, nevím jestli je nejlepší použíat ve hře Timery, vše by
šlo udělat přes Update() a nebo líp přes komponenty. Sice to už úplně
sem nepatří, ale mazání raket neprobíhá, pouze je nevykresluje -> po
chvilce to může začít dělat problémy. Škoda že stisknutím R se přidá
asi 20 raket, omezit to opravdu na stisknutí.
5. Samik11 (55 bodů)
sdraco: Objektový model je sice funkční, ale nešťastně pojmenovaný.
Např. Máme třídu Uhel a planeta má následně atribut uhel, který je 0. To
se dost plete. Třída Uhel má v sobě dále atribut uhel a uhelJeden, když
nastavím rychlost, nezmění se hodnota v uhelJeden. Asi bych tu třídu
úplně vypustil a dal úhel a rychlost jen do planety. U třídy Painting
(doufám, že jsi myslel Painting jako obrázek, ne jako kreslení) jsou metody
rychlost a podminka, první by se měla jmenovat posunPlanety (ty by měly být
v nějaké kolekci, aby se to nemuselo spát takhle ručně a jejich rychlosti u
planet) a druhá mi přijde špatně, oběh bych stanovoval dle úhlu, ne podle
pozice na ploše, to by nemuselo v některých případech korektně proběhnout
(třeba při velké rychlosti). Hlavní třída s Main by se měla jmenovat asi
Soustava než KruhObeh.
Zirko: splnil zadání, žádné funkce navíc nejsou nebo jsem je nenašel.
Kód myslím že ještě jde, až na ty metody podminka() apod.
Nuz - Bohužel jsem nenašel zdrojové kódy Aplikace vypadá super.
Placky si odnášejí Frunta a Зайчик, které chcete? Všem děkuji za účast a
těším se příště.
Hoj, jen bych chtěl dodat co se kódu týče, první jsem chtěl mít
všechny planety v jedné třídě a pak jsem si uvědomil, že je to blbost (
proto to množné číslo ) pár metod a tříd jsem dodělával v 5 ráno dnes
a dokonce si i pamatuju že jsem všem třídám změnil počáteční písmenko
na malé... v 5 ráno mi to hold přišlo správně protože jsme si neuvědomil
že je to třída a ne metoda ^^ znáte to 4 big shocky v sobě Každopádně tak hrozné to
nebylo když mám 90 bodů, snad příště budu mít více času. A nebudu to
plácat dohromady v 5 ráno.
Samozřejmě že bych si vzal Javu adresu tuším máte.
Fruntovi gratuluju
ještě k tomu wav souboru za to nemůžu už jsem snižoval frekvenci jinak by to mělo 50MB
nechtělo mi to
přehrávat mp3 a nějaký media library se mi stahovat nechtěli nebo neznáš nějakou
alternativu? :^) .au má to samé a aiff nebo jak se jmenuje taky všechno bylo ohromný
Jelikož jsem to dělal velice na rychlo (proto všechno v jednom souboru) a
ani se nechtěl plnohodnotně účastnit, tak děkuji za pěkné 3.místo
Gratuluji vítězům, myslím že vyhráli zaslouženě, obě soustavy se mi
velmi líbí. Na kód jsem koukal pouze u Frunty, jelikož to jako jediný psal
v C++ a kódy dodal. Ale nebudu kritizovat
Jak to, že jste nenašli zdrojové kódy? Já ty linky zkoušel a fungovaly.
Zirko: ta knihovna je myslím součástí Visual studia pro c++(podle
internetu).
Jen pro zajímavost ty kódy: https://dl.dropboxusercontent.com/…r_system.zip
To předávání pictureboxu je trochu divoké, předává se
graphics.
To jsem nevěděl.
Objekty Planeta přijímají Scenu, což je trochu divné.
A jak bych potom zjistil, do které Sceny mám to Teleso vykreslit? Potřebuju
získat proměnnou scena.slunce.
Statické metody ve Scéně, špatný návrh.
To mi přijde v pořádku, ty metody nesouvisí nijak s konkrétním objektem.
Možná by bylo lepší z TimeSpanu odddědit MujTimeSpan a přetížit
operátory * a /, mám pravdu?
TimeSpan je struct, takže to nemůžu oddědit, takže ty metody na dělení
a násobení někde musím mít. Statika není všeobecné špatná, zrovna tady
se podle mě hodí. Co ty na to David Čápka?
Já statiku také používám. Například v XNA mám třídu UserInput,
která obstarává stisklé klávesy, stisknutí myši apod. Kdekoliv v programu
se pak můžu dozvědět co jsem stiskl. Jde o to že to máš trochu
nešťastně ve stejné třídě, kde to spolu nesouvisí
Statika se používá všude tam, kde nechci udržovat kontext. Dynamické
metody a třídy mají vlastně jeden skrytý parametr navíc. Ten se použitím
slova "static" odstraňuje.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.