[python] Vykreslování grafů

Karel Šrot karel.do.pekla.zajel na seznam.cz
Pátek Březen 31 13:26:14 CEST 2017


Zdravim,
tka si rikam, ze jsem to prekombinoval. Takze to zkusim jeste jednou 
shrnout. Ty predchozi dva maily ignoruj. :-)

Zakladem je pocitani funkcnich hodnot v referencnich bodech. Tech muze 
byt treba 100, treba 150.. Urcite by mela byt moznost jejich pocet 
nastavit.

Pokud jde o zmenu meritka, treba priblizeni, tak to zalezi, jak to 
resit.. Osobne mi prijde nejlepsi mit omezeny rozsah os. Pri zmene 
meritke se samozrejme zmensi/zvetsi a funkce se prepocitaji aby 
odpovidaly novemu rozsahu (take by bylo mozne pouze doplnit ty stavajici 
o body nove). Pokud se bude jen posouvat po osach pri zachovani meritka, 
pak by stacilo jen dopocitavat tu cast funkce, co lezela doposud mimo (a 
tu co je ted mimo zahodit). To znamena, ze u kazde funkce mam seznam 
referencnich bodu a jejich funkcni hodnoty.

Pokud jde o nespojite funkce ci jenom funkce, ktere jsou hodne divoke 
(treba sin(1/x)), tak pro toto se pouziva adaptivni skalovani, tedy 
lokalni zvyseni poctu referencnich bodu. Problemem trochu je, jak 
takovouto divokou funkci poznat.

Napadlo me jeste toto: Referencni body mi rozdeli zakladni interval na 
nekolik delicich intervalu. Na techto intervalech bych funkci 
aproximoval useckou (celkem tedy lomenou carou). Z teto usecky udelam 
vektor a budu zjistovat, jaky uhel sviraji dva sousedni vektory (tedy 
jak moc se funkce krouti). Pokud tento uhel prekroci nejakou hranici 
(treba 5 stupnu, nebo i mene), tak ty dva intervaly zjemnim vetsim 
poctem delicich bodu (z puvodnich dvou intervalu udelam ctyri).

Pak jsou tu jeste tyto veci:
- Kdyz mi funkce v obou krajnich bodech intervalu vyskoci mimo rozsah 
grafu, tak prostredek ignoruji (tyto bodu pri kresleni grafu nespojuji).
- Kdyz je svirany uhel stale velky a pritom uz jsou referencni body 
velmi blizko u sebe (vzdalenost odpovida treba jen jednomu ci dvoum 
pixelum v grafu), tak to bych to asi ty body na tech dvou intervalech 
nespojoval.

Takze to je asi moje predstava. Akorat to pocitani nebude uplne 
nejrychlejsi  (ikdyz urcite pujde upravit je na nasobeni a scitani). Ale 
zalezi, jaky mas priority. :-) Rekl bych, ze kolikrat se spis vyplati 
mit vice referencnich bodu, jde o to, jak moc slozita je ta funkce.

Takze tak, uz toho radsi necham, at nejsem ostatnim pro smich. :-)

Karel


Jakub Vojacek napsal(a):
> Zdravím
>  
> Začal jsem pracovat na lepším prostředí pro správu grafů v programu Math 
> Atelier a potřeboval bych trochu poradit s určitými problémy (gui je 
> dělané pomocí wx).
> 1) Momentálně je pracovní plocha na výkres grafů velká 1000 x 1000 
> jednotek (pixelů). Akorát výpočet trvá celkem dlouhou dobu a uživatel by 
> mohl potřebovat menší či větší plochu, takže se ptám jestli je dobré 
> nabízet možnost jak velkou pracovní plochu mít.
> 2) Nevím jak vy byste vypočítávali body pro vykreslení grafu, ale já na 
> to mám takovoutu metodu:
>  
> cislo=spodni_hranice
> while cislo < horni_hranice:
>        x=cislo
>        y=eval(funkce.replace('x',cislo))
>        body.append([x,y])
>        cislo=cislo+preciznost
>  
> Ale výpočet se mi zdá poměrně dlouhý a tak se ptám jesetli vás nenapadá 
> něco efektivnějšího. Dále jakou hodnotu by měla mít proměnná preciznost 
> (nebo jestli by měl mít uživatel možnost ji nastavit).
> 3) Nyní program dostává body jako souřadnice x,y a vykresluje jednotlivé 
> pixely. Pochopitelně je to způsob relativně nepřehledný, protože pak 
> může být na plátně jenom několik nic neříkajicích teček a proto by je 
> chtělo nějak spojit. Napadlo mě spojit každé dva vedlejší body čárou ale 
> pak mi došlo že to je nemožné, například kvůli grafu 1/cos(x).  Nevíte 
> jaký způsob používají jiné programy?
>  
>  
> Děkuji za případné odpovědi.
>  
> Jakub Vojáček.


Další informace o konferenci Python