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.

dist

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