[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