All blog entries, ordered from most recent. Entry count: 1198.
# Sortowanie naturalne
Thu
12
Feb 2009
Ciekawym algorytmem jest sortowanie łańcuchów w porządku naturalnym. Chodzi o to, żeby liczby traktowane były jako liczby i sortowały się według wartości. Na przykład nazwy plików posortowane normalnie alfabetycznie (leksykonograficznie) będą w takiej kolejności:
Plik.txt Plik1.txt Plik10.txt Plik2.txt Plik24.txt Plik3.txt
Natomiast posortowane w porządku naturalnym będą w kolejności bardziej przez użytkownika pożądanej:
Plik.txt Plik1.txt Plik2.txt Plik3.txt Plik10.txt Plik24.txt
Oczywiście każdy informatyk wie, że należałoby raczej po prostu dopełniać te liczby zerami (np. Plik01.txt), ale mimo wszystko ten algorytm jest dobry do sortowania nazw plików, serwerów itp.
Jak to działa? Całkiem prosto. Mówiąc ogólnie, trzeba porównywać kolejne znaki dwóch łańcuchów, ale kiedy napotka się cyfry, wtedy trzeba rozpatrzyć je jako całe liczby i porównać ich wartości. Implementację w C++ można znaleźć w mojej bibliotece CommonLib (zobacz pliki Base.hpp i Base.cpp, klasa StringNaturalCompare). W PHP jest standardowo taka funkcja - nazwa się strnatcmp. Opis algorytmu w Internecie można znaleźć m.in. tu: Natural Order String Comparison.
# O wyższości wyszukiwania nad wybieraniem
Tue
10
Feb 2009
Mam wrażenie, że w rozwoju interfejsów użytkownika za szczyt wygody dawniej uważane było pokazanie listy jakiś elementów do wybrania przez kliknięcie myszką. Natomiast teraz jasne staje się, że lepiej pozwolić użytkownikowi zacząć wpisywać jakiś wyraz do wyszukania i od razu pokazywać listę pasujących wyników. Taką możliwość mamy np. w:
Comments | #philosophy #gui Share
# Dobry zakup: Pendrive Kingston DataTraveler 150
Thu
05
Feb 2009
Podobno wielkim wyróżnieniem dla firmy jest, kiedy jej marka staje się nieoficjalną nazwą wszystkich podobnych produktów. Tak było z określeniem "walkman" na przenośny magnetofon czy "adidasy" na wszystkie buty sportowe, tak jest też z określeniem "pendrive" na przenośne pamięci flash.
Taki właśnie pendrive kupiłem sobie ostatnio i gorąco polecam. To Kingston DataTraveler 150. Dałem za niego na Allegro ok. 180 zł. Jego pojemność to 32 GB. Ponadto jest bardzo szybki - jego prędkość to (samodzielnie zmierzona, a nie deklarowana): odczyt 30 MB/s, zapis 15 MB/s. Dla porównania, mój poprzedni Kingston 2 GB miał odczyt 10 MB/s. Poza tym bardzo dobrym rozwiązaniem jest, że na czas podłączenia USB skuwkę można zatknąć od drugiej strony zamiast kłaść ją gdzieś na biurku, gdzie łatwo może się zgubić.

