Střelba na terč
Vytvořte program, který načte souřadnice terčů a střel, a vykreslí je do obrázku ve formátu vektorové grafiky SVG. Pokud si vygenerovaný SVG obrázek otevřete v internetovém prohlížeči, tak by se po najetí myši na terč mělo ukázat skóre vybraného terče.
Ze vstupu přečtěte počet terčů a následně si dynamicky alokujte 3 pole typu float
pro x
souřadnice terčů, y
souřadnice terčů a poloměry terčů.
Poté pro každý terč přečtěte jeho x
souřadnici, y
souřadnici, poloměr a uložte je do
odpovídajících polí.
Například následující vstup nám popisuje 2 terče.
První terč má střed na souřadnici \( [50, 70 ] \) a poloměr \( 40 \) a druhý terč leží na středu \( [160, 90 ] \) s poloměrem \( 60 \).
2
50 70 40
160 90 60
Tento vstup nezadávejte pořad dokola z klávesnice, ale přesměrujte si jej do programu ze souboru:
$ ./main < terce.txt
Terče si pomocí printf
vykreslete do vektorového obrázku ve formátu svg, ve kterém lze pomocí tagů definovat útvary.
Útvary v obrázku obalte tagem svg
:
<svg xmlns='http://www.w3.org/2000/svg'>
<!-- kresleni kruhu -->
</svg>
Terč se středem \( [50, 70] \) a poloměrem \( 40 \) lze vykreslit pomocí:
<circle cx='50' cy='70' r='40' stroke='black' fill='red' />
Vytvořený SVG obrázek si ze standardního výstupu přesměrujte do souboru a otevřete si jej například v prohlížeči firefox.
$ ./main < terce.txt > obrazek.svg
$ firefox obrazek.svg
Následně si ze vstupu přečtěte počet střel a alokujte pro ně dvě pole - jedno bude reprezentovat x
souřadnice a druhé y
souřadnice jednotlivých střel.
Souřadnice si následně přečtěte do těchto polí.
Pole si projděte a vykreslete do obrázku jako kruhy např. s poloměrem \( 4 \).
Střela zasáhla terč, pokud leží na kruhu.
Jinými slovy - střela zasáhla terč, pokud je vzdálenost od středu terče menší než poloměr terče.
Vzdálenost vypočítáme jednoduše pomocí Pythagorovy věty, kde x
odvěsna je rozdíl mezi x
souřadnici středu terče a x
souřadnici střely. Odvěsna y
lze vypočítat obdobně a poté můžeme vypočítat přeponu, která reprezentuje vzdálenost střely od středu terče.
Protože máme více terčů a více střel, tak musíme aplikovat výpočet vzdálenosti mezi každou střelou
a každým terčem pomocí dvou vnořených for
cyklů.
Vnější cyklus bude procházet střely a vnitřní cyklus bude procházet terče.
Ve vnitřním cyklu vypočítáme vzdálenost mezi střelou a terčem a pokud je menší než poloměr,
tak tento konkrétní terč byl zasažen střelou z vnějšího cyklu.
V případě, že se více kruhů překrývá, tak střela zasáhla terč s menším poloměrem.
Budeme tedy hledat zasáhnutý terč s nejmenším poloměrem.
Skóre při zasažení středu s poloměrem 20 je 10 bodů a body postupně klesají. Zdrojový kód SVG ukázek si můžete zobrazit.
Dva terče
2
50 70 40
160 90 60
4
25 70
80 90
150 100
55 140
Překrývající se terče
2
160 90 60
90 70 40
4
125 70
80 90
150 100
55 140
Překrývající se terče se stejným středem
3
50 70 40
160 90 60
160 90 40
7
25 70
80 90
55 140
125 60
140 130
150 100
215 100