More about DGS DR. GENIUS Guile Script Skrypty DGS - najprostsze przykłady

Skrypty DGS - najprostsze przykłady

Aby otworzyć skrypt Guile należy rozpocząć od wybrania narzędzia do tworzenia skryptów DGS, dostępnego w menu "Miary", lub z menu kontekstowego, ukrytego pod prawym przyciskiem myszy. Skrypt Guile może pobierać od 0 do n parametrów wejściowych (n - liczba naturalna).

Po wyborze narzędzia należy kliknąć na obiekcie, który ma posłużyć skryptowi jako parametr wejściowy (można kliknąć po kolei kilka obiektów - skrypt zapamięta parametry w kolejności ich wyboru), nastepnie zaś, jeśli uznamy że wybór parametrów dla skryptu został zakończony - kliknąć gdziekolwiek w obszarze roboczym ekranu - to miejsce będzie miejsce zadokowania skryptu na ekranie. Położenie skryptu zawsze możemy zmienić używając narzędzia do przesuwania elementów na ekranie - zmiana położenia nie zmieni w żaden sposób działania skryptu, może jedynie poprawić wygląd ilustracji.

Dobrą forma nauki tworzenia skryptów Guile jest praca z kilkoma konkretnymi przykładami - wówczas potęga skryptów i ich funkcjonalność jest dużo łatwiejsza do zrozumienia. Skrypty w Dr.Genius, podobnie jak makrokonstrukcje, nadają programowi szczególne znaczenie - pozwalają mianowicie wykonać operacje, których nie przewidzieli (lub nie chcieli przewidzieć) Autorzy programu 1. Dają możliwość programowania w Dr.Genius - co jest ogromnym atutem programu. Bardzo istotne jest to, że DGS rozpoznaje ogromną część narzędzi interpertera GNU Guile, szczególnie w przypadku funkcji 2. Działanie tych funkcji zostało dokładnie przetestowane - można stwierdzić że DR.Genius wyjątkowo dobrze współpracuje z tego typu bibliotekami Guile.

Skrypt DGS bez parametrów wejściowych

Tworząc taki skrypt pamiętać należy, że po wybraniu narzędzia tworzenia skryptu DGS nie można klikać na żadnym obiekcie, tylko w obszarze roboczym, a którym żąden taki obiekt się nie znajduje ("wolne miejsce"). Skrypt zostanie zadokowany w miejscu kliknięcia. W przeciwnym przypadku, jeżeli przez omyłkę klikniemy obiekt - Dr.Genius przyjmie, że jest to obiekt wejściowy dla skryptu 3. Po zadokowaniu skryptu zobaczymy na ekranie migający napis "Dr.Genius". Taki napis oznacza, że użytkownik może przystąpić do tworzenia skryptu, który na razie jest "pusty" - nie zawiera żadnych poleceń. Skrypt jest takim samym obiektem jak inne - edycji podlegają jego właściwości (tekst) oraz styl (wygląd na ekranie). Aby utworzyć skrypt wybieramy narzędzie do ustalania właściwości obiektu i klikamy napis "Dr.Genius". Na ekranie pojawi się okno edycji skryptu:

Okno edycji skryptu:

Generator liczb losowych

Utworzymy prosty generator liczb losowych. W oknie skryptu wpiszemy następujący kod:

(random 10)
i zatwierdzamy skrypt, klikając OK. Jeżeli chcemy pozostawić okno edycyjne otwarte i zapisać częściowe zmiany - klikamy przycisk Zastosuj. W przypadku jakichkolwiek zmian na ekranie (kształt dowolnego obiektu, zmiana położenia itd.) skrypt wygeneruje liczbę losową, całkowitą, z przedziału [0, 10). Gdybyśmy zamiast liczby całkowitej chcieli otrzymać liczbę z przedziału [0,1) zapisujemy:
(random:uniform)

(!) Kilka istotnych szczegółów:

Obliczanie określonych wartości

Na przykład: aby obliczyć przybliżoną wartość liczby Pi napiszemy:

(acos -1)
W przypadku liczby E natomiast:
(exp 1)

Wartości numeryczne, generowane przez skrypty Guile w Dr.Genius są o tyle użyteczne, o ile użyteczne są wartości numeryczne generowane przez program w ogóle. W rozwiązywaniu takich drobnych problemów skrypty mogą być bardzo pomocne. Należy jednak pamiętać, że nie jest to ich główne zadanie. Mogą bowiem zostać wykorzystane do bardzo ciekawych zastosowań, o ile posiadają przynajmniej jeden parametr wejściowy.

DGS z przynejmniej jednym parametrem wejściowym

Procedura postępowania przy tworzeniu skryptu z parametem jest praktycznie taka sama. Po wybraniu narzędzia tworzenia skryptu DGS klikamy obiekt, który ma byc parametrem wejściowym, następnie zaś klikamy w dowolnym miejscu na ekranie, gdzie chcemy zadokować skrypt. Parametr wejściowy zostaje zapamiętany przez skrypt pod nazwą a1. Jeżeli wprowadzimy kilka parametrów wejściowych to - w kolejności ich wskazywania - program zapamieta je pod nazwami (odpowiednio) a1, a2... etc.

W zależności od typu przedmiotu, wybranego jako parametr dla skryptu - używamy rozmaitych metod do przekazania skryptowi wartości czy współrzędnych obiektu... Omówienie tych metod znajduje się w seksji Obiekty i metody w DGS W dalszym ciągu będziemy stopniowo konstruować fragment krzywej, będącej wykresem funkcji oraz stycznej do tej krzywej w punkcie, poruszającym się po skonstruowanym fragmiencie krzywej. Ostateczna wersja konstrukcji znajduje się w katalogu /usr/share/drgenius/examples/slope.drgenius.

slope.drgenius

Definiowanie wartości z zadanego przedziału

Nową konstrukcję rozpoczynamy od wykreślenia dwóch punktów i odcinka, którego końcami będą te dwa punkty. Następnie na odcinku umieszczamy swobodny punkt, który nazwaliśmy "Move me!" (przesuń mnie). Ten punkt będzie służył jako łącznik ze skryptem. Ponarysowaniu i opisaniu punktu tworzymy skrypt DGS z jednym paramtrem wejściowym.

Gdy a1 jest odwołaniem do punktu "Move me!" - następujący skrypt zwróci wartość dziesiętną z przedziału [-10,10]:

(define x (getAbscissa a1))
(* 20  (- x 0.5))
Niezbędne są dodatkowe wyjaśnienia.
W pierwszej linii skryptu definiujemy zmienną x, której przypisujemy wartość odciętej punktu "Move me!". Wywołanie (getAbscissa a1) pobiera wartość krzywoliniowej odciętej obiektu X ( w tym wypadku odciętej punktu "Move me!") - który w skrypcie zapamiętany jest jako parametr wejściowy a1
4. Wartość jest przypisana zmiennej x.

W drugiej linii skryptu zapisujemy wyrażenie przetwarzające pobraną wartość z przedziału [0,1] na wartość z przedziału [-10,10]. Wyrażenie ma postać: 20*x - 10 (istotnie, jeśli podstawimy w miejsce x liczbę 0 - otrzymamy wartość -10, jeżeli zaś podstawimy 1 - otrzymamy 10, jeśli podstawimy jakąkolwiek liczbę z przedziału [0,1] - otrzymamy liczbę z przedziału [-10,10]). Po sprowadzeniu wyrażenia do postaci 20*(x - 0.5) zapisujemy je w skrypcie, stosując tzw. prefiksową notację odwrotną. Krótko mówiąc aby zapisać dwuargumentowe działanie najpierw wpisujemy symbol działania, potem zaś po kolei argumenty, oddzielając je spacjami. Np. chcąc zapisać (x+5) w skrypcie napiszemy: (+ x 5). Jeżeli argumentem działania jest wynik innego działania - stosujemy nawiasy. Stąd zapis (* 20 (- x 0.5)) oznacza: "pomnóż liczbę 20 przez wyrażenie w nawiasie, w którym od liczby x odejmij 0.5".

Ponieważ druga linia skryptu jest zarazem jego ostatnią linią - wartość obliczona w tej lini jest wynikiem działania skryptu i zostanie przypisana jako wartośc numeryczna obiektowi a1, czyli punktowi "Move me!". Nazwijmy ten skrypt X0.

Tworzenie fragmentu wykresu funkcji

Wartość obliczona w poprzednim skrypcie posłuży nam jako argument dla funkcji, ktorej fragment wykresu będziemy teraz rysować. W następnym kroku wyznaczymy wartości funkcji x -> cos(x).

(define x (getValue a1))
(cos x)
Wywołanie (getValue a1) służy do pobrania wartości obliczonej w poprzednim skrypcie czyli argumentu dla funkcji, poczhodzącego z przedziału [-10,10]). Następnie obliczamy wartość funkcji - (cos x) i ta wartość, jako że znajduje się w ostatniej linii skryptu zostaje zapamiętana jako wynik działania skryptu. Nazwijmy ten drugi skrypt Y0.

W kolejnym wyświetlamy na ekranie punkt o współrzędnych (X0,Y0), korzystając z narzędzia punkt o danych współrzędnych. Ten punkt należy do wykresu funkcji x->cos(x), w przedziale [-10,10]. Nazwijmy punkt Mo. Ostatnim krokiem jest wykreślenie miejsca geometrycznego punktów Mo w zależności od położenia punktu "Move me!". Aby to wykonać nalezy wybrać narzędzie miejsce geoemetryczne, następnie kliknąć najpierw punkt "Move me!", potem zaś punkt Mo. I w ten sposób narysowaliśmy w Dr.Genius... wykres funkcji !!!

Wyznaczenie i wyświetlenie stycznej do krzywej

ABy wykreślić styczną do krzywej w danym punkcie (linię prostą) potrzebujemy przede wszystkim wartości pochodnej funkcji w tym punkcie. Ta wartość jest równa współczynnikowi kierunkowemu stycznej do wykresu funkcji w danym punkcie. Pochodną funkcji x->cos(x) jest funkcja x->-sin(x). Interesuje nas wartość -sin(X0). Tworzymy skrypt z jednym parametrem wejściowym. Parametrem w tym wypadku jest wartość zwrócona przez skrypt X0:

(- 0 (sin (getValue a1)))
Stosujemy, jak poprzednio prefiksową notację odwrotną. Nazwijmy nowy skrypt "Slope at Mo". Gdy zmienimy położenie punktu "Move me!" wartość zwracana przez nowy skrypt zostanie automatycznie zaktualizowana.

Teraz spróbujemy wyświetlić styczną do wykresu funkcji w punkcie X0. Ponieważ jest to linia prosta - potrzebujemy do jej wyświetlenia dwóch punktów. Na razie mamy do dyspozycji współrzędne punktu styczności (X0,Y0). Wyznaczmy współrzędne drugiego punktu.

Zacznijmy od odciętej drugiego punktu. Niech na przykład X1 = X0 + 2. Jeśli tak - tworzymy kolejny skrypt z jednym parametrem wejściowym, w tym wypadku X0:

(define x1 (getValue a1))
(+ x1 2)
Nazwijmy skrypt X1.

Przejdźmy do obliczenia rzędnej punktu X1. Będą nam potrzebne następujące wartości:

Każdy z tych elementów należy kliknąć, w podanej wyżej kolejności, po wybraniu
narzędzia do tworzenia skryptów DGS.

W następującym skrypcie obliczamy wartość rzędnej punktu X1, stosując następujący wzór: Y0 + m*(X1 - X0), gdzie m oznacza współczynniki kierunkowy stycznej, czyli w naszym wypadku "Slope at Mo". Pozostałe oznaczenia nie wymagają dodatkowych objaśnień.

(define x0 (car (getCoordinates a1)))
(define y0 (cadr (getCoordinates a1)))
(define m (getValue a2))
(define x1 (getValue a3))
(+ (* m (- x1 x0)) y0)
Kilka słów wyjaśnienia na temat nowych metod, użytych w tym skrypcie: Pozostała część skryptu nie wymaga dodatkowych objaśnień. Nazwijmy ten skrypt Y1.

Ostatnim etapem będzie wyświetlenie punkt M1 o współrzędnych (X1, Y1) - korzystamy z narzędzia punkt o danych współrzędnych i narysowanie linii prostej przechodzącej przez punkty Mo i M1 - korzystamy z narzędzia linia prosta

Oczywiście, zamiast użycia tak dużej ilości prostych i krótkich skryptów można by było użyć jednego lub dwóch skryptów bardziej skomplikowanych. Mamy jednak nadzieję, że ten szczegółowy opis zachęci trochę do tworzenia własnych skryptów DGS, do eksperymentowania i pomoże początkującym.


Komentarze / uwagi?
Chciałbyś być autorem części podręcznika?
-> Skontaktuj się z Hilaire Fernandes w OFSET ( hilaire@ofset.org ) lub dołącz do listy dyskusyjnej DR. GENIUS 

More about DGS DR. GENIUS Guile Script Skrypty DGS - najprostsze przykłady