OpenSCAD: Domácí úkol LS 2015/2016
Varování:
Toto není aktuální zadání úkolu. Je zde pouze k účelům archivace.
Domácí úkoly ze semstrů minulých můžete vidět v archívu.
Ježek v kleci
Vaším úkolem je vytvořit parametrický model ježka v kleci v jazyce/programu OpenSCAD.
Ježek je koule s ostny, podobně jako na tomto obrázku. Obrázek je pouze ilustrační, ostny mohou vyrůstat z ježka po celém jeho povrchu.

Do ježka Jan Tleskač schoval plánek na létací kolo; na rozdíl od něj však nebudem mít ježka šroubovacího, ale pouze zaklapávajícího. Mechanismus je nakreslen na následujícím obrázku:

Je definována svislá vzdálenost od středu koule i velikost mezery v mechanismu. Všimněte si, že tato mezera má střed v této vzdálenosti. Ježek je samozřejmě dutý a tloušťka jeho stěny je také definována parametrem. Horní část koule není nikam odsunutá, z koule prostě část chybí.
Jednotlivé ostny mají společný průměr, ale různé směry a délky - toto je určeno koncovým bodem ostnu, který je zadán pomocí koordinát uložených ve vektoru tří hodnot v pořadí X, Y, Z. U těchto koordinát se předpokládá, že střed koule ježka leží v počátku souřadném. Ostny se nachází pouze vně ježka, nikoli uvnitř. Případný osten, který je příliš krátký, zkrátka nebude vůbec existovat. Osten se dotýká povrchu koule nejen v jednom bodě, celou plochou.
Jeden osten je vlastně válec se speciálním kulovitým zakončením, které je znázorněno na následujícím obrázku.

Klec pro ježka je složená s horního a dolního toroidu a sloupků.

Horní i spodní toroid má průřez obdélníku se zaoblenými rohy.

Jednotlivé sloupky mají stejnou tloušťku, jsou umístěny rovnoměrně po kružnici a leží na středu profilu toroidu. Abychom jejich pozici mohli testovat, začněte sloupy umisťovat od kladného směru osy X.

Klec umístíte tak, aby koule ježka ležela v jejím středu a sloupy vedly rovnoběžně s osou Z. Červený puntík na obrázku je počátek souřadný.

