BETA
Aby się zalogować, najpiew wybierz portal.
Aby się zarejestrować, najpiew wybierz portal.
Podaj słowa kluczowe
Słowa kluczowe muszą mieć co najmniej 3 sąsiadujące znaki alfanumeryczne
Pole zawiera niedozwolone znaki

Baza wiedzy











Kontrolka rysująca fraktale

11-06-2005 01:09 | yoopi
Fraktal jest to obiekt geometryczny, który charakteryzuje się tym, że każda jego część po powiększeniu jest podobna do całości. Artykół obrazuje jak wygenerować proste fraktale przy użyciu kontrolki.

    Wstęp

Artykuł ten przedstawia sposób tworzenia kontrolki rysyjącej fraktale. Istnieje w niej możliwość narysowania Trójkąta Sierpińskiego oraz krzywej Kocha.

Fraktal

 

Fraktal jest to obiekt geometryczny, który charakteryzuje się tym, że każda jego
część po powiększeniu jest podobna do całości.

 

Zdecydowaliśmy się wybrać tylko dwa fraktale (spośród bardzo wielu). Są to:

§            Trójkąt Sierpińskiego

§              Krzywa Kocha

 

Jedyną informacją wymaganą od użytkownika jest podanie stopnia wyżej wymienionych fraktali. Stopień ten podajemy przez wpisanie odpowiedniej liczby w pole tekstowe. Domyślnym stopniem fraktali jest stopień 1.

 

Kontrolka

Kontrolkę nazwaliśmy fraktal . Umieszczone na niej zostały dwa przyciski wywołujące funkcje rysujące fraktale, pole tekstowe do wpisania stopnia generowanych fraktali, oraz obrazki przedstawiające wygląd obiektów fraktali powstałych po naciśnięciu odpowiadających im przycisków.

 

            Aby mieć możliwość skorzystania z mechanizmów rysujących na ekranie, należy skorzystać z następujących przestrzeni nazw:

 

using System.Drawing;

 

using System.Drawing.Imaging;

 

W pierwszej z nich znajduje się klasa Bitmap oraz klasa Pen.

 

Aby zdefiniować obszar kreślenia rysunku musimy stworzyć instancję obiektu klasy Bitmap, jako parametry podajemy wielkość bitmapy. W naszym przypadku bitmapa ma wielkość 600 x 600 pikseli.

 

public static Bitmap obrazek = new Bitmap(600,600);

 

Następnie tworzymy instancję obiektu Graphics za pomocą metody tej klasy o nazwie FromImage. Jako parametr funkcja ta przyjmuje bitmapę.

 

 

Graphics grafika = Graphics.FromImage(obrazek);

 

 

Po stworzeniu miejsca, w którym będzie tworzony nasz obrazek, musimy zdefiniować obiekty pędzel (Brush), oraz pióro (Pen).

 

                              

public static Brush brush = new SolidBrush(Color.Black);

 

 

Linijka powyżej określa kolor pędzla, a linijka poniżej określa grubość kreślonej linii.

 

 

public Pen dlugopis=new Pen(brush,2);

 

Z użytych funkcji klasy  Graphics, użyta została jeszcze funkcja Clear, która służy do wyczyszczenia całego obrazka, przez wypełnienie go jednolitym kolorem.

 

grafika.Clear(System.Drawing.Color.Red);

 

 

 

 

Funkcje rysujące fraktale

 

            Jako pierwsza zostanie przedstawiona funkcja rysująca Trójkąt Sierpińskiego. W funkcji tej zastosowany jest mechanizm rekurencji. Do rysowania poszczególnych linii trójkąta użyta jest funkcja DrawLine klasy Graphics, która przyjmuje trzy parametry. Pierwszym z nich jest obiekt klasy Pen, następne dwa parametry to punkty będące początkiem i końcem rysowanej linii. Funkcja trójkąt jako parametry przyjmuje współrzędne trzech wierzchołków trójkąta oraz stopień fraktala.

 

 

public void trojkat(int x1,int y1,int x2,int y2,int x3, int y3, int st)

 

W wypadku gdy podczas wykonywania rekurencyjnego funkcji stopień osiągnie wartość zero, rysowany jest trójkąt.

 

  if ( st == 0 )

  { 

     grafika.DrawLine(dlugopis,new PointF(x1,y1),new PointF(x2,y2));

                                                              

     grafika.DrawLine(dlugopis,new PointF(x2,y2),new PointF(x3,y3));

                                                                                                                            

     grafika.DrawLine(dlugopis,new PointF(x3,y3),new PointF(x1,y1));

                                                              

  }

 

W przeciwnym wypadku wywoływana jest rekurencja funkcji

  else

