[WikiDyd] [TitleIndex] [WordIndex

Laboratorium ,,Języki i metodyka programowania I''

Projekt indywidualny: Generator siatek różnicowych 2D

Proszę zaprojektować i wykonać program generujący dwuwymiarową (2D) siatkę różnicową (SR) w obszarze definiowanym przez zbiór łamanych.

Siatka różnicowa to zbiór równomiernie rozmieszczonych punktów 2D. Przykładową SR można przedstawić następująco:

      . . .
    . . . . .
      . . . . .
        . . .

gdzie każdy punkt ma określone współrzędne (np. kartezjańskie). Odstępy pomiędzy punktami są stałe (tak w kier. OX, jak i OY), a więc zamiast współrzędnych można posługiwać się całkowitymi indeksami punktów.

Dodatkowo zwiążemy z każdym punktem nazwę podobszaru: jeżeli założymy, że w naszym obszarze występują podobszary a,b i c, to możemy przedstawić taką strukturę materiałową jako np.:

      a a a
    a a b b b
      a b b b b
        c c c

Siatka może być reprezentowana w pliku np. jako lista węzłów i mieć następującą postać:

Materialy: 3 { a, b, c } /* nazwy moga byc dluzsze */
Wezly: 16
  0.3 0.1  3  /* 3 to numer materialu => c */
  0.4 0.1  3
  0.5 0.1  3
  0.2 0.2  1  /* tu zaczyna sie 2 wiersz od dolu, literka a */
  0.3 0.2  2  /* pierwsza literka b */
  0.4 0.2  2
  0.5 0.2  2
  0.6 0.2  2
  0.1 0.3  1  /* tu zaczyna sie 3 wiersz od dolu, literka a */
  0.2 0.3  1  /*  literka a */
  0.3 0.3  2  /* pierwsza literka b */
  0.4 0.3  2
  0.5 0.3  2
  0.2 0.4  1  /* tu zaczyna najwyzszy wiersz, literka a */
  0.3 0.4  1
  0.4 0.4  1

Dane wejściowe:

Dane wejściowe składają się z:

   1+--------------------+2
    |                    |
    |        zew         +------------+3
    |                                 |
    |                                 |
   4+      7+-----------+8            |
     \      |   wew      |            |     NIC
       \   9+-----------+10           |
       5+-----------------------------+6

Plik z danymi:

Materialy: 3 { NIC, wew, zew }
Wezly: 10
       -2.0   8.0
       10.0   8.0
       16.0   6.0
       -2.0   4.0
        0.0   0.0
       16.0   0.0
        4.0   4.0
       10.0   4.0
        2.0   2.0
       10.0   2.0
Brzegi: 2
 { NIC zew 6 { 1 4 5 6 3 2 1 } }
 { zew wew 4 { 9 10 8 7 9 } }

Jak widać powyżej, plik wejściowy składa się z trzech części:

Algorytm:

Program powinien czytać plik wejściowy i przechowywać go w postaci odpowiedniej struktury danych.

Po wczytaniu pliku należy określić minimalny prostokąt zawierający opisany obszar (na podstawie analizy wsp. węzłów - w powyższym przykładzie będzie to <-2;16>x<0;8>).

Następnie trzeba iterować po poszczególnych kolumnach (lub wierszach) tworzonej siatki, dla każdej kolumny (wiersza) wyznaczać linię pionową y=y_min+i*d (lub poziomą x=x_min+j*d) - gdzie d to krok SR. Dla każdej lini pionowej (poziomej) należy szukać przecięć z wszystkimi "brzegami" i zapisywać je w postaci listy posortowanej według współrzędnej y (x).

Następnie posuwamy się po linii pionowej (poziomej) z krokiem d, rozpoczynając od węzła najbliższego pierwszemu punktowi przecięcia i wyznaczamy kolejne węzły "odkładając" na wybranej linii kolejne przyrosty d i sprawdzając na podstawie listy przecięć, w którym obszarze znajduje się kolejny węzeł. Wygenerowane węzły można od razu wypisywać do pliku wyjściowego, lub pakować je do listy węzłów i wypisać ją po wyznaczeniu wszystkich.

Wymagania techniczne:

1. Program ma być wywoływany z listą argumentów, przez które przekazywane są nazwy plików: wejściowego i wyjściowego, oraz liczba d.

2. Program powinien poprawnie reagować na błędy składniowe pliku wejściowego.

3. Program powinien poprawnie obsługiwać komentarze

4. Program ma być zbudowany modularnie: należy "złożyć" go z kilku plików.


2015-09-23 06:43