Kostka, kosteczka i kostkunia

Dokonałem ostatnio dosyć spontanicznego zakupu dwóch kostek Rubika. Nie byłoby w tym nic dziwnego gdyby nie to, że nie są to już klasyczne kostki 3x3x3, ale 4x4x4 oraz 5x5x5 :) . Nie był to może mały wydatek, ale jestem bardzo z niego zadowolony. Wraz z swoją starszą siostrą można je podziwiać na poniższych zdjęciach :P

050208-1541-kostkakoste1.jpg
050208-1541-kostkakoste2.jpg

Jeżeli chodzi o zdolność układania to 4x4x4 udało mi się po raz pierwszy ułożyć po około 2h. Następne próby trwały już około 1h. W następnej kolejności zabrałem się za piątkę, ostatecznie również skończyłem po około godzinie :) . Od teraz chyba nie będę się nudził już na żadnym z wykładów :D

XML to XSD? XML to Classes?

Wróciłem po dłuższym czasie do mojego hobbistycznego projektu RubiksCube v2. Zrobiłem ponieważ pojawiła się iskierka nadzieji, że zaliczę na uczelni nim laboratoria z baz danych. Tak więc brakującą częścią do tej pory była cała inteligencja układania kostki. Algorytmy (sekwencje ruchów) już kiedyś postanowiłem przechowywać w pliku XML. Wczoraj dokończyłem projektowanie pliku XML Scheme i.. zacząłem się zastanawiać jak to wykorzystać w projekcie. Rozwiązań było kilka:

  1. Ręcznie parsować plik XML – to już przeszłość...
  2. Skorzystać z zintegrowanego z platformą parsera XML oraz XPath – niestety jest to nadal bardzo wiele roboty i można się zagubić w którymś momencie
  3. Skorzystać z LINQ to XML – to już wygląda dużo lepiej, ale nadal trzeba się odwoływać do elementów poprzez obiekt Xelement, no i brak jest ścisłego typowania obiektów na typy z XSD.
  4. Dzisiaj znalazłem jeszcze taki projekt jak LINQ to XSD. Robi to wszystko co LINQ to XML z jednym małym dodatkiem. Pozwala na ścisłe typowanie obiektów, a to dzięki temu, że sam automatycznie generuje odpowiednie klasy w C#. Niestety wadą uniemożliwiającą skorzystanie z tego cudownego narzędzia jest to, że chwilowo nie jest rozwijany a ostatnia wersja pamięta czasy Visual Studio Orcas beta 1. I z powodu niekompatybilności wersji System.Xml.Linq nie da się tego w prosty sposób uruchomić na wersji RTM. Należy cierpliwie czekać na dalszy bieg wydarzeń...
  5. Szukając dalej znalazłem coś takiego jak CodeXS. Potrafi przekonwertować plik XSD na zestaw klas C# (także VB), a następnie jednym poleceniem wypełnić wszystkie struktury danymi z pliku XML opartego na danym XSD z zachowaniem wszystkich typów (także wyliczeniowych) oraz bardziej skomplikowanych struktur. Na stronie producenta jest dostępna wersja online (wysyłamy plik XSD na serwer i ściągamy archiwum z klasami) oraz postać źródłowa tej aplikacji. W prosty sposób można ją podpiąć pod zdarzenia pre-build w projekcie VS i mamy ładny generator kodu na podstawie XSD. Wadą jest niestety to, że chyba nie będzie można wykorzystać tutaj LINQ, gdyż na pierwszy rzut oka nie ma odpowiedniego wsparcia ze strony IDE. Ale poszukam może jeszcze czegoś na ten temat.

Ostatecznie waham się pomiędy rozwiązaniem trzecim a piątym (czwarte naprawdę niestety odpada). Trzecie na obecną chwilę mimo trochę bardziej skomplikowanej składni pozwala na wygodne przeszukiwanie, piąte natomiast posiada bardzo dobre typowanie danych, a z przeszukiwaniem gorzej.

RubikCube v2 – dowolne obroty warstw

No to udało mi się w końcu opanować wszystkie animacje :) Dodatkowo zastosowałem tani chwyt i zmodyfikowałem trochę kod, aby była możliwość zmiany rozmiarów kostki. Od teraz będzie można układać kostki 2x2x2, 3x3x3, 4x4x4, 10x10x10 i wszystkie pośrednie (włącznie z wszystkimi prostopadłościanami).
Niestety czy rozmiarach większych niż 6x6x6 wydajność już dosyć znacznie spadła. Będę musiał zoptymalizować jakoś ten kod. A swoją drogą w Visual Studio w wersji proffesional brakuje mi profiler'a. Znacznie by ułatwił pracę, niestety jest dostępny jedynie w edycji Team Suite :(

Poniżej mała demonstracja:
Get the Flash Player to see this player.

RubikCube v2 – animacje obrotów ścian

Oto screencast z prezentacji pierwszej prototypowej wersji RubiksCube. Jak narazie wielu efektów nie widać, ale to jest prawie, że dopiero początek.
W tej chwili jest zrobiony silnik do obsługi kostki Rubika oraz wizualizacja z wykorzystaniem technologi WPF.
Get the Flash Player to see this player.

WPF

Zastanawiam się nad wyborem silnika graficznego do mojego projektu kostki Rubika. Wpierw miałem zamiar oprzeć go na Direct3D, ale jakoś mają ciężkostrawny interfejs obsługi. I wygląda na bardziej zagmatwane niż OpenGL. Ostatecznie chyba zrezygnuję z obu na rzecz WPF z .NET 3.0 :)

Dzisiaj zacząłem dopiero poznawać tę technologię i mogę powiedzieć, że nawet taka zła to to ona nie jest jak mi się wydawało. Jeśli chodzi o WPF z punktu widzenia programisty to jest całkiem prosty. Formatka i wszystkie okienka są opisane językiem XAML opartym na XML'u. Z tego co widzę to jest także obsługa grafiki 3D. Narazie udało mi się narysować sześcian, ale to chyba dobry początek.