{

  // jeśli stopien > 0 rysowanie 3 trojkatow stopnia o 1 mniejszego

                                                  

  trojkat(x1,y1,(x1+x2)/2,(y1+y2)/2,(x1+x3)/2,(y1+y3)/2,st-1);

                                

  trojkat((x1+x2)/2,(y1+y2)/2,x2,y2,(x2+x3)/2,(y2+y3)/2,st-1);

                                                

  trojkat((x1+x3)/2,(y1+y3)/2,(x2+x3)/2,(y2+y3)/2,x3,y3,st-1);

 

}

 

Drugim fraktalem, którego można narysować za pomocą naszej kontrolki to Krzywa Kocha. Podobnie jak w poprzednim przypadku funkcja rysująca wywoływana jest rekurencyjnie.

Deklaracja  funkcji wygląda następująco

void Koch(float x1,float y1,float x2,float y2, int st)

 

W funkcji potrzebować będziemy jeszcze dwóch zmiennych oznaczających odległości punktów potrzebne później do określenia współrzędnych nowych punktów.

 

 

float dx=x2-x1,dy=y2-y1;

W wypadku gdy stopień osiągnie 0 podobnie jak poprzednio następuje rysowanie , tym razem rysowana jest jednak tylko jedna linia.

 

                if ( st == 0 )

                { 

// jeśli stopień = 0 - rysowanie linii

               

grafika.DrawLine(dlugopis,new PointF(x1,y1),new PointF(x2,y2));

                }

 

 

 

 

Jeśli stopień wynosi więcej niż zero funkcja wywoływana jest rekurencyjnie z obliczonymi odpowiednimi współrzędnymi wierzchołków               

else

                {

 

                               Koch(x1,y1,x1+dx/3,y1+dy/3,st-1);

                              

Koch(x1+dx*2/3,y1+dy*2/3,x2,y2,st-1);

                              

// od 1/3 odcinka do wierzcholka trojkata rownobocznego

                               // wyznaczonego przez 1/3 odcinka i 2/3 odcinka

                              

Koch(x1+dx/3,y1+dy/3,(x1+x2)/2+  (float)Math.Sqrt(3)/6*dy,  (y1+y2)/2- (float)Math.Sqrt(3)/6*dx,st-1);

 

                               // od od wierzcholka tr. rownobocz. wyznaczonego przez 1/3 odcinka i 2 odcinka

                               // do 2/3 odcinka

                               Koch((x1+x2)/2+ (float) Math.Sqrt(3)/6*dy  , (y1+y2)/2-  (float)Math.Sqrt(3)/6*dx,x1+dx*2/3,y1+dy*2/3,st-1);

                }             

}

 

Funkcja trojkot i funkcja Koch są do siebie bardzo podobne, różnicą jest jedynie, że w przypadku kreślenia krzywej Kocha musimy dokonywać bardziej złożonych podziałów odcinków.

 

Rysowanie obiektów następuje po naciśnięciu przycisków, odpowiedniego dla każdej funkcji. Obiekt wynikowy przekazywany jest jako odpowiedź do przeglądarki(typ wysyłanego obrazka to gif).

 

private void Button2_Click(object sender, System.EventArgs e)

{

// pobranie stopnia z pola tekstowego

                stopien = Int32.Parse(TextBox1.Text);           

                                              

                // wyczyszczenie obszaru kreślenia

                grafika.Clear(Color.Yellow);

 

// rysowanie krzywej Kocha

                Koch(100,450,540,450,stopien);

 

                // pokazanie obrazka na stronie

                obrazek.Save(Response.OutputStream,ImageFormat.Gif);

                                              

}

 

 

           

Aby użyć naszej kontrolki, na stronie umieszczamy nowy panel, do którego następnie ładujemy obiekt naszej kontrolki.

 

      Kontrolka_Fraktale.Controls.Add(Page.LoadControl("~/fraktal.ascx"));

 

Podsumowanie

 

            Zaprezentowana kontrolka ma możliwość rysowania dwóch prostych fraktali, ale można ją wykorzystać do rysowania bardziej skomplikowanych wzorów. Wystarczy dodać odpowiednie funkcje rysujące obiekty. Dużo takich funkcji można znaleźć w internecie. Najprawdopodobniej funkcje te będą w innych językach programowania, ale w większości wypadków nie będzie to problemem. Najważniejszy jest przecież algorytm.

Załączniki:

Podobne artykuły

Komentarze 2

greyprogrammer
greyprogrammer
15 pkt.
Nowicjusz
21-01-2010
oceń pozytywnie 0
gratuluję znajomości podstaw języka polskiego. Artykuł piszę się przez "u" a nie przez "ó".

Pozdrawiam,
PC
xqsnake
xqsnake
8 pkt.
Nowicjusz
21-01-2010
oceń pozytywnie 0
w tym artykule liczy sie przede wszystkim znajomosc fraktali ;)))))))
pkt.

Zaloguj się lub Zarejestruj się aby wykonać tę czynność.