Lekce 6.5 - Cykly znovu a lépe¤
Tato lekce ukazuje praktické využití cyklů za účelem kreslení obrazců. V předchozích lekcích jsme si ukázali jednoduchou jízdu s robotem a zvedání tužky, a navážeme na to dále.
Želvička¤
Tato lekce je určena primárně na práci v Simulátoru. Program obsahuje zjednodušenou verzi reality, ve které nám bude jezdit želvička a přijímat příkazy na základě vnějších podnětů.
Programy nám budou fungovat i na skutečném robotovi. Je však je důležité nejdříve si v simulaci ověřit funkčnost, aby se nám skutečný robot nezačal chovat neočekávaným způsobem a nezpůsobil sobě nebo nám škody.
Program má textové okno, kam můžeme psát příkazy. Nám již známé příkazy jsou:
robutek.rotate(deg)
- želvička se otočí o deg
stupňů po směru hodinových ručiček
robutek.move(direction, options)
- želvička jede některým směrem na základě zadaných parametrů
Zadání A¤
V jedné z předchozích lekcí jsme použili znalosti o ovládání motorů a fixy na nakreslení čtverce. Museli jsme však několikrát pod sebou kopírovat kód na pohyb dopředu a otočení, ačkoliv jsme vykonávali čtyřikrát to stejné. Tentokrát pomocí for cyklu napište kód, díky kterému robot nakreslí čtverec a vrátí se do výchozí polohy.
Řešení
import * as robutek from "./libs/robutek.js"; // ovládání motorů
let pen = new Servo(robutek.Pins.Servo2, 1, 4);
pen.write(robutek.PenPos.Down); // dáme dolů tužku
robutek.setSpeed(100) // nastavíme rychlost na 100 mm/s
for (let i: number = 0; i < 4; i++) { // chování opakujeme 4x, pro každou stěnu čtverce
await robutek.move(0, { distance: 200 }); // posun dopředu o 20 cm
await robutek.rotate(90); // rotace doprava o 90 stupňů
}
Zadání B¤
Napište kód, pomocí kterého nakreslíte několik na sebe navazujících kruhů.
Dá se na to využít zatáčení pomocí motors.move(1)
.
Vzdálenost, kterou je potřeba ujet si dopočítáme na základě toho, že kola jsou od sebe 82mm
daleko.
Po nakreslení každého kola se můžeme otočit, ale pro plynulý pohyb chceme kreslit každé kolo z jiného směru.
K tomu může pomoct například stavová proměnná, která nám řekne, jestli tentokrát pojedeme doprava, nebo doleva.
Řešení
import * as robutek from "./libs/robutek.js"; // ovládání motorů
let pen = new Servo(robutek.Pins.Servo2, 1, 4);
pen.write(robutek.PenPos.Down); // dáme dolů tužku
robutek.setSpeed(100) // nastavíme rychlost na 100 mm/s
let direction: number = 1; // směr otáčení
let circumference: number = 2 * 3.14 * 82; // obvod jednoho kruhu, který robot objede
for (let i: number = 0; i < 4; i++) { // chování opakujeme 4x
await robutek.move(direction, { distance: circumference * 1.5 }); // chceme projet obvod 1,5x
if( direction == 1 ){
direction = -1;
} else {
direction = 1;
}
}
Výstupní úkol V1 - Trojúhelník¤
Napište kód, který způsobí, že želvička nakreslí místo čtverce trojúhelník. Rozměry trojúhelníku jsou na vás, jen musí skutečně jít o trojúhelník.
Jak na Trojúhelníky"
Tvar s délkami a
, b
a c
nazýváme trojúhelníkem, pokud splňuje trojúhelníkovou nerovnost:
a + b > c
a + c > b
b + c > a
Nejjednodušší trojúhelník je rovnostranný, který bude mít všechny strany stejně dlouhé a 60° vnitřní úhel na každém rohu.
Hned po něm následuje rovnoramenný, který v nejjednodušším případě bude mít 90° úhel mezi kratšími stranami, a 45° mezi krátkou a dlouhou.
Pokud chceme nějaký méně pravidelný trojúhelník, můžeme na výpočet úhlu a délek použít kosínovu větu.
Výstupní úkol V2 - Domeček¤
Propojte dosavadní znalosti do jednoho kódu. Napište program, který způsobí že si želvička nakreslí domeček z čtverce a trojúhelníkové střechy.
Následně želvička přestane kreslit, a vjede doprostřed domečku, kde zastaví.
Dobrovolný úkol - Spuštění na vlastním robotovi¤
Pokud vám program funguje v simulátoru, zkuste si ho nahrát do skutečného robota. Funguje vám? Pozorujete nějaké rozdíly v jeho chování oproti zjednodušenému prostředí?