formats

The Piano Guys

Published on 10 maja 2012, by in Muzyka.

Nie sposób opisać uczucie, które czuje gdy widzę, dostając wiadomość o nowej piosence od wybitnych ThePianoGuys. Są po prostu najlepsi i zajmują pierwsze miejsca w rankingu moich ulubionych utworów.

Poniżej przedstawiam ich najciekawsze(moim zadaniem) utwory. Więcej znajdziecie tu!

 

 

formats

Clocks & Clouds

Published on 9 maja 2012, by in Muzyka.

Cudownym uczuciem, jest moment w którym znajduję piękną muzykę. Ostatnimi czasy dzieje się to coraz rzadziej, lecz bardziej emocjonalnie. Całkiem niedawno znalazłem właśnie zespół Clock & Clouds.

Troje ludzi grających na wiolonczeli, skrzypcach(lepiej ułożyć się nie mogło), i bębnach. Co tu dużo opowiadać, w muzyce liczy się muzyka, więc posłuchajcie.

Clock & Clouds

Towers Fall Into The Sea

We Shall Never Surrender

The Final Battle

formats

Liczba Fi w GMP

Published on 8 maja 2012, by in Info.

Żadna liczba nie zachwyca mnie tak jak Fi. Kiedyś zamierzam o niej więcej napisać. Lecz na razie pokażę jej obliczanie z bardzo dużą dokładnością.

Gdy tylko dowiedziałem się o GMP, pierwsze co przyszło mi do głowy: policzę liczbę Fi! Oczywiście nie całą, bo jest niewymierna. Ale jej część.

Zrobiłem to na dwa sposoby. W jednym skorzystałem z Ciągu Fibonacciego a w drugim liczyłem z wzoru: 

GMP jest standardowo napisany w C. Powstała też modyfikacja dla c++ – GMPXX, z której właśnie korzystam.

Ciąg Fibonnaciego

/*
	fi.cpp
	Obliczenie liczby Fi z Ciągu Fibonacciego
*/ 

#include <gmpxx.h> // GMP dla C++
#include <fstream> // I/O dla plików
#include <iostream> // I/O dla konsoli
#include <cstdlib> // Dla atoi
#include <ctime> // Czas
#include<iomanip> // Dla setprecision

int main(int argc, char *argv[])
{
	std::cout<<"*** Obliczanie liczby FI ***"<<std::endl;

	long steps; // Dokładność generowania ciągu Fibonacciego
	long precision; // Precyzja
	char * file_name; // Nazwa pliku

	if(argc >= 4) // Argumenty
	{
		steps = atol(argv[1]);
		precision = atol(argv[2]);
		file_name = argv[3];

	}
	else // Domyślnie
	{
		steps = 10;
		precision = 10;
		file_name = "out.txt";
	}

	mpf_set_default_prec(precision); // Ustaw precyzje

	mpz_class a, b, c; // Trzy zmienne niezbędne do wygenerowania ciągu
	a = 1;
	b = 1;
	c = 1;

	clock_t t1 = clock(); // Zmierz czas
	// Licz Ciąg Fibonacciego
	for(int i = 0; i<steps; i++)
	{
		c = a;
		a += b;
		b = c;
	}

	clock_t t2 = clock(); // Zmierz czas

	mpf_class fi; // Fi

	clock_t t3 = clock(); // Zmierz czas

	// FI = jeden element ciągu dzielony przez element wcześniejszy
	fi  = mpf_class(a) / mpf_class(b); // Oblicz fi

	clock_t t4 = clock(); // Zmierz czas

	std::cout<<"Czas generacji ciągu: "<<(t2 - t1) / 1000<<" ms"<<std::endl;
	std::cout<<"Czas obliczania liczby Fi: "<<(t4 - t3) / 1000<<" ms"<<std::endl;
	std::cout<<"Całkowity czas: "<<(t2 - t1) / 1000 + (t4 - t3) / 1000<<" ms"<<std::endl;

	std::fstream file(file_name, std::ios::out); // Utwórz plik

	file<<std::setprecision(precision)<<fi<<std::endl; // Wypisz Fi

	file.close(); // Zamknij plik

	std::cout<<"*** Koniec działania programu ***"<<std::endl;
	return 0;
}