Modul
Váš model musí fungovat jako samostatný modul pro OpenSCAD, použitelný pomocí direktivy use (nesmí obsahovat žádné konstanty mimo modul, ale je možné (a žádoucí) vytvořit si pomocné moduly). Musíte použít tento interface (včetně stejných výchozích hodnot!):
module hedgehog(diameter=30, wall_thick=3, spines=[[0,0,20], [0,0,-20], [0,20,0], [0,-20,0], [20,0,0], [-20,0,0]], spine_thick=3, lock_distance=3, lock_gap=1, profile_size=[5,3], profile_diameter=40, profile_corner_radius=1, pole_thick=3, pole_count=4, pole_length=40 ) { /* kód */ }
diameter
je vnější průměr ježka bez ostnůwall_thick
je tloušťka stěny ježkaspines
je vektor souřadnic koncových bodů ostnůspine_thick
je tloušťka ostnůlock_distance
je vzdálenost zobrazená šipkami na obrázku s mechanismemlock_gap
je tloušťka mezery v zámku mezi dvěma dílyprofile_size
je vektor dvou hodnot určující vnější velikost obdélníkového profilu toroidu první číslo je ve směru X/Y, druhé ve směru Zprofile_diameter
je vnější průměr toroiduprofile_corner_radius
je poloměr zaoblení rohu obdélníkového profilu toroidupole_thick
je tloušťka sloupků klecepole_count
je počet sloupků klecepole_length
je délka sloupků klece od toroidu k toroidu
Krajní případy
- nemusíte řešit situaci, kdy mají být ostny širší než průměr koule ježka
- pokud osten zasahuje do zavíracího mechanismu, měly by být osten i zavírací mechanismus tímto nedotčeny - prakticky by tam osten překážel, ale pro potřeby tohoto modelu to nevadí (osten nesmí zasahovat do mechanismu, musí být na povrchu koule)
- nemusíte řešit, když ostny ježka nebo koule ježka prochází klecí
- pokud je zadána záporná hodnota tam, kde to nedává smysl, ale hodnota 0 smysl dává, znormujte hodnotu na 0 (např. počet sloupků)
- pokud je zadána záporná hodnota nebo 0 tam, kde to nedává smysl, nevykreslí se nic (např. průměr koule ježka)
- tloušťka stěny ježka i výška zavíracího mechanismu se do ježka vždy vejdou
- mezera zavíracího mechanismu může být větší než tloušťka stěny, v tom případě zavírací mechanismus zmizí a zůstane po něm díra
- pokud je poloměr rohu profilu toroidu zadán příliš velký, musíte jej zvětšit na maximální možnou velikost.
Bonus
Za bonusový bod můžete naimplementovat Tleskačovo tajemství. Do ježka ukryjete children()
, které modul hedgehog()
dostane na vstupu. Ale pozor, nevíte, jak je tajemství veliké, tak jej vhodně resizujte tak, aby se tam vešlo. Můžete předpokládat, že střed tajemství je taktéž na počátku souřadném a že je největší ve směru osy Z.
Kód
Kód musí splňovat určitou kvalitu, jednou z podmínek je logické dodržení odsazení (v celém souboru stejné). Opakované konstrukce musí být implementovány vlastními moduly a forcykly. Magické konstanty musí být samovysvětlující, nebo doplněné o komentář. Není možné použít žádné externí knihovny pro OpenSCAD, ani knihovnu MCAD. Manipulace s $fn
, $fs
a $fa
je zakázána.
Odevzdávání a hodnocení
Soubor pojmenujte hedgehog.scad, uložte do archivu hedgehog.zip (přímo do kořenového adresáře archivu) a nahrajte přímo do svého osobního namespacu na Eduxu. Musí jít stáhnout z odkazu https://edux.fit.cvut.cz/courses/BI-3DT/_media/student/username/hedgehog.zip
Na soubor do namespacu umístěte odkaz. V archivu kromě souboru hedgehog.scad musí být pouze potřebné soubory (další vaše scad soubory s moduly, případné DXF nebo STL soubory k importování), do archivu nepatří vygenerované STL soubory ježka v kleci. Správné pojmenování je důležité pro naše automatické testy. Nesprávně pojmenovaný soubor se nepovažuje za odevzdaný.
Termín odevzdání je 18.5.2016 včetně. Pozdní odevzdání není možné. V případě doložené dlouhodobé vážné nemoci je možné domluvit se na speciálním termínu. Nemoc či nehoda těsně před odevzdáním neomlouvá.
Po ohodnocení (které proběhne až po termínu odevzdání) nelze úlohu opravit. Před termínem odevzdání je ji však možno konzultovat i nahrávat na Edux v rozpracovaném stavu.
Při hodnocení se bude poloautomaticky testovat sada připravených argumentů obsahující především krajní případy. Doporučujeme proto modul vyzkoušet pro všemožné vstupy (nečíselné vstupy testovány nebudou). Na základě výsledku z testu a kvality kódu student může získat 0 až 20 bodů. V případě, že vyhodnotíme, že student úlohu opsal, případně vlastnímu kódu vůbec nerozumí, a ten neprokáže opak, bude úloha hodnocena -100 body, což znamená klasifikaci známkou F (toto se již stalo).
Počet (ne)úspěšných testů přímo ovlivňuje hodnocení. Testy budou po ohodnocení úloh zveřejněny. Skladba testů odpovídá obtížnosti a závažnosti jednotlivých částí úkolu, není tedy možné chtít kompenzaci za to, že jedna chyba ovlivnila výsledek více testů.
Před deadlinem proběhne několik kol odevzdání na nečisto. Cvičící vaše řešení nechá projet testy a upozorní vás například na to, že nějaká chyba rozbila většinu z nich, ale nemůže vám testy ukázat (tvořit úlohu přímo na míru testům by bylo příliš jednoduché). Tyto kola proběhnou 23.4., 30.4., 7.5., 14.5. a 16.5. vždy okolo 00:01 v noci. V tento čas musí být úloha odevzdaná na Edux. Zpětnou vazbu můžete očekávat v průběhu dvou dnů. Mimo tyto termíny není možné nechat úlohu projet testy.
Otázky od studentů
Pocita se koncovy bod u spines jako konec zaobleneho zakonceni?
Ano.
spine_thick == diameter „valce“, pomoci ktereho ostny delame?
Ano.
„Horní část koule není nikam odsunutá, z koule prostě část chybí.“ Jakoze je jen pul jezka?
Ne, jakože z ježka je kus uprostřed (Zavírací mechanismus) vyzmizíkován. Někdo měl z obrázku pocit, že je vrchní díl posunut o ten kousek nahoru, což není pravda, proto jsme tam tuhle větu dali.
"Abychom jejich pozici mohli testovat, začněte sloupy umisťovat od kladného směru osy X." Tzn. mam vzdycky zacit na "uhlu 0"?
To je implementačně závislé. V jedné z logických implementací to bude „úhel 0“.
Ale potom v testovacich datech prochazi bodlina skrz tyc v kleci.
Ano. Z toho si nic nedělejte, nikdo není dokonalý.
"profile_size je vektor dvou hodnot určující vnější velikost obdélníkového profilu toroidu první číslo je ve směru X/Y, druhé ve směru Z." Udaje pred zaoblovanim, nebo po nem?
Vnější velikost. Záleží, jak zaoblení děláte. Jestli máte obdélník a tomu odebíráte špičatost rohů, tak před zaoblením. Jestli máte obdélník a ten se zaoblením zvětšuje, tak po zaoblení.
"Pokud osten zasahuje do zavíracího mechanismu, měly by být osten i zavírací mechanismus tímto nedotčeny - prakticky by tam osten překážel, ale pro potřeby tohoto modelu to nevadí (osten nesmí zasahovat do mechanismu, musí být na povrchu koule)" == bude se osten tisknout "do vzduchu"?
Mohl by. Například pokud by osten měl menší tloušťku, než je ta díra v mechanismu. Záleží na konkrétních parametrech.