Comments | #hardware #shopping Share
# Pliki INI w WinAPI
Tue
03
Feb 2009
Stare dobre pliki INI to format tekstowy do przechowywania konfiguracji. Na przykład:
[Display] Width=1280 Height=800 FullScreen=true
Czasami ten format może się przydać, a chociaż nie jest skomplikowany, to nie każdy ma ochotę pisać do niego własny parser. Dlatego warto wiedzieć, że WinAPI zawiera proste i wygodne funkcje do obsługi plików INI. Znajdują się na dole listy Registry Functions. Można się domyślać, że z każdym wywołaniem plik jest od nowa otwierany i wczytywany, więc te funkcje nie grzeszą szybkością, ale do prostych zastosowań będą OK. Na przykład wczytanie wartości:
char Buf[256]; GetPrivateProfileString( "Display", // Nazwa sekcji "FullScreen", // Nazwa klucza "false", // Wartość domyślna Buf, _countof(Buf), // Bufor wyjściowy FileName); // Nazwa pliku INI ze ścieżką
# Skąd brać ikonki?
Fri
30
Jan 2009
MarekM25 poruszył ostatnio na naszym forum ciekawy temat: Skąd brać ikonki na przyciski do swoich programów?. Pośród odpowiedzi znalazły się darmowe galerie ładnych ikon: Silk Icons, Tango Icon Gallery, a także nie lada niespodzianka - paczka ikon dołączana do Visual Studio (niestety nie w wersji Express), schowana głęboko i spakowana w pliku VS2008ImageLibrary.zip.
Przy okazji warto wspomnieć o stronie Ajaxload, na której można sobie wygenerować i ściągnąć animowane, obracające się kółeczko popularne ostatnio do oznaczania ładowania czegoś w tle. Znacie jeszcze inne tego typu zasoby?
![]()
Comments | #web #gui #graphics Share
# Pasek przełączania stron w PHP
Wed
21
Jan 2009
Tym razem, nietypowo, napiszę o programowaniu stron WWW w PHP, a konkretnie o kwestii przełączania między stronami. Jeśli lista zarejestrowanych użytkowników, dodanych projektów, newsów czy czegokolwiek jest długa, istnieją różne rozwiązania na jej pokazywanie. Pierwsza to pokazać wszytkie (jak lista Parties na pouet.net). Druga to pokazać wszystkie na wybraną literę (jak lista Groups na pouet.net). Ta najczęściej stosowana to grupować obiekty po kilka na stronie i dać możliwość przełączania się między numerami stron.
Z kolei wybór strony też można pokazywać na różne sposoby. Można wstawić formularz z kontrolką <select>, czyli ComboBox. Można pokazać listę numerów stron. Jeśli jednak sama ta lista jest długa, warto ją skrócić. Tu właśnie, kończąc ten wstęp, chciałbym zaprezentować kawałek kodu PHP, który ostatnio napisałem. Wprowadziłem go do swojej strony domowej oraz na www.gamedev.pl. Wzorem SMF (używanego na naszym forum.gamedev.pl) pokazuje tylko numer strony bieżącej, pierwszej, ostatniej, dwóch poprzednich, dwóch następnych oraz dodatkowe strzałeczki do następnej i poprzedniej. Oto kod: Pasek_stron_PHP.txt. Tak to wygląda:
![]()
Comments | #php #webdev #web #gui Share
# Funkcja liniowa i kwadratowa
Wed
14
Jan 2009
W programowaniu bardzo często stosuje się funkcję liniową lub kwadratową. Przykładowo, jeśli mgła ma się zaczynać w głębokości Min i kończyć w głębokości Max, to jej intensywość od głębokości można wyrazić prostym wzorem:
FogIntensity = saturate(Depth * FogScale + FogBias);
Problem w tym, żeby znaleźć współczynniki tej funkcji. Do tego przydają się wzory, które wyliczają współczynniki dla funkcji przechodzącej przez dane punkty. Potrafi to robić mój GameDev Calc, ale żeby policzyć je w swoim programie albo na kartce, warto mieć pod ręką te wzory.
Funkcja liniowa
przechodząca przez dwa punkty (x1, y1), (x2, y2) ma wzór:

Co w przełożeniu na kod daje:
float W = p2.x - p1.x; if (W == 0.f) Error(); float a = (p2.y - p1.y) / W; float b = (p2.x * p1.y - p2.y * p1.x) / W;
Z kolei funkcja kwadratowa
przechodząca przez trzy punkty (x1, y1), (x2, y2), (x3, y3) ma wzór:

Co daje trochę dłuższy kod:
float x1 = p1.x, x2 = p2.x, x3 = p3.x; float y1 = p1.y, y2 = p2.y, y3 = p3.y; float W = x1 * x1 * x2 + x3 * x3 * x1 + x2 * x2 * x3 - x1 * x1 * x3 - x2 * x2 * x1 - x3 * x3 * x2; if (W == 0.f) Error(); float a = y1 * x2 + y3 * x1 + y2 * x3 - y1 * x3 - y2 * x1 - y3 * x2; float b = x1 * x1 * y2 + x3 * x3 * y1 + x2 * x2 * y3 - x1 * x1 * y3 - x2 * x2 * y1 - x3 * x3 * y2; float c = x1 * x1 * x2 * y3 + x3 * x3 * x1 * y2 + x2 * x2 * x3 * y1 - x1 * x1 * x3 * y2 - x2 * x2 * x1 * y3 - x3 * x3 * x2 * y1; a /= W; b /= W; c /= W;
# Co wynalazł Hilbert i Morton
Mon
12
Jan 2009
Tablicę jednowymiarową można posortować, żeby przyspieszyć jej przeszukiwanie. W programowaniu gier, do przestrzeni 2D i 3D używamy technik podziału przestrzeni (jak BSP, Octree, k-d tree), bo nie sposób uporządkować punktów czy obiektów w kolejności. Jednak czy napewno?
Otóż wynaleziono funkcje, które przeliczają pozycję punktu w przestrzeni (podzielonej wprawdzie na dyskretną siatkę) na pojedynczą liczbę taką, że dwa punkty leżące blisko siebie dostają często zbliżoną wartość. Te funkcje to numer komórki wzdłuż pewnej krzywej (Space-filling curve).
Przykładem może być Morton value:
Źródło: Wikipedia
lub lepsza, ale bardziej kosztowna obliczeniowo Hilbert value:
Źródło: Wikipedia