Kompilacja:

$ g++ fi.cpp -o fi -lgmpxx
Uruchomienie:
./fi [dokładność] [precyzja] [plik wyjściowy]
./fi 1000 1000 ouT_fi_1.txt

Wzór

/*
	fi2.cpp
	Obliczenie liczby Fi ze wzoru
*/ 

#include <gmpxx.h> // GMP dla C++
#include <fstream> // I/O dla plików
#include <iostream> // I/O dla konsoli
#include <cstdlib> // Dla atoi
#include <ctime> // Czas
#include<iomanip> // Dla setprecision

int main(int argc, char *argv[])
{

	std::cout<<"*** Obliczanie liczby FI za pomocą wzoru ***"<<std::endl;

	long precision; // Precyzja
	char * file_name; // Nazwa pliku
	if(argc >= 3) // Argumenty
	{
		precision = atol(argv[1]);
		file_name = argv[2];

	}
	else // Domyślnie
	{
		precision = 10;
		file_name = "out.txt";
	}

	mpf_set_default_prec(precision);  // Ustaw precyzje

	// Wzór:
	// FI = ( sqrt(5) + 1 ) / 2	

	mpf_class fi;

	clock_t t1 = clock(); // Zmierz czas

	fi = (sqrt(mpf_class(5)) + 1 )/2; // FI = ( sqrt(5) + 1 ) / 2

	clock_t t2 = clock(); // Zmierz czas

	std::cout<<"Czas obliczania liczby Fi: "<<(t2 - t1) / 1000<<" ms"<<std::endl;

	std::fstream file(file_name, std::ios::out); // Utwórz plik

	file<<std::setprecision(precision)<<fi<<std::endl; // Zapisz fi do pliku

	file.close(); // Zamknij plik

	std::cout<<"*** Koniec działania programu ***"<<std::endl;
	return 0;
}

Kompilacja

g++ fi2.cpp -o fi2 -lgmpxx

Uruchomienie

./fi2 [precyzja] [plik wyjściowy]
./fi2 1000 out_fi_2.txt

:)

Zdecydowanie można stwierdzić, że sposób ze wzorem jest o wiele szybszy i wydajniejszy.  Dzięki GMP udało mi się policzyć(dało by się pewnie i więcej) jej 300 MB. Ponad 300 milionów miejsc po przecinku. Można ja pobrać tutaj.

 
Tags: ,
formats

Czas leci…

Published on 7 maja 2012, by in Info, Projekty.

Pomyśleć, że już prawie cały miesiąc upłynął od ostatniego wpisu… Wiele się działo, wiele pisało, czas to podsumować.

Pierwszą rzeczą, o której chciałbym opowiedzieć jest projekt gry. Było o nim kilka wpisów na Twitterze, ale czas to rozwinąć.

Tytułu jeszcze nie wymyśliłem. Albo raczej wymyśliłem, lecz zmieniła się konwencja. W każdym bądź razie, gra ta z założeń nie jest skomplikowana. Bazuje na wyklepanym już niestety klasycyzm modelu Arkanoida. Oczywiście planuje wiele innowacji. Główną z nich jest wykorzystanie bardziej realistycznej fizyki. Działa ona na silniku fizycznym Box2D, dzięki czemu w grze są już zaawansowanie kolizje, i co najważniejsze – realistyczne odbicia. Jak znamy klasyczne gry tego typu prędkość piłeczki zależy od np. od poziomu lub ilości zbitych klocków. Tutaj sam gracz decyduje o prędkości piłeczki, nadając jej ją za pomocą słabszych lub mocniejszych odbić. Element ten moim zdaniem jest bardzo ciekawy, i wymagający „wczucia się” w grę.

W planach jest kilkanaście zróżnicowanych(mam nadzieję) poziomów. Zaprojektowaną mam już(lecz nie zrealizowaną) planszę demonstracyjną. Aby ją ukończyć, trzeba odpowiednio przestawić przełączniki, które umożliwią zbicie kluczowego klocka.

Oczywiście w założeniach są tabele z najlepszymi wynikami.

