Archiwum: July, 2010

Zrzut (ekranu) strony www o dowolnym rozmiarze (C#)

Mały i prosty kawałek przydatnego kodu w C# .net – może komuś się przyda. Za pomocą opisanego poniżej programu można zapisać zrzut dowolnej strony internetowej do pliku graficznego. Nie byłoby w tym nic nadzwyczajnego gdyby nie fakt, że program potrafi wygenerować zrzut o rozmiarze większym niż ekran – bez sztucznego przewijania strony.

Przykładowy zrzut tego bloga o rozmiarze 800 na 19560 pikseli można zobaczyć w pomniejszeniu (oryginał ma ponad 5 mega) tutaj.

Jak to działa? Kontrolka przeglądarki (czyli nasze “okno”) tworzona jest w tle, dzięki czemu może mieć dowolny rozmiar, wykraczający poza granice ekranu.

Jak wygląda aplikacja? Moja wygląda bardzo prosto, ponieważ zawiera wyłącznie minimum funkcji i możliwości. Pozwala na wybranie adresu strony, nazwy pliku do którego zapisujemy zrzut i rozmiaru zrzutu.

Przy tworzeniu programu potrzebujemy kontrolki webBrowser, którą należy umieścić na formie, ale poza widocznym obszarem. Dodatkowo wykorzystałem 3 pola tekstowe i guzik.

Kod programu z drobnym komentarzem jest następujący.

// Przepisujemy wartości z GUI do zmiennych:   
	int width = Int32.Parse(textBox2.Text);
	int height = Int32.Parse(textBox3.Text);
	string url = textBox1.Text;
	string file = textBox4.Text;

// Konfigurujemy kontrolkę webBrowser
	webBrowser1.ScrollBarsEnabled = false;
	webBrowser1.Width = width;
	webBrowser1.Height = height;

// Rozpoczynamy pobieranie strony (URL):
	webBrowser1.Navigate(url);

// Czekamy, aż pobieranie się zakończy:
	while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
	{
		Application.DoEvents();
	}

// Tworzymy zmienną na zrzut o odpowiednim rozmiarze:
	Bitmap bitmap = new Bitmap(width, height);
	Rectangle bitmapRect = new Rectangle(0, 0, width, height);

// Zapisujemy zrzut strony do utworzonej zmiennej
	webBrowser1.DrawToBitmap(bitmap, bitmapRect);

// Konwertujemy zminną bitmapową do obrazka i zapisujemy w formacie PNG
	System.Drawing.Image origImage = bitmap;
	origImage.Save(file, ImageFormat.Png);;

Może się kiedyś komuś przyda. Zakładam, że mi się kiedyś przyda, więc napisałem ten wpis, żeby mi się rozwiązanie nie zgubiło.

| Komentarze (1)

TME – rewelacja!

Potrzebowałem ostatnio trochę elementów elektronicznych, więc stanąłem prze koniecznością zakupu ich przez internet (w Olsztynie jest duża hurtowania elektroniczna, która ma w ofercie wszystko tylko nie to co mi jest potrzebne). Wybrałem sklep TME (http://tme.pl/) ze względu jego olbrzymi asortyment i widoczne profesjonalne traktowanie sprawy.

Wybrałem elementy, załadowałem do koszyka i zamówiłem. Było wczesne popołudnie. Od razu dostałem e-mail z potwierdzeniem zamówienia. Wieczorem przyszedł drugi mail z informacją, że moja przesyłka została wysłana. Następnego dnia o 9 rano przyjechał kurier. Realizacja w 18 godzin (wypas!).

Zapłaciłem i odebrałem od kuriera paczkę. Spore tekturowe pudełko. Szybko do domu i otwieram. W środku zgnieciony szary papier wypełniający przestrzeń i mniejsze pudełko:

Tutaj warto przypomnieć jak pakowane są elementy kupowane w zwykłym sklepie elektronicznym. Zazwyczaj są spakowane wszystkie w jedną torebkę. Mieszają się itp. Taki patent działa i zawsze był dla mnie “standardem”. Otwieram więc mniejsze pudełko spodziewając się, że moje części będą tam wsypane. Okazuje się, że w TME postanowili być lepsi od “standardu”. Każdy z zamówionych elementów w oddzielnej torebce z pełnym opisem ile i czego jest w środku.

Wszystkie scalaki i elementy z nóżkami mogącymi się powyginać zabezpieczone gąbką:

Reasumując: rewelacja. Jedyną wadą TME, jest fakt, że tak zwaną “drobnicę” (małe kondensatory, rezystory itp.) sprzedają w dużych ilościach. Potrzebowałem dwa kondensatory 22 piko, a minimalna ilość w zamówieniu wynosiła 100 – zostało mi 98 nadmiarowych kondensatorków. Z rezystorami to samo 🙂

W każdym razie polecam sklep TME.

| Komentarze (3)

GPS i oszukana średnia

Używam turystycznego odbiornika GPS firmy Garmin, model GPSmap60CSx. Jest to bardzo porządny odbiornik, który dopiero w 2010 roku doczekał się swojego następcy. Urządzenie posiada przyzwoitą antenę, która pozwala na osiągnięcie deklarowanej dokładności pozycji na poziomie 3 metrów. Taka dokładność jest rewelacyjna w zastosowaniach turystycznych i nawigacyjnych. Padło pytanie, czy da się osiągnąć takim sprzętem dokładność geodezyjną (może nie na poziomie milimetrów, ale centymetry też byłby zadowalające).

Do doświadczenia użyta została zewnętrzna antena firmy Garmin, model GA-30. Antenę zamontowałem na metrowym maszcie na dachu budynku, tak aby miała możliwie dobrą widoczność nieba. GPS wykazywał ciągłą widoczność 12 satelitów (odbiornik ma 12 kanałów) i deklarował dokładność 2 metrów.

Sam odbiornik posiada funkcję zapisu punktu z uśrednianiem, które powoduje zwiększanie dokładność wraz ze wzrostem liczby pomiarów. Podłączyłem urządzenie do komputera przez USB i ustawiłem dwa równoległe pomiary. Komputer zbierał z odbiornika współrzędne z częstotliwością kilku pomiarów na sekundę. Równolegle na odbiorniku trwało uśrednianie współrzędnych.

Oczywiście przez cały czas trwania eksperymentu antena była zupełnie nieruchoma.

Pomiary zbierałem przez prawie 3 dni bez przerwy. Odbiornik przekazywał do komputera współrzędne z dokładnością (zapisu) 0,000001 stopnia. Obliczoną na odbiorniku średnią prezentował z dokładnością do 0,00001 stopnia.

Na zakończenie porównano najpierw uśrednioną pozycję z odbiornika z pozycją uzyskaną przez uśrednienie wszystkich pomiarów z komputera. Wyniki okazały się całkowicie zgodne (z dokładnością do precyzji zapisu odbiornika).

Problem pojawił się w momencie analizy błędu uzyskanej wartości. Przy obliczaniu średniej arytmetycznej błędem (niepewnością) jest odchylenie standardowe, które dla pomiarów z komputera wyniosło około 3 metrów. Dla tych samych danych odbiornik zadeklarował dokładność 0,1 metra! Pierwsza myśl zasugerowała, że odbiornik ma lepszy algorytm obliczania błędu niż zwykłe odchylenie, który wynika ze specyfiki pomiaru. Poszukałem chwilę w sieci i znalazłem kilka wzorów (nie będę przytaczał, bo nie wiem który z nich jest poprawny), które brały pod uwagę czas pomiaru – im dłuższy tym lepsza dokładność. Nie przemówiło to do mnie, więc zabrałem się za graficzną analizę.

Poniżej znajdują się 4 widoki na trójwymiarowy histogram pomiarów. Wymiar każdego słupka jest równy dokładności zapisu pomiaru czyli 0,000001 na 0,000001 stopnia. Na skalach poziomych znajdują się odległości od średniej w metrach. Na pierwszym obrazku widać znaczące nasycenie pomiarów wokół pewnego punktu – dobry znak. Oczywiście widać też, że zdarzyły się wycieczki na odległość nawet 30 metrów od centrum.

Problem widać na 2, 3 i 4 obrazku – średnia jest przesunięta w stosunku do środka piku.

Rysunki powyżej (dwa) pokazują widoki na histogram 3D z boku, więc widać tylko najwyższy słupek dla danej wartości. Prawdziwe histogramy dwuwymiarowe dla szerokości i długości geograficznej znajdują się poniżej:

Wniosek?

Wniosek jest taki, że nie da się za pomocą odbiornika GPS wyznaczyć pozycji dokładniej niż kilka metrów.

Drugi wniosek jest taki, że Garmin oszukuje przy uśrednianiu.

| Komentarze (4)

Basen Stefana-Boltzmanna

O termodynamicznych perypetiach z basenem ogrodowym pisałem już wcześniej (prawie rok temu). Wniosek był wtedy taki, że po ograniczeniu parowania poprzez przykrycie lustra wody folią z bąbelkami (żeby pływała i przylegała do wody) pozostają nam 3 źródła wymiany energii basen – otoczenie: przewodzenie i konwekcja, promieniowanie, energia słoneczna. Energie słoneczną wyeliminowałem z prezentowanego dziś doświadczenia dokonując pomiarów wyłącznie w nocy. Wcześniejsze obserwacje sugerowały, że wpływ przewodzenia jest dużo mniejszy niż promieniowania.

To woda promieniuje???

Każde ciało, mające niezerową temperaturę (w skali Kelvina!) wypromieniowuje energię. Moc tego promieniowania (czyli energia w czasie) jest opisywana przez prawo Stefana-Boltzmanna:

,

gdzie , a jest powierzchnią czynną. Powyższy wzór ma sens wyłącznie w przestrzeni, gdzie nie ma nic oprócz rozpatrywanego ciała. W ziemskich warunkach mamy otoczenie, który też promieniuje. W naszym doświadczeniu mamy basen w otoczeniu powietrza. Moc promieniowania może być oczywiście ujemna (kiedy basen jest ochładzany bo wypromieniowuje więcej niż otrzymuje z otoczenia) lub dodatnia (kiedy basen się ogrzewa). Dodatniość czy ujemność jest kwestią umowy, który kierunek jest dodatni. Ja wybrałem taki jak powyżej.

Idąc dalej mamy promieniowanie w dwie strony, którego sumaryczną moc możemy policzyć ze wzoru:

,

gdzie – temperatura powietrza, a – temperatura basenu.

Doświadczenie – wzroki

Znając temperaturę powietrza i wody, możemy policzyć średnią moc, która wynikała ze zjawiska promieniowania. Temperatura mierzona jest w sposób ciągły, po czym uśredniana w 5-minutowych blokach. Dla każdego bloku między 23 i 4 rano policzono moc i wszystkie wartości uśredniono. Obliczenia przeprowadzano bez bez brania pod uwagę powierzchni czynnej, która posłuży zaraz jako test całej teorii.

Z drugiej strony znając temperaturę początkową i końcową basenu oraz jego objętość i ciepło właściwe wody, dla każdej nocy można było policzyć (znów średnią) moc wymiany cieplnej. Liczono ze wzoru

,

gdzie – temperatura początkowa o 23, – temperatura końcowa o 4, , .

Doświadczenie – wyniki

Mamy więc moc obliczoną na dwa sposoby. Jedna wartość jest rzeczywistą mocą, a druga jest mocą wynikającą wyłącznie ze zjawiska promieniowania. Zakładając, że promieniowanie jest jedynym źródłem wymiany cieplnej powinna zachodzić relacja

.

Zebrałem dobre dane z 31 nocy. Jako dobre rozumiem takie, gdzie nie było przerw w pomiarze i gdzie basen był przykryty folią. Wykres poniżej przedstawia zależność obliczonych wartości mocy (ponieważ wszystkie wartości mocy były ujemne na wykresie został zmieniony ich znak dla czytelności):

Pozostaje wyznaczy z tych danych powierzchnię czynną. Zrobimy dopasowując do danych prostą przechodzącą przez punkt (0, 0). Otrzymujemy .

Jak to się ma do rzeczywistości? Basen ma wymiary 7,5 x 3,5 x 1,15 metra, co daje całkowitą powierzchnię 77,8 metra kwadratowego. Jak widać wartości te można uznać za zgodne (należy oczywiście przeprowadzić przyzwoity rachunek błędu!).

Podsumowanie

Potwierdza się, że fizyka działa nie tylko w laboratorium. Również moje przypuszczenie, że to właśnie promieniowanie jest kluczowym czynnikiem powodującym utratę temperatury (bez słońca i parowania) zdaje się być sensowne.

Oczywiście w rozumowaniu powyżej są pewne przybliżenia. Po pierwsze basen nie jest ciałem doskonale czarnym, a ciałem szarym. Po drugie, wartości promieniowania są różne przez różne powierzchnie (góra, boki, dno). Ponieważ wynik jest i tak dużo lepszy niż oczekiwałem nie będę poświęcał czasu i miejsca na głębszą analizę tych błędów w założeniach.

| Komentarze (5)