Sinusovka ve VB 6.0   zodpovězená otázka

VB6/VBA

Dobrý den, chtěl bych se zeptat, jak mám ve Visual Basicu 6.0 vykreslit sinusovku, aby její začátek měl souřadnice (0, form1.scaleheight/2) a její konec měl souřadnice (form1.scalewidth, form1.scaleheight/2). Zkrátka a dobře od začátku formuláře do konce formuláře.

Zkoušel jsem to pomocí form1.Pset s tím, že to bylo v cyklu a vždy se počítala souřadnice Y (top). Souřadnice X (left) záležela na aktuálním průchodu cyklu. Nezapomněl jsem ani na převod stupňů na radiány. Přesto mi to nefungovalo tak, jak by mělo.

Vím, že mě odkážete na VB.NET, ale potřebuju to k maturitě, jinak na VB.NET postupně přecházím. Předem díky za odpověď.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Tak, konečně si jednou nejdu pro radu a posnažím se být taky trochu užiteřný:). Takže jsem ti tady připravil co možná nejjednodušší prográmek řešící tvůj problém. Před jeho spuštěním nezapomeň nastavit Form1.ScaleMode na pixely, jinak ti z toho vyleze dva centimetry velká chudinka :). Já jsem si na formulář umístil tlačítko, které vykresluje sinusovku. Je to užitečné, protože pak můžeš změnit velikost okna, znovu nechat vykreslit funkci a tak je krásně vidět, jak se sinusovka chová v závislosti na velikosti formuláře (okna). Takže tady je kód:

Private Sub Command1_Click()
Const Pi = 3.14159265359
Dim X As Double, Y As Double

amp = 200       'amplituda (tj. velikost půlvlny)
Period = 5      'počet period (opakování)
ver = Form1.ScaleHeight / 2 'svislé posunutí dolů (= počátek)
hor = 0    'vodorovné posunutí doprava  (dobrovolné :)
krok = 3   'čím vyšší, tím méně bodů se vykreslí
sirka = Form1.ScaleWidth    'šířka sinusovky

For b = 0 To 10000 Step krok
    X = sirka / 10000 * b + hor
    Y = Sin(b / 10000 * Period * 2 * Pi) * amp + ver
    'X, Y       'x-ová a y-ová souřadnice bodu
    Y = ScaleHeight - Y ' *viz poznámka níže
    Form1.PSet (X, Y), vbBlue   'vykreslí bod ;)
Next b
End Sub

* Y = ScaleHeight - Y slouží k otočení sinusovky podle osy X. My na papír totiž kreslíme kladné hodnoty směrem nahoru, VB má ale počátek nahoře, a proto vykresluje opačně (tj. sinusovka začíná klesáním, ve skutečnosti ale nejdříve stoupá). Tento řádek je tedy nepovinný, rozdíl si můžeš vyzkoušet sám.

Vynechal jsem deklaraci proměnných, pro jednoduchost. X a Y se deklarovat taky nemusí, program pochopí, že to budou desetinná čísla. Zapsal jsem to tam, aby sis to uvědomil hlavně taky ty;), ostatní proměnné by v tomto případě mohly být deklarovány jako Integer.

Jinak program počítá v radiánech, ale myslim, že to je úplně jedno; proč převádět zbytečně na stupně, když my s těma hodnotama stejně počítat nemusíme :)

Snad jsem pomohl, v případě nejasností se klidně zeptej. Mimochodem, funkci sinus můžeš vyměnit i za jinou. Akorát u Tangens (Tan) pozor, tahle funkce frčí od nekonečna do nekonečna (narozdíl od našeho formuláře, že:), takže tam by se musely honoty hlídat.

Tak hodně štěstí u matury ;)

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Za tuto velmi dobrou radu mockrát díky. Když jsem se sám pokoušel o řešení, na nějakou amplitudu jsem vůbec nepomyslel, jen jsem prostě měl cyklus např. od -1000 to 1000 a X se rovnalo aktuálnímu průchodu, s tím že Y = sin(x). Nenapadlo mě deklarovat amplitudu a nějakou šířku amplitudy. Jen jsem k bodům Y příčítal polovinu svislé výšky formuláře. Toto řešení by mě opravdu samotného nenapadlo a proto ještě jednou díky. I když budu to muset ještě párkrát udělat sám, abych to opravdu dobře pochopil, jelikož teď to sice víceméně chápu, ale kdybych měl něco udělat jen trochu jinak, asi bys musel hodně dumat.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Asi jsi chtěl napsat, že bys musel dumat ty a ne já :D

Jinak s těmi proměnnými je to určitě pravda, zejména pokud se z toho maturuje, že ano.. :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

:D ano chtěl jsem napsat že já bych musel dumat promiň, ale prostě překlep...Jinak já žádné jiné problémy s VB 6 nemám, jen jsem neuměl tu sinusovku. Takže až perfektně pochopím sinusovku, maturity se bát nebudu (myslím jen maturity z VB - ostatní předměty budou peklo).

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Rozhodně doporučuji deklarovat vždy všechny proměnné, programy jsou pak mnohonásobně rychlejší a v případě přechodu na jiný jazyk si ušetříte práci se zvykáním si na nutnost proměnné deklarovat.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Ještě jenom poznámka... Při počítání souřadnice Y je tam ...* 2 *Pi. Jde o to, že Pi radiánů je pouze polovina kružnice (v našem případě to odpovídá polovině jedné periody), pro celou periodu tedy musíme počítat se 2 * Pi, jinak by program vykreslil pouze poloviční počet period.

Doporučuju ti naprogramovat si svoje analogové hodiny - stačí průběh jedné ručičky. Myslím, že k něčemu podobnému nakonec sám dojdeš a budeš to parádně chápat, uvidíš ;). Vycházej z toho, že cos(x) ti vyjadřuje souřadnici X v jednotkové kružnici a sin(x) vyjadřuje souřadnici Y. Cos(x) * 150 je potom X-ová souřadnice bodu ležícího na kružnici o poloměru 150, což je v podstatě právě ta amplituda, na kterou ty ses vy..... :) No a konečně Cos(x) * 150 + 200 bude totéž, přičemž 200 bude X-ová souřadnice středu. No a o tom to v podstatě je:)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak ještě malý dotaz. Jak jsi přišel na to, že ten cyklus poběží zrovna od 0 do 10000? Nula je jasná, ale 10000 nevím. :-(

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No, na to jsem nepřišel, to jsem si tak zvolil:). Nějakej cyklus tam bejt musí, já jsem zvolil od 0 do 10000.. Od nuly by to začínat mělo, aby i sinusovka začínala v počátku a ne někde ve čtvrtině třeba. A 10000 mě napadlo, že by mohlo být tak akorát:). V našem případě, když je krok=3, se vlastně cyklus zopakuje 10000/3, tj. 3333krát, tzn. vykreslí se 3333 bodů... Pokud bychom zvolili menší číslo než 10000, vykreslovalo by se míň bodů a křivka by mohla výt nespojitá. Když by se to přehnalo a dalo se tam třeba 10 000 000, pak by program zase pracoval neefektivně dlouho na úplně tý samý sinusovce..

Zkus si to číslo zvyšovat (ale pozor, vyskytuje se tam celkem 3x, takže musíš změnit všechny - musí zůstat stejný!), nebo nahraď proměnnou, kterou měň.. Uvidíš, že když tam připíšeš jednu nulu, tak už bude rychlost vykreslování tak malá, že uvidíš, jak program tu křivku kreslí. Při hodnotě 100 000 mě to tu křivku kreslí asi vteřinu, ale nevim, jak silnej stroj máš ty:). No a při hodnotě jeden milion už to trvá pár vtěřin, protože se musí provést 100x víc cyklů než s původní hodnotou - a tudíž je vykreslování 100x pomalejší...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

...*být nespojitá..

nahlásit spamnahlásit spam 0 odpovědětodpovědět

OK, díky. Zkusil jsem to vykreslit do PictureBoxu a cyklus jsem dal od 0 do picture1.scalewidth a výsledek byl stejný - ale to je jasné. Takže ještě jednou díky.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To si akorát myslíš, že výsledek byl stejný:). Ve skutečnosti jsi vlastně změnil počet vykreslených bodů, což akorát na první pohled nejde vidět:). Takže výsledek byl PODOBNÝ :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Já vím, přemýšlel jsem nad tím a máš pravdu. Na první pohled se to zdá stejné, ve skutečnosti se to ale trochu liší.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback