powrót

Jak powstały gwiazdki

Pierwszą rzeczą oczywiście był rysunek. Po jego zeskanowaniu i odpowiedniej obróbce (wyrównanie progów szarości tak aby faktura papieru nie była widoczna) pałeczkę przejmuje program. Losuje on ilość powtórzeń, numer obrazu wejściowego, wartość obrotu początkowego oraz współrzędne osi obrotu. Na podstawie współrzędnych osi obrotu program szacuje (według najdłuższej przekątnej) maksymalny rozmiar obrazka i do takiego rozmiaru powiększa obszar na którym znajduje się wybrany szkic wejściowy. Następnie przesuwa szkic tak aby oś obrotu znalazła się dokładnie na środku obrazu wyjściowego. Kolejnym etapem jest wielokrotne obrócenie szkicu o kąt wyliczony na podstawie ilości powtórzeń (360 / ilość powtórzeń). Po wykonaniu ostatniego obrotu przychodzi czas na kilka zabiegów kosmetycznych. Całość powtarzam wielokrotnie w trybie automatycznym. Komputer w ciągu kilku godzin generuje dużą ilość geometrycznych wzorów z którzych wybieram te które moim zdaniem są najbardziej atrakcyjne.

Skrypt dla Corel PhotoPaint

Program można ściągnąć w tym miejscu: gwiazdki.gms. Należy go zapisać w katalogu Corel-a PhotoPaint-a w którym znajdują się skrypty VBA (u mnie jest to katalog c:\Program Files\Corel\Corel Graphics 11\CorelPHOTO-PAINT\GMS). Mogą wystąpić problemy przy instalacji skryptu na innej wersji Corela niż 11. Skrypt wymaga zainstalowanej obsługi skryptów Microsoft Visual Basic. Generowanie gwiazdki za pomocą mojego programu wykonujemy wybierając z menu narzędzia - VisualBasic - Odtwórz. Pokazuje nam się okno dialogowe "Makra programu Corel PhotoPaint 11 Visual Basic". Z listy "Macros in" uruchamiamy gwiazdki - module1.generuj. Jeżeli z makro w postaci pliku gms nie działa na Twoim komputerze - możesz skopiować poniższy kod i za pomocą edytora Visual Basic wprowadzić go do swojej instalacji Corel Draw.
Attribute VB_Name = "Module1"
Sub gwiazdka(ilosc_obrotow, obrot_na_wjazd, srodek_obrotu_x, srodek_obrotu_y, zapisac, na_cb)

'określam kolor papieru jako biały
temp = CorelScript.SetPaperColor(9, 255, 0, 0, 0)


'wyprowadzam pomocne zmienne
srodek_obrotu_x_zr = srodek_obrotu_x
srodek_obrotu_y_zr = srodek_obrotu_y
szerokosc = PHOTOPAINT.ActiveDocument.SizeWidth
wysokosc = PHOTOPAINT.ActiveDocument.SizeHeight
srodek_obrotu_x = srodek_obrotu_x / 100 * szerokosc
srodek_obrotu_y = srodek_obrotu_y / 100 * wysokosc

'obliczam rozmiary obrazka wynikowego (zmienna nowy_bok)
przekatna1 = (srodek_obrotu_x ^ 2 + srodek_obrotu_y ^ 2) ^ 0.5
przekatna2 = ((szerokosc - srodek_obrotu_x) ^ 2 + srodek_obrotu_y ^ 2) ^ 0.5
przekatna3 = (srodek_obrotu_x ^ 2 + (wysokosc - srodek_obrotu_y) ^ 2) ^ 0.5
przekatna4 = ((szerokosc - srodek_obrotu_x) ^ 2 + (wysokosc - srodek_obrotu_y) ^ 2) ^ 0.5

maksymalna_przkatna = przekatna1
If przekatna2 > maksymalna_przekatna Then maksymalna_przekatna = przekatna2
If przekatna3 > maksymalna_przekatna Then maksymalna_przekatna = przekatna3
If przekatna4 > maksymalna_przekatna Then maksymalna_przekatna = przekatna4
nowybok = maksymalna_przekatna * 2


'ten warunek służy do optymalizacji pracy komputera (ograniczenie wielkości obrazka wynikowego do 2000 piksli
max_bok = 2000
If nowybok > max_bok Then
wspolczynnik = max_bok / nowybok
nowybok = max_bok
szerokosc = szerokosc * wspolczynnik
wysokosc = wysokosc * wspolczynnik
srodek_obrotu_x = srodek_obrotu_x * wspolczynnik
srodek_obrotu_y = srodek_obrotu_y * wspolczynnik
Call PHOTOPAINT.ActiveDocument.Resample(szerokosc, wysokosc, True)
End If


Dim pierwsza_gwiazdka As Layer
Set pierwsza_gwiazdka = PHOTOPAINT.ActiveDocument.Background.ConvertToLayer("nowa", 100, pntMergeNormal)
pierwsza_gwiazdka.Selected = True

Call PHOTOPAINT.ActiveDocument.PaperSize(nowybok, nowybok, 0, 0)

srodek_dokumentu_x = nowybok / 2
srodek_dokumentu_y = nowybok / 2

Call pierwsza_gwiazdka.SetPosition(srodek_dokumentu_x - srodek_obrotu_x, srodek_dokumentu_y - srodek_obrotu_y)
pierwsza_gwiazdka.MergeMode = pntMergeSubtract
Call pierwsza_gwiazdka.Rotate(obrot_na_wjazd / 10, srodek_dokumentu_x, srodek_dokumentu_y, True)
Call pierwsza_gwiazdka.CreateMask(pntMaskAdd)

'najważniejsza część programu - generowanie powtórzeń
For numer_gwiazdki = 1 To ilosc_obrotow - 1
Call pierwsza_gwiazdka.Copy
Set gwiazdka_robocza = PHOTOPAINT.ActiveDocument.Layers.Paste
Call gwiazdka_robocza.AlignToLayer(pntAlignVCenter, pierwsza_gwiazdka)
Call gwiazdka_robocza.AlignToLayer(pntAlignHCenter, pierwsza_gwiazdka)
Call gwiazdka_robocza.Rotate(numer_gwiazdki * (360 / ilosc_obrotow) / 10, srodek_dokumentu_x, srodek_dokumentu_y, True)
Call gwiazdka_robocza.SetMergeMode(pntMergeSubtract)
Call gwiazdka_robocza.CreateMask(pntMaskAdd)
Call gwiazdka_robocza.Merge
Next

'na koniec kilka zabiegów kosmetycznych
Call PHOTOPAINT.ActiveDocument.Layers.Merge
Set pierwsza_gwiazdka = PHOTOPAINT.ActiveDocument.Background.ConvertToLayer("nowa", 100, pntMergeNormal)
Call pierwsza_gwiazdka.CropToMask
Call PHOTOPAINT.ActiveDocument.Layers.Merge
Call PHOTOPAINT.ActiveDocument.Mask.Delete
End Sub
Function przypadkowa(lowerbound, upperbound)
Randomize
przypadkowa = Int((upperbound - lowerbound + 1) * Rnd + lowerbound)
End Function
Public Sub jedziem()
Call gwiazdka(przypadkowa(3, 6), przypadkowa(1, 360), przypadkowa(30, 70), przypadkowa(30, 70), True, False)
End Sub