Projekt mój cechować będzie również to, że daję graczu możliwość wyboru sprzętu(czyli paletki do odbijania piłeczki). Planuję zrobić swego rodzaju „sklepik” z paletkami i ulepszeniami, dostępny po ukończeniu każdego poziomu. Dzięki temu gracz będzie mógł ustawiać swoją paletkę w zależności od upodobań. Możliwym będzie zmiana kształtu paletki, ich ciężkości, sprężystości czy może tarcia.

Na chwilę obecną, zaprogramowałem:

  • Szkielet aplikacji
  • „Instancje” menu, gry, poziomów
  • Połączenie systemu z Box2D
  • Szkielety obiektów, i kilka obiektów testowych
  • Graficzną reprezentacje za pomocą biblioteki ClanLib
  • Poruszanie paletką
  • Zbijanie klocków piłeczką

Dużo kodzenia już mam za sobą(ponad 3000 linii kodu), lecz bardzo dużo jeszcze przede mną. Obecny stan projektu umożliwia mi rozpoczęcie prac nad poziomem demonstracyjnym. Lecz wymaga to wiele pracy, szczególnie z grafiką, która mnie trochę spowalnia.

Wersję demonstracyjną(tutaj swego rodzaju zapowiedź :D ) gry planuje ukończyć na początku czerwca. Mam nadzieję, że zdążę.

Gra będzie wydana na dwa systemy: Windows i Linux(to jest pewne, pierwsze próby portowania wypadły pomyślnie).

 

Przez ostatni czas wiele również się u mnie zmieniło. Zmieniłem system operacyjny. Korzystam teraz z Ubuntu. Ciężko było mi się przełamać, lecz po dogłębnej analizie uważam, że interfejs Unity jest całkiem ciekawy. To właśnie od odrzucał mnie od Ubuntu. Swoją drogą ciekawa sprawa z tym wyszła. Początkowo chciałem Debiana. Lecz po 5 próbach instalacji, za każdym razem z innej płyty(za każdym razem ściąłem tez inne wersję płyty), sobie odpuściłem. Wyskakiwały mi błędy instalacji. To chyba wina dysku, bo na wirtualne instalowało się z tych obrazów pięknie. Z głupia sprawdziłem czy Ubuntu się zainstaluje. No i tak zostało. Czy jest lepiej, czy gorzej, to wyjdzie z czasem. Na pewno jest kilka irytujących rzeczy, czy może drobnych i uciążliwych błędów, ale ogólnie jest fajnie.

Wiele problemów sprawiło mi również portowanie mojego projektu na linuksa. Wcześniej nie miałem styczności z instalacją bibliotek na Linuksem, a różni się to trochę od instalacji na Winsowsie, więc kilka kłopotów się zdarzyło. Na szczęście po uporczywym męczeniu z instalacją po dwóch dniach mi się udało. Przydało by się opisać moje problemy dla „następnych”, lecz było ich tyle przy tym, że już szczegółów nie pamiętam.

formats

Jak trudno byc Bogiem

Published on 13 kwietnia 2012, by in Życie.

formats

Rotacja względem punktu o dany kąt

Pisząc projekt, o którym niebawem opowiem, napotkałem trudność. Potrzebowałem rysować prymitywy poddane rotacji. Niestety framework w którym pisze nie załatwił tego za mnie, więc problem musiałem rozwiązać sam. Pokażę dziś jak obliczyć pozycję punktu, po rotacji pod kątem alfa, względem danego punktu.

Sytuację przedstawia poniższy rysunek:

 

Potrzebujemy obliczyć pozycję punktu B, mając dany punkt A, S oraz kąt Alfa. Literkami a oraz b oznaczone są wektory, które wskazują na punkty A i B względem punktu S. Długości wektorów a oraz b są takie same.

Zacząć musimy od obliczenia kąta Beta. Beta jest to kąt pomiędzy wektorem a a półprostą zaczynającą się w punkcie S, o stałej wartości Y i rosnącym Xie. Potrzebujemy Betę aby móc skorzystać w prosty sposób z definicji sinusa oraz cosinusa.

Na początek warto obliczyć współrzędne wektorów, aby potem w prosty sposób z nich korzystać.

Aby obliczyć kąt beta, może,y stworzyć wektor pomocniczy oznaczony literką t, o początku w punkcie S i tmp. Wartość x wektora t może być dowolna dodatnia, ja wybrałem 2, żeby było coś widać na rysunku. Następnie opierając się na moim poprzednim wpisie, obliczmy kąt pomiędzy wektorem pomocniczym a a.

Gdy obliczyliśmy już kąt beta  nic nie stoi na przeszkodzie, aby obliczyć gamma.

Dobrze, kolejnym krokiem będzie utworzenie kolejnego wektora pomocniczego. Oznaczymy go literką c. Wektor ten będzie mieć taki sam zwrot i kierunek jak poprzedni wektor pomocniczy t, lecz jego długość będzie taka sama jak wektora a oraz b. Czyli:

Mając obliczony wektor c możemy obliczyć x i y, opisujące punkt B. Aby je obliczyć, posłużymy się wzorem na sinus oraz cosinus w układzie współrzędnych.

 

x, y są to współrzędne punktu. r jest to odległość od środka układu(u nas punkt S) do tego punktu, więc r jest po prostu równe długości wektora. Zamiast kąta alfa posłużymy się kątem gamma. Czyli

 

 

Punkt B jest równy (Sx + x, Sy + y).

 

Zdaje sobie sprawę, że trochę to pogmatwałem, lecz mam nadzieję, że kod źródłowy i przykład do niego dołączony ułatwi zrozumienie tego.

#include <iostream>
#define _USE_MATH_DEFINES
#include <math.h>
#include <iomanip>

using namespace std;

struct Point
{
        double x, y;
};

struct Vector2
{
        double x, y;
};

double deg(double rad) // Zamień radiany na stopnie
{
	return rad/M_PI*180;
}
double rad(double deg) // Zamień stopnie na radiany
{
	return deg*M_PI/180;
}

double angle(Vector2 a, Vector2 b) // oblicz kąt pomiędzy wektorami
{
        return acos ( (a.x * b.x + a.y * b.y) / ( sqrt( pow(a.x, 2) + pow(a.y, 2) ) *  sqrt( pow(b.x, 2) + pow(b.y, 2) )) );;
}

Point rotate(Point A, Point S, double alpha) // oblicz kąt pomiędzy wektorami
{
	Point B;// szukany punkt
	if(A.x == S.x && A.y == S.y)
		return A;
	Vector2 a, b; // wektory a i b
		a.x = A.x - S.x;
		a.y = A.y - S.y;

	double r = sqrt(pow(a.x, 2) + pow(a.y, 2)); // długość wektora a

	Point tmp; tmp.x = S.x+1; tmp.y = S.y; // punkt pomocniczy
	Vector2 t; // wektor pomocniczy
		t.x = 2; // zapis troszkę sktócony :)
		t.y = 0;

	double beta = angle(a, t); // kąt pomiędzy wektorami a i t

	double gamma = beta + alpha;// kąt pomiędzy wektoami a i b

	Vector2 c; // kolejny wektor pomocniczny(dla zobrazowania)
		c.x = r;
		c.y = 0;

	b.x = cos(gamma) * r;// C.x
	b.y = sin(gamma) * r;

	// oblicz pozycję B mając dany wektor b i punkt S
	B.x = S.x + b.x;
	B.y =S.y +   b.y;

	return B;
}

int main()
{
	Point a, s;
	double alfa;
	// Wejście:
	// Ax Ay Sx Sy Alfa
	// Wyjście:
	// Bx By
	while(cin>>a.x>>a.y>>s.x>>s.y>>alfa)
	{
		Point b = rotate(a, s, rad(alfa));// oblicz pozycje punktu B
		cout<<fixed <<b.x<<" "<<b.y<<" "<<endl; // Wypisz pozycje punktu B
	}

	return 0;
}
in:
2 8 1 2 180
2 8 1 2 45
10 10 5 5 180
5 5 -1 -1 360
3 3 1 1 90
5 5 0 0 45
out:
-0.000000 -4.000000
-2.535534 6.949747
-0.000000 0.000000
5.000000 5.000000
-1.000000 3.000000
0.000000 7.071068

Przetestuj online

Rotacja obiektów

Poddawaliśmy rotacji względem punktu pojedyncze punkty. Jak sprawa się ma przy obiektach, takich jak trójkąty/kwadraty? Zadziwiająco prosto. Wystarczy poddać takiej samej rotacji każdy punkt obiektu.

Tags: ,
formats

Kąt pomiędzy dwoma wektorami

Published on 6 kwietnia 2012, by in Geometria, Matematyka.

Pokaże dziś w jaki sposób można obliczyć kąt pomiędzy dwoma wektorami.

Opierać się będziemy na wzorze na iloczyn skalarny dwóch wektorów. Wygląda on tak:

Możemy go przekształcić, otrzymując:

Natomiast mając dany cosinus danego kąta, możemy użyć funkcji do niej przeciwnej, aby uzyskać jego kąt. Czyli

Ponadto wiadomo że:

 

Funkcja odwrotna do cos czsto oznaczana jest również arccos, i tak też jest oznaczana w wielu językach programowania(albo raczej w ich bibliotekach).  W praktyce wygląda to tak:

Vector2 a, b;
double angle;
angle = acos ( (a.x * b.x + a.y * b.y) / ( sqrt( pow(a.x, 2) + pow(a.y) ) *  sqrt( pow(b.x, 2) + pow(b.y, 2) )) );

Funkcja acos zwraca kąt w przedziale <0, π>,  a jeżeli zależało by nam na tym, aby móc operować na kątach(skierowanych)  większych niż 180 stopni, musimy dodać mały zabieg:

if(a.y < 0)
{
	if( a.x < 0) angle +=M_PI/2; // ćwiarta III
	else angle +=M_PI/2 * 3; // wiartka IV
}

Oto przykład działania(przetestuj online):

#include <iostream>
#define _USE_MATH_DEFINES
#include <math.h>

using namespace std;

struct Vector2
{
        double x, y;
};

double angle(Vector2 a, Vector2 b) // oblicz kąt pomiędzy wektorami
{
        return acos ( (a.x * b.x + a.y * b.y) / ( sqrt( pow(a.x, 2) + pow(a.y, 2) ) *  sqrt( pow(b.x, 2) + pow(b.y, 2) )) );;
}

double deg(double rad) // Zamień radiany na stopnie
{
        return rad/M_PI*180;
}

int main()
{
        Vector2 a, b;
        while(cin>>a.x>>a.y>>b.x>>b.y)
        {

                cout<<deg(angle(a, b))<<endl; // Wypisz kąt pomiędzy wektorami
        }

        return 0;
}
in:
10 10 -1 1
1 0 1 -1
1 0 -1 0
10 10 -10 -10
3 4 -1 6

out:
90
45
180
180
46.3322
Tags: ,
formats

Emocjonalna bomba…

Published on 31 marca 2012, by in Muzyka.

Wykonawca –  ViolinTay

formats

Cytat

Published on 25 marca 2012, by in Muzyka, Życie.

Nigdy nie przyjmuj postawy, że wygodniej wiedzieć mniej - giaco1987

Przeglądając ostatnio wykop.pl wpadłem na pewną piosenkę. Już miałem ją wyłączyć, gdyż nie lubię takich „rytmów”, wręcz karcą moje uszy, lecz słowa tej piosenki są warte przekazania ich dalej.

formats

Ideone.com – twój kompilator online

Published on 25 marca 2012, by in Ciekawostki, Programowanie.

Ideone.com to cudowne narzędzie. Dzięki niemu możemy skompilować kod online. Oczywiście nie nadaje się on do tworzenia dużych projektów. Przeznaczony on jest do pomniejszych kodów. Sprawa naprawdę bardzo pomocna. Jako, że ostatnio nie byłem u siebie, to swój poprzedni wpis właśnie na nim opierałem.  Oprócz tego, możemy wyłączyć kompilacje i zrobi się z niego klasyczny pastebin.  Oferuje on kolorowanie składni, oraz kompilacje dla ponad 40 języków.

Do programu przesłanego do ideone.com możemy dołożyć wejście. Sprawia to, że jest to bardzo dobrze narzędzie do testowania różnych problemów programistycznych. Np. takich ze SPOJa.

credit
© 2011-2012 WiecznyWem