-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTutorial.html
More file actions
105 lines (105 loc) · 6.85 KB
/
Tutorial.html
File metadata and controls
105 lines (105 loc) · 6.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>Untitled Page</title>
</head>
<body>
<h1>
Używanie bibliotek</h1>
<h2>
Biblioteka <code>RTadeusiewicz.NN.Controls</code></h2>
<h3>
Używanie kontrolki rysującej wykresy</h3>
<p>
Do rysowania wykresów służy kontrolka <code>ChartPlotter</code>. Kontrolka ta potrafi
narysować układ współrzędnych i... właściwie cokolwiek. Sama w sobie rysuje osie
układu współrzędnych.</p>
<p>
To, czy kontrolka rysuje osie układu, kontroluje własność <code>AxesVisibility</code>. Własność
<code>TicksVisibility</code> pozwala pokazać lub ukryć podziałkę. Własność <code>TicksDistance</code>
określa rozmiar podziałki. Obserwowaną powierzchnię określa własność <code>VisibleSurface</code>.
Niestety, nie jest ona edytowalna w designerze, trzeba ją ustawiać bezpośrednio
w kodzie.</p>
<p>
Dane rysowane na wykresie określane są przez własność <code>DataSeries</code>. Są to serie danych
(pojęcie analogiczne do serii danych z Excela). Jest to kolekcja
obiektów dziedziczących
po klasie <code>DataSeries</code>. Każdy z tych obiektów reprezentuje jedną serię danych, aczkolwiek może równie dobrze reprezentować cokolwiek innego, gdyż w całości odpowiada on za rysowanie. Kolor i grubość linii danej serii możemy ustawić własnościami
<code>DataSeries.ForeColor</code> i <code>DataSeries.LineWidth</code>.</p>
<p>
Przykład użycia tej kontrolki można zobaczyć w projekcie <code>LibraryTest</code>.</p>
<h4>
Rysowanie wykresów liniowych</h4>
<p>
Aby narysować wykres składający się z serii linii (tj. będący łamaną), należy do
kolekcji <code>ChartPlotter.DataSeries</code> dodać obiekt klasy <code>ListDataSeries</code>.
Klasa ta zawiera własność Data, która zawiera struktury PointF odpowiadające kolejnym
wierzchołkom łamanej. Oczywiście aby narysować coś sensownego, kolekcja powinna
ta mieć co najmniej 2 elementy.</p>
<p>
Inną możliwością jest uzycie obiektu klasy <code>ComputedDataSeries</code>. Jest on przeznaczony
do rysowania wykresów funkcji, w szczególności funkcji gładkich. Tutaj rysowany
obiekt zadany jest nie serią punktów, lecz funkcją odzwierciedlającą współrzędne
poziome na pionowe. Co istotne, funkcja ta jest obliczana dla każdej
widocznej kolumny ekranu, dzięki czemu dobrze się skaluje, zachowując gładkość nawet
przy zmianie rozmiaru kontrolki macierzystej. Rysowaną funkcję ustawiamy przypisując
do własności <code>Function</code> delegata typu <code>ComputedDataSeries.DrawableFunction</code>,
czyli funkcji przyjmującej argument typu <code>double</code> i zwracającej wartość typu <code>double</code>.</p>
<p>
Jeśli wyświetlana funkcja ma być nie tylko gładka, ale również zależna od jakiegoś
"zewnętrznego" parametru, najlepiej jest się posłużyć "obiektem funkcyjnym". W tym
celu tworzymy klasę naszej funkcji bazującą na <code>ComputedDataSeries.ParametrizedFunction</code>
i przypisujemy obiekt tej klasy do własności <code>ComputedSeries.FunctionObject</code>. Najlepiej
to zrozumieć na bazie przykładu zawartego w projekcie <code>LibraryTest.</code></p>
<h4>
Rysowanie wykresów punktowych</h4>
<p>
Inną możliwością jest rysowanie wykresów składających się z serii punktów. W tym
celu należy do kolekcji <code>ChartPlotter.DataSeries</code> dodać obiekt klasy
<code>PointDataSeries</code>. Zawiera ona kolekcję <code>Points</code> składającą się ze struktur
typu <code>PointDataSeries.ChartPoint</code>. Każdy taki element reprezentuje pojedynczy punkt.</p>
<p>
Struktura <code>PointDataSeries.ChartPoint</code> zawiera następujące pola:</p>
<dl>
<dt><code>Coords</code></dt><dd>współrzędne punktu</dd><dt><code>Color</code></dt><dd>kolor punktu; jeśli jest to <code>Color.Empty</code>, oznacza to, że punkt ma być rysowany w kolorze
zgodnym z własnością <code>ForeColor</code> serii danych.</dd><dt><code>DrawLines</code></dt><dd>określa,
czy mają być rysowane linie łączące punkt z początkiem układu współrzędnych i osiami</dd><dt><code>Shape</code></dt><dd>kształt
punktu: okrąg lub prostokąt.</dd></dl>
<p>
Wielkość punktów można zmienić własnością <code>PointDataSeries.PointSize</code> (być może w
przyszłości każdy punkt będzie mógł mieć rozmiar ustalany indywidualnie).</p>
<h4>
Rysowanie wykresów funkcji dwuargumentowych</h4>
<p>
Rysowanie wykresów wizualizujących funkcję dwuargumentową przy pomocy koloru umożliwia
klasa <code>Computed2DSeries</code>. Jej użycie jest analogiczne do użycia klasy
<code>ComputedDataSeries</code>. Ma ona własne wewnętrzne typy delegatów i funkcji parametryzowanej.</p>
<p>
Aby narysować odpowiedź sieci neuronowej o dwóch wejściach i dowolnej ilości wyjść,
należy użyć klasy <code>NetworkResponseDrawableFunction</code>. Należy pamiętać
tylko o tym, że kolory, jakimi zabarwiane są poszczególne wyjścia, ustawiamy poprzez
własność <code>OutputColors</code>. Musi być ich przynajmniej tyle ile wyjść ma sieć.</p>
<h3>
Inne kontrolki</h3>
<p>
Kontrolka <code>BorderedControl</code> to po prostu kontrolka zawierająca ramkę.</p>
<p>
Klasa <code>WizardForm</code> to klasa pozwalająca na tworzenie kreatorów. Jest to formatka zawierająca
przyciski <em>Dalej</em> i <em>Wstecz</em> oraz kontener na panele typu <code>WizardPanel</code>.
Aby z nich skorzystać, należy utworzyć własną formatkę dziedziczącą z <code>WizardForm</code>
oraz własne panele dziedziczące z <code>WizardPanel</code>, nadpisując metody <code>GetNext()</code> i <code>GetPrevious()</code>
oraz własności <code>IsFirst</code> i <code>IsLast</code>. Wymienione metody odpowiadają
za utworzenie poprzedniego i następnego panela w reakcji na naciśnięcie odpowiedniego
przycisku kreatora, natomiast własności - za określenie, czy panel jest pierwszy
lub ostatni.</p>
<p>
W formie dziedziczącej po <code>WizardForm</code> wystarczy do własności <code>CurrentPanel</code> przypisać
panel, jaki ma być wyświetlany na początku.</p>
<p>
Należy na razie uważać na zmienianie rozmiaru formatki - trzeba to robić poprzez
przypisanie rozmiaru w kodzie; przypisanie rozmiaru w designerze powoduje zrujnowanie
układu kontrolek (to nie jest moja wina, lecz samego designera). Na razie nie znam
jeszcze metody na przypisanie rozmiaru skalującego się zgodnie z rozdzielczością
DPI ekranu użytkownika. Jakieś pomysły?</p>
</body>
</html>