Sign in Join
Wiki copytemporary

TAChart Tutorial: Function Series/fi: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: TAChart Tutorial: Function Series/fi

OldNewLine
1+## Johdanto
2+
3+[![FuncSeries10.png](/wiki-images/c/cb/FuncSeries10.png)](</File:FuncSeries10.png>)
4+
5+Kävitkö läpi [[TAChart Tutorial: Getting started/fi|aloitusoppaan]]? Siinä oppaassa oltiin käytetty joitakin matemaattisia funktioita näyttämään TAChart:n peruskäyttöä viivakuvaajan avulla. Viivakuvaaja, ei kuitenkaan ole paras valinta näyttämään matemaattisia funktioita. [[TAChart documentation|`TFuncSeries`]] (funktiokuvaaja) sopii paljon paremmin tähän tarkoitukseen. Tämä on kuvaaja, joka - ensisilmäyksellä - näyttää tavalliselta viivakuvaajalta. Mutta taustalla, se on täysin erilainen. Se ei saa sen dataa ChartSource:sta, vaan matemaattiselta funktiolta. Aina kun kuvaaja tarvitsee tietoja se kutsuu `OnCalculate` tapahtumaa, jossa käyttäjä voi siirtää funktion arvoja pyydettyyn x: n arvoon. Tämä säästää muistia, funktion arvoja ei tarvitse varastoida. Mutta ennen kaikkea, se mahdollistaa laskea funktion arvot zoomaus tason ja kaavion koon mukaan, riittävän kapein välein, niin että kuvaajan käyrä on "sileä" suurillakin suurennoksilla.
6+
7+## Valmistautuminen
8+
9+Aloitetaan uusi projekti tuomalla vakio `TChart` komponentti lomakkeelle. Käytetään seuraavia asetuksia:
10+
11+ * **Align** : `alClient`
12+ * **BackColor** : `clWhite`
13+ * **BottomAxis** : `Grid.Color = clSilver`, `Title.Caption = 'x'`, `Title.Visible = true`, `Title.LabelFont.Style = fsBold`
14+ * **LeftAxis** : `Grid.Color = clSilver`, `Title.Caption = 'y'`, `Title.Visible = true`, `Title.LabelFont.Style = fsBold`
15+
16+Näiden muutosten jälkeen lomake näyttää samantapaiselta kuin vasempi kuva: [![FuncSeries1.png](/wiki-images/7/78/FuncSeries1.png)](</File:FuncSeries1.png>)
17+
18+## Lisätään TFuncSeries
19+
20+Aluksi piirretään sinifunktio **y = sin(x)**. Tupla-klikkaa kaaviota, muokkaa kuvaajia ikkuna avautuu. Klikkaa "lisää" ja valitse _"funktiokuvaaja_ " alasveto luettelosta. Kaaviossa nyt näytetään viivaa joka lähtee vasemmasta alakulmasta ja menee oikeaan yläkulmään (se esittää funktiokuvaajaa). Muutetaan kuvaajan väri punaiseksi. Funktiokuvaajalla ei ole `SeriesColor` ominaisuutta, mutta sillä on ominaisuus `Pen` tähän tarkoitukseen: Aseta `Pen.Color` arvoon `clRed`. Seuraavaksi mennään komponenttimuokkaimen "Tapahtumat" välilehdelle ja tuplaklikataan tapahtumaa `OnCalculate` . Tämä on se metodi, jossa me määrittelemme funktion toiminnan. `OnCalculate` metodia kutsutaan aina kun kuvaaja tarvitsee y-arvon annetulle x-arvolle: <syntaxhighlight lang=pascal> procedure TForm1.Chart1FuncSeries1Calculate(const AX: Double; out AY: Double); begin
21+```
22+AY := sin(AX);
23+```
24+
25+end; </synyaxhighlight>
26+
27+[![FuncSeries2.png](/wiki-images/5/55/FuncSeries2.png)](</File:FuncSeries2.png>)
28+
29+Kun tämä käännetään nähdään sinifunktio. Mutta se ei koko aalto - koska ei asetettu akseleita, x:n arvot ovat ainoastaan väliltä -1 ja +1, oletuksena tyhjän x-akselin laajuudessa.
30+
31+## Laajuuden asettaminen
32+
33+### X-laajuus
34+
35+Laajemman akselin alueen saamiseksi on kaksi vaihtoehtoa: voidaan asettaa **kuvaajan extent** tai **kaavion extent**. On hienoisia eroja molemmissa tapauksissa yksinkertaisessa kaaviossakin, mutta ne eivät näy ja siksi siitä ei enempää tässä. Mennään komponenttimuokkaimeen, valitaan kuvaajan ominaisuus `Extent`, asetetaan akseli alkamaan `XMin` vaikkapa -10 ja loppumaan `XMax` +10. Aktivoi nämä akselin rajat asettamalla `UseXMin` ja `UseXMax` arvoon `true`. Kun nyt käännetään niin nähdään sinifunktion -10 ja 10 välillä.
36+
37+[![FuncSeries3.png](/wiki-images/c/c5/FuncSeries3.png)](</File:FuncSeries3.png>)
38+
39+### Y -laajuus
40+
41+Miksi emme leiki toiminnolla hieman jotta nähdään, mitä tapahtuu? Siirry `OnCalculate` tapahtumaan uudelleen ja moninkertaista sinifunktio kahdella: <syntaxhighlight lang=pascal> procedure TForm1.Chart1FuncSeries1Calculate(const AX: Double; out AY: Double); begin
42+```
43+AY := 2*sin(AX);
44+```
45+
46+end; </synyaxhighlight>
47+
48+[![FuncSeries4.png](/wiki-images/1/19/FuncSeries4.png)](</File:FuncSeries4.png>)
49+
50+Oho - funktiokuvaaja ei automaattisesti päivitä y :n laajuutta! Tämä pätee vanhassa Lasaruksen versiossa 1.0. Nykyään `FuncSeries`:ssä on ominaisuus `ExtentAutoY`. Jos se on asetettu arvoon `true` niin se toimeenpanee automaattisen laskemisen y:n laajuudelle. Huomaa, että ominaisuus pätee vain, jos molemmat `Extent.UseXMin` ja `Extent.UseXMax` ovat asetettu arvoon `true`. Jos käytössä on Lazaruksen vanha versio niin extent pitää asettaa käsin: Valitse kuvaajan `Extent` uudelleen asettamalla `YMin` arvoon -2,`YMax` arvoon 2 ja `UseYMin` sekä `UseYMax` arvoon `true`. Tämä näyttää koko sinikäyrän amplitudilla 2.
51+
52+[![FuncSeries5.png](/wiki-images/c/ce/FuncSeries5.png)](</File:FuncSeries5.png>)
53+
54+## Zoomaus
55+
56+Nyt tarkastellaan johdannossa mainittua seikkaa että funktiokuvaaja on aina tarkka, vaikka suurennos olisi suuri. Ero nähdään kun piirretään sinifunktion toisen kerran, mutta nyt se tehdään viivakuvaajalla joka piirtää vain ennalta määriteltyihin segmentteihin.
57+
58+Lisää "viivakuvaaja" kaavioon, aseta sen `Pen.Style` arvoon `psDash` ja lisää seuraava koodi lomakkeen onCreate tapahtumakäsittelijään jossa määritellään kuvaajan tiedot: <syntaxhighlight lang=pascal> procedure TForm1.FormCreate(Sender: TObject); const
59+```
60+N = 100;
61+ XMIN = -10;
62+ XMAX = 10;
63+```
64+
65+var
66+```
67+i: Integer;
68+ x: Double;
69+```
70+
71+begin
72+```
73+for i:=0 to N-1 do begin
74+ x := XMIN + (XMAX - XMIN) * i / (N-1);
75+ Chart1LineSeries1.AddXY(x, 2*sin(x));
76+ end;
77+```
78+
79+end; </synyaxhighlight> Kun ohjelma käännetään ja ajetaan niin punaisen funktiokuvaajan ja mustan viivakuvaajan käyrät ovat päällekkäin, käyrät on vaikea erottaa. Jos zoomaat kaavion: pitäen hiiren vasenta näppäintä alhaalla ja vetämällä pieni suorakulmio lähelle yhtä sinifunktion maksimihuippua ( vedä hiirellä ylhäältä-vasemmalta oikeaan alakulmaan jolloin saadaan zoomaus aikaan). Kun vapautat hiiren näet nyt zoomatun suorakulmion. Jos suurennus on riittävän suuri, näet segmentit viivakuvaajassa, mutta funktiokuvaaja on edelleen tarkka.
80+
81+[![FuncSeries5b.png](/wiki-images/3/36/FuncSeries5b.png)](</File:FuncSeries5b.png>)
82+
83+Mikä on syy, miksi funktiokuvaaja on niin sileä jopa äärimmäisissä suurennuksissa? Tämä johtuu siitä, että funktio on laskettu hyvin pienin välein. Tämä määritellään `TFuncSeries` ominaisuudessa `Step`. Tässä oleva numero on näytön pikseleitä ja siksi tasaisuus on riippumaton zoomauksesta. Useimmissa toiminnoissa sen oletusarvo 2 on hyvä kompromissi lähes täydelliseen resoluutioon ja piirtämisen nopeuteen.
84+
85+Ennen kuin jatketaan, poista viivakuvaaja emme tarvitse sitä enää. Poista myös FormCreate tapahtumankäsittelijä.
86+
87+## Domain exclusions
88+
89+### Piirretään y = tan(x)
90+
91+Tässä harjoituksessa haluamme piirtää eri funktion, **y = tan(x)**. Voimme helposti mukauttaa se tähän projektiin muuttamalla toiminnon `OnCalculate` tapahtumakäsittelijää (Huom. pitää lisätä myös `math` käännösyksikkö `uses` lausekkeeseen): <syntaxhighlight lang=pascal> procedure TForm1.Chart1FuncSeries1Calculate(const AX: Double; out AY: Double); begin
92+```
93+AY := tan(AX);
94+```
95+
96+end; </synyaxhighlight>
97+
98+[![FuncSeries6.png](/wiki-images/1/1a/FuncSeries6.png)](</File:FuncSeries6.png>)
99+
100+Kaavio näyttää hyvältä ensi silmäyksellä, mutta kun muistaa joitakin perusasioita tan funktiosta koulusta huomaa että (melkein) pystyjuovat lähellä ±1.6, ±4.7, ±7.9 eivät ole oikeita. Toimintoa ei ole määritelty näissä paikoissa (tarkalleen (_n_ +1/2)π). Kuvaajaa ei pitäisi olla siellä. Koska funktiokuvaaja ei "tiedä" näistä katkoksista, se piirtää yhteyden viimeisen ja ensimmäisen lasketun pisteen välille ennen ja jälkeen epäjatkuvuuden. `TFuncSeries` tarjoaa niin sanottua `DomainExclusions` joka ratkaisee tämän kysymyksen. Nämä ovat kohtia ja alueita, joissa toimintoa ei ole laskettu ja ole piirretty. Tällä hetkellä `DomainExclusions` eivät näy komponenttimuokkaimessa, vaan se on käytettävä koodin suorituksen aikana kutsumalla menetelmillä `AddPoint` tai `AddRange`. .
101+
102+Tan funktion tapauksessa, lisätään seuraava koodi lomakkeen onCreate tapahtumakäsittelijään jossa otetaan edellä mainitut seikat laskettaessa huomioon : <syntaxhighlight lang=pascal> procedure TForm1.FormCreate(Sender: TObject); begin
103+```
104+with Chart1FuncSeries1.DomainExclusions do begin
105+ AddPoint(pi/2); AddPoint(-pi/2);
106+ AddPoint(3*pi/2); AddPoint(-3*pi/2);
107+ AddPoint(5*pi/2); AddPoint(-5*pi/2);
108+ end;
109+```
110+
111+end; </synyaxhighlight>
112+
113+[![FuncSeries7.png](/wiki-images/a/ac/FuncSeries7.png)](</File:FuncSeries7.png>)
114+
115+Kaavio on nyt täydellinen?
116+
117+On kuitenkin huomioitava, että koodi `FormCreate` metodissa on liian erityinen ja on oikea vain kun x-akselin vaihtelevat -10:stä 10:n. Oletetaan käyttäjä voisi loitontaa tai voisi muuttaa akselin rajat jollakin muulla tavalla. Sitten nämä domain poikkeukset ei välttämättä sovi enää. Siksi pitäisi antaa hieman yleisempi menetelmä, ehkä "`UpdateDomainExclusions`" ja kutsua sitä tarvittaessa. Ensimmäinen ajatus olisi käyttää kaavion `OnExtentChanged` tapahtumassa. Menemättä yksityiskohtiin, mutta tämä saattaa aiheuttaa riippuvuuksia joissakin olosuhteissa, koska tämä tapahtuma tehdään kaavion piirtämisen jälkeen. Nykyisissä Lazarus versioissa on kuitenkin uudempi tapahtuma `OnExtentChanging` joka sopii paremmin, koska sitä kutsutaan ennen piirtämistä. Lazaruksen vanhoissa versioissa voi käyttää tapahtuman käsittelijä `TChart.OnAfterDrawBackwall` vaikka sen nimi ei ole intuitiivinen tähän tarkoitukseen. Ei saa unohtaa kutsua `DomainExclusions.Clear` välttämään lisäämästä samoja asioita uudestaan ja uudestaan.
118+
119+<syntaxhighlight lang=pascal> procedure TForm1.UpdateDomainExclusions; var
120+```
121+ex: TDoubleRect; // unit TAChartUtils.pas
122+ x: Integer;
123+```
124+
125+begin
126+```
127+ex := Chart1.CurrentExtent;
128+ Chart1.DisableRedrawing;
129+ try
130+ with Chart1FuncSeries1.DomainExclusions do begin
131+ Clear;
132+ for x := Floor(ex.a.x / Pi - 0.5) to Ceil(ex.b.x / Pi + 0.5) do
133+ AddPoint((x + 0.5) * Pi);
134+ end;
135+ finally
136+ Chart1.EnableRedrawing;
137+ end;
138+```
139+
140+end; </synyaxhighlight>
141+
142+### Piirretään y = ln(x)
143+
144+Viimeisessä harjoituksessa lisätään toinen funktio y = ln (x). Kaksoisklikkaa kaaviota uudelleen ja muokkaa kuvaajia ikkunassa lisää toinen funktiokuvaaja. Aseta sen väriksi `clBlue` ja kirjoita seuraava `OnCalculate` tapahtumakäsittelijä joka kertoo kuvaajalle log funktion piirtämisen:
145+
146+<syntaxhighlight lang=pascal> procedure TForm1.Chart1FuncSeries2Calculate(const AX: Double; out AY: Double); begin
147+```
148+AY := ln(AX);
149+```
150+
151+end; </synyaxhighlight>
152+
153+[![FuncSeries8.png](/wiki-images/d/d0/FuncSeries8.png)](</File:FuncSeries8.png>)
154+
155+Mutta kun ohjelma ajetaan se kaatuu, koska se sai liukulukupoikkeuksen! Mistä se tuli? Koska x-akselin alkaa arvosta -10 ja logaritminen funktio voi laskea ainoastaan ​​positiivisia x-arvoja. Mitä tässä tapauksessa voidaan tehdä? Vastaus on domain poikkeukset, jälleen. Kielletään vain funktion laskenta negatiivisillä arvoilla ja kun x = 0. Tämä voidaan saavuttaa lisäämällä välille -INF - 0 kuvaajaan domain poikkeuksia. Metodi `AddRange` hoitaa myös päätepisteiden välin, joten emme tarvitse mitään erityistä kun x = 0. Muutetaan lomakkeen `OnCreate` tapahtumakäsittelijä seuraavasti:
156+
157+<syntaxhighlight lang=pascal> procedure TForm1.FormCreate(Sender: TObject); begin
158+```
159+with Chart1FuncSeries1.DomainExclusions do begin
160+ AddPoint(pi/2); AddPoint(-pi/2);
161+ AddPoint(3*pi/2); AddPoint(-3*pi/2);
162+ AddPoint(5*pi/2); AddPoint(-5*pi/2);
163+ end; { ... tai tämän tilalla olisi parempi olla erillinen
164+ UpdateDomainExclusions procedure mistä aiemmin mainittiin tekstissä}
165+ with Chart1FuncSeries2.DomainExclusions do begin
166+ AddRange(NegInfinity, 0);
167+ end;
168+```
169+
170+end; </synyaxhighlight>
171+
172+Nyt ohjelma toimii hyvin.
173+
174+Eräs asia joka pitää mainita, on `DomainExclusions` ominaisuus `Epsilon` . Tämä arvo ohjaa etäisyyttä päätepisteen ulkopuolelle välin ja viimeinen piirretään toiminnon kohta. Sen oletusarvo `1e-6` on sopiva useimmissa tapauksissa, mutta voit lisätä sen ääretön-tyypin epäjatkuvuudet (`y = tan(x)`), tai alentaa sitä mallintaa auki ulkopuolelle välein. Yksi esimerkki Jälkimmäisessä tapauksessa on funktio `y = sqrt(x)` , jota ei ole määritelty negatiivisia numeroita, mutta on määritelty `x = 0` (toisin kuin logaritmifunktiota); Tässä tapauksessa toimialueen ulkopuolelle ei saisi sisältää `x = 0` , mutta koska välein `DomainExclusions` suljetaan aina voit näyttää tässä vaiheessa kaavion asettamalla `Epsilon = 0`.
175+
176+[![FuncSeries9.png](/wiki-images/6/6f/FuncSeries9.png)](</File:FuncSeries9.png>)
177+
178+## Viimeistely
179+
180+### Legend
181+
182+Ennen päätämme voimme soveltaa joitakin parannuksia. Älä näytä useita käyriä samassa kaavion ilman kuvaajien otsikkopalkkia (legend), ilman sitä ei olisi mitään keinoa erottaa ne toisistaan. Anna funktion nimi `Title` ominaisuuteen kummallekin kuvaajalle ja aseta niiden legend ominaisuuden `Visible` arvoon `true`.
183+
184+### Lisätään koordinaatti akselit (TConstantLineSeries)
185+
186+Graafisissa matemaattisissa funktiossa usein akselit risteävät origossa. TAChart on mahdollisuus siirtää akseleita poispäin reunasta ominaisuudella `Position`. Tässä tapauksessa mennään toisella tavalla:
187+
188+Avaa muokkaa kuvaajia ikkuna uudelleen ja lisätään kaksi "kiinteä viiva" kuvaajaa . Nämä ovat hyvin yksinkertaisia ​​kuvaajia, joka näyttää yhdensuuntainen koordinaatiston akseleita. Niiden sijainti määritellään ominaisuudessa `Position`, niiden suunta - vaaka- tai pystysuoraan `LineStyle`. Ei ole mitään tekemistä sen kanssa `Position` jonka oletusarvo on 0. Täytyy vain asettaa yhden kuvaajan `LineStyle` arvoon `lsHorizontal` ja toisen arvoon `lsVertical` . [[TAChart documentation|TConstantLineSeries]] kuvaajalla on myös [[TAChart documentation|arrow]] eli nuoli , joka voidaan aktivoida asettamalla `Arrow.Visible` arvoon `true` . Kokeile `Arrow` ominaisuuksia `Length`, `Width` ja `BaseLength` jotta löydät muodon joka on sopiva.
189+
190+Lopuksi kannattaa laittaa kiinteän viivakuvaajien omaisuus `Legend.Visible` arvoon `false` muuten tulee kaksi tunnistamatonta merkintää legend otsikkopalkkiin.
191+
192+Tässä lopputulos:
193+
194+[![FuncSeries10.png](/wiki-images/c/cb/FuncSeries10.png)](</File:FuncSeries10.png>)
195+
196+## Lähdekoodi
197+
198+Lähdekoodin lopullinen versio tämän opetusohjelman projektista löytyy TAChart asennuksen kansiosta _tutorials/func_series_ .
199+
200+---
201+*From the Free Pascal wiki, page "TAChart Tutorial: Function Series/fi", as the Internet Archive kept it on 2024-07-14, last changed on 2020-02-29. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history