Uzdevums: Simetrisku trajektoriju atpazīšana

Savākt failu sagataves: ex04-symm.zip

Sagatavošanās

Iepazīties ar Spring'a konfigurācijas pupiņas kolekcijas atribūta inicializāciju (t.i. atribūts SymmetricalPaths.paths); SVG trajektoriju (t.i. <path ...>) sintaksi, Javas kolekcijām kā arī dažām Javas vadības struktūrām (cikliem, zarošanos, break un continue). Uzinstalēt Adobe SVG Viewer (sk. http://www.webkursi.lv/webinstall/svg.php) ar Internet Explorer (vai arī vienkārši Firefox 1.5).

Uzdevuma apraksts

Dots Spring'a konfigurācijas fails, kurā sarakstītas vairāku "path" (t.i. vektorgrafikas trajektoriju) definīcijas. Izveidot metodes findCentralSymmetric():List un findAxialSymmetric():List kuras apstrādā Javas objektā SymmetricalPaths esošo String'u sarakstu "path" un atgriež jaunu sarakstu ar Integer-iem. Ja "path" trajektorija ir centrāli simetriska (vai attiecīgi - aksiāli simetriska pret kādu horizontālu vai vertikālu asi), tad rezultāta sarakstam jāpievieno vērtība 1, citādi - vērtība 0. Piemēram, dotas figūras (sk. zīmējumu - t.i. taisnstūrītis, taisnstūrītis, trijstūrītis un zvaigznīte):

tad findCentralSymmetric() rezultāts ir saraksts (java.util.List<Integer>) ar elementiem (1,1,0,1) - t.i. visas trajektorijas ir centrāli simetriskas, izņemot trijstūrīti. Varat pieņemt, ka visi nogriežņi, kuri ietilpst trajektorijā, ir ar pozitīvu garumu. T.i. lai trajektorija varētu būt centrāli simetriska, ir nepieciešams, lai tās posmu skaits būtu pāru skaitlis. Precīzāk, pāru skaitlis nogriežņa vilkšanas komandu "l x y", vai arī nepāru skaitlis nogriežņa vilkšanas komandu "l x y", kurām seko viena trajektorijas noslēgšanas komanda "Z" (sk. zemāk). Aksiāli simetriskās figūras var saturēt arī nepāra skaitu nogriežņu, ja viens no nogriežņiem izrādās simetrisks pats sev.

Pieņēmumi

Trajektoriju definēšanā izmantotas komandas "M x y" (trajektorijas sākums punktā (x,y)), "l x y" (līnija relatīvi pret pašreizējo punktu par x pikseļiem pa labi un par y pikseļiem uz leju; vai arī pretējā virzienā, ja x vai y ir negatīvi), "Z" (slēgt trajektoriju, t.i. savienot pašreizējo punktu ar trajektorijas sākumpunktu). SVG fails, kurš ģenerē augstākredzamo zīmējumu ir šeit: bilde.svg un tā izejas teksts ir šāds:

<?xml version="1.0"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN"
    "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">

<svg width="300" height="300">
<title>List of paths</title>
<desc>This is a sample SVG file to describe test data for the SymmetricalPaths program</desc>
<g style="stroke:black;stroke-width:2;fill: none;">
    <path d="M 10 10, l 30 0, l 0 20, l -30 0, l 0 -20"/>
    <path d="M 60 10, l 30 0, l 0 20, l -30 0, Z"/>
    <path d="M 40 60, l -30 0, l 30 -17.32, Z"/>
    <path d="M 80 40, l 0 70, l 50 -50, l -70 0, l 50 50, l 0 -70, l -50 50, l 70 0, l -50 -50"/>
</g>
</svg>

Varat pieņemt, ka visas "path" elementos ietilpstošās koordinātes ir veseli skaitļi un un atsevišķās "M x y", "l x y" un "Z" komandas ir atdalītas ar komatiem, bet skaitliskās koordinātes komandu iekšienē - ar vienu vai vairākiem tukšumiem (0x20). Ja kāds "path" elements satur parsēšanas kļūdas, vēlams izvadīt ar Apache Log4J vai citu logera mehānismu atbilstošu paziņojumu uz konsoles (Spring karkasā priekšroka dodama RuntimeException un tā apakšklasēm).

Kodēšanas stils

Jūsu iesniegtajai programmai būtu vēlams ietvert:

  • Pārdomātas Javas vadības struktūras. T.sk. vēlams izvairīties no Būla karodziņa isSymmetric lietošanas metodē findCentralSymmetric; kā arī būtu jālieto piemēroti "break" un "continue", lai tiktu veiktas tikai minimāli nepieciešamās pārbaudes, nevis visi cikli tiktu darbināti līdz galam.
  • Tiktu apstrādāti īpašie gadījumi (teiksim, "path" elements beidzas nevis ar kārtējo nogriezni, bet ar komandu "Z"). Lietotājs uz konsoles tiktu saturīgi brīdināts par parsēšanas kļūdām - kurš "path" elements satur kļūdas, utml.

Lapa mainīta 2005-12-13 08:10:51