The Remote Pumpkin



Game Maker jednoduše [díl 6.] - Matematické funkce

iconVelmi často narážím na lidi, kteří umí matiku jak z vysoké, ale když programují, přijde mi, že museli propadnout ještě na prvním stupni základní školy. Bývá to tím, že jim chybí znalost spousty užitečných matematických funkcí, které (nejen) GM nabízí. Pojďme se tedy podívat, které to jsou!
Omlouvám se, že předchozí i tento díl bude jen takový popis. 7. díl bude zase jako dříve. Ani jsem neměl v plánu o těchto funkcích psát, ale velmi často, když někomu poradím na skypu, na fóru, nebo kdekoli jinde, narazím na to, že zhltají můj kód, ale nakonec ho prostě jen okopírují aniž by věděli, jak funguje. Abych tedy ony zmiňované šikovné funkce nemusel vysvětlovat v každém díle zvlášť rozhodl jsem se o tom napsat rovnou článek.

Sign
Sign je funkce, která nám vrátí kladnou 1, když je vstup větší, než nula, zápornou 1, když je vstup menší, než nula a nebo nulu, když je vstup přesně roven nule.
sign(5123.21) = 1;
sign(-
456) = -1;
sign(
0) = 0;


Abs - absolutní hodnota
Absolutní hodnotu zná asi většina z matematiky. Její matematický zápis jsou 2 svislé čáry |x|. Absolutní hodnota vrátí vždy kladnou hodnotu. Když do ní dáte záporné číslo, funguje tak, že mu "sebere" mínusko.
abs(-100) = 100;
abs(
8.4) = 8.4;


Frac
Frac je již méně používaná funkce. Stále však ne bezvýznamná. Vrací to, co je za desetinnou čárkou. Její výstup je tedy vždy 0 - 1.
frac(10.5) = 0.5;
frac(
1.482) = 0.482;


Floor - zaokrouhlení dolů
(Floor v překladu podlaha, zem) Tato funkce zaokrouhlí číslo směrem dolů, i když je mnohem blíže vyšší hodnotě. To platí i u záporných čísel.
floor(1.9) = 1;
floor(-
2.4) = -3;


Ceil - zaokrouhlení nahoru
(Ceil, zkráceně ceiling, strop) Funkce, která zaokrouhlí číslo směrem vzhůru. To i v případě že je mnohem blíž k nižší hodnotě. Opět platí i v záporných číslech.
ceil(3.01) = 4;
ceil(-
2.9) = -2;


Round - běžné zaokrouhlení
Klasické zaokrouhlování, kdy hranici tvoří polovina.
round(3.4) = 3;
round(
3.5) = 4;
round(
3.8) = 4;


min
Velice praktická funkce. Zadáte ji několik čísel a ona vám z nich vrátí to nejmenší.
min(8, 4, 15) = 4;


max
Podobná funkce, jako min, akorát s uplně opačným efektem. Vrátí vám největší číslo ze seznamu, co ji zadáte.
max(8, 4, 15) = 15;


Pozn. Funkce min a max lze velmi dobře využít, když chcete nějaké proměnné nastavit hranice, mezi kterými se její hodnota může pohybovat.
promenna = min( max( promenna, spodni_hranice ), horni_hranice );

power
Tato funkce slouží k mocnění čísel. Když chcete dát 10 na druhou, použijete funkci power:
power(10, 2) = 100;
power(
2, 10) = 1024;


Logaritmy
Logaritmy jsou velmi užitečné ve spoustě případů. Princip je jednoduchý. Logaritmus má určitý základ. Běžné logaritmy jsou se základem 2, nebo 10. Také proto jsou na tyto 2 speciální druhy v GM vestavěné funkce log2 a log10. Můžete si ale zvolit i vlastní základ. K tomu je funkce logn. Jak ale logaritmus funguje? Funguje tak, že vám vrátí hodnotu, na kterou musíte umocnit základ, aby vyšlo číslo, které jste do logaritmu zadali. Takže:
power(10, log10(x)) = x;


Není zrovna jednoduché logaritmus použít v praxi, když ho nevytáhnete ze vzorečku, ale například se dá hezky použít při nastavování hlasitosti zvuku. Hlasitost zvuku v gamemakeru totiž není lineární. Mezi hodnotami zhruba 0 - 0.75 jde hlasitost velmi zvolna nahoru a na posledních pár stupních najednou prudce stoupá. Takže je hlasitost rozložená nerovnoměrně. Pokud použijete logaritmus, srovná tuto křivku tak, že je hlasitost rovnoměrně rozložená mezi 0-1:
sound_volume(sound_index, log10(10 + volume * 90) - 1);


Bitové operace
Aby mohl člověk s bitovými operacemi pracovat, musí mít alespoň nějaké povědomí o dvojkové soustavy. Bitových operací je hned několik a jsou velmi podobné operacím s BOOLEAN proměnnými.

Bitová negace (=doplněk)
a = ~b;

~
0111
=
1000
Negace funguje jednoduše. Z jedničky udělá nulu a naopak.

Bitový součet
c = a | b;

0101
OR
0011
=
0111
Součet je vlastně logické OR. Pokud je na pozici alespoň u jednoho čísla 1, výsledek bude 1. 0 vyjde pouze když jsou obě pozice v nule.

Bitový součin
c = a & b;

0101
AND
0011
=
0001
Pokud je na pozici u některého z čísel nula, výsledek bude nula. 1 vyjde pouze když je 1 u obou čísel.

Bitová nonekvivalence
c = a ^ b;

0101
XOR
0011
=
0110
XOR je podivná funkce a ani nemá zrovna široké využití. Když jsou obě hodnoty stejné, vyjde nula. Pokud se liší, vyjde 1.

Aritmetický posun
a = b >> 1; // o jedno doprava
a = b << 1; // o jedno doleva

00101101 >> 1
=
00010110

00101101 << 1
=
01011010
Posune bity o X zadaným směrem. Bit na okraji se smaže nehledě na hodnotu a na druhém okraji čísla, kde vznikne díra, se doplní 0.

Posuny mají velké využití hlavně při rozdělování čísel, hlavně barev. Pokud zadáte barvu v hexa, vyjde z toho velké číslo, které obsahuje všechny 3 složky RGB. Aniž by jste použili nějaké GM funkce, lze je rozdělit pomocí posunutí a bitového součinu:
color = $AABBCC; // Gamemakerové BGR
r = (color ) & 256; // = $CC
g = (color >> 8) & 256; // = $BB
b = (color >> 16) & 256; // = $AA
Číslo se posune tak, aby požadovaná barevná složka byla na okraji a poté se číslo vynásobí (&) číslem, které má jedničky na prvních dvou bajtech (prvních 16 bitů a to je práve číslo 256). Tím se číslo ořízne pouze na 2 bajty, které chceme dostat.

« Předchozí díl seriáluDalší díl seriálu »


353 shlédnutí
Publikoval Pelpet před 8 lety

Komentáře (2)



Captcha

Ap0: Přidáno, dík za nápad
Napsal Pelpet před 6 lety
Pekny tutorial, mozno by si este mohol vysvetlit ako funguje logicky operator " << ", ten som nikdy nevedel pochopit
Napsal Ap0 před 6 lety
©2012 The Remote Pumpkin