Пряме перетворення
- // пряме перетворення в базовому найпростішому випадку:
- // припускаємо, що S[i]*S[i1] та D[i]«0
- D[i] = S[i] – S[i1];
- // якщо потрібно писати в той же масив: current = S[i]; // візьмемо черговий елемент
- S[i] = current last; // обчислимо його різницю з попереднім last = current; // тепер черговий елемент став попереднім
- У той ж массив:
- // h=4, Ki=1/4; S[i] = (S[i1] + S[i2] + S[i3] + S[i4] )/4. Тоді:
- D[i] = S[i] – (S[i1] + S[i2] + S[i3] + S[i4] )/4; int Last[4] ={ 0,0,0,0 }; int last_pos = 0;
- // і далі в циклі перетворення для кожного елементу S[i] виконуємо: current=S[i]; // візьмемо черговий елемент і обчислимо S[i] = current (Last[0]+Last[1]+Last[2]+Last[3])/4; Last[last_pos]=current; // занесемо current в масив Last last_pos=(last_pos+1)&3; // нове значення позиції в Last
- // його різницю зі значенням прогнозу:
Зворотне перетворення
- S[i] = D[i] + S[i1]; // якщо S[i]=S[i1]
- // якщо для D и S використовуємо один і той же масив (S):
- S [i] = S[i] + S[i1]; // сума дельти з попереднім елементом
- // якщо пишемо в той же масив:
- S[i] = S[i] + (S[i1] + S[i2] + S[i3] + S[i4])/4;
Зчитування аудіофайлу формату AU та його відтворення:
- #include <fstream>
- #include "au.h"
- #include "aplayer.h"
- // пробуємо вибрати відповідну програмупрогравач для
- // систем Win32, Macintosh або UNIX / NAS.#if defined(_WIN32)
- #include "winplayr.h" typedef WinPlayer Player; #elif defined(macintosh) #include "macplayr.h" typedef MacPlayer Player;
- #else
- #include "nasplayr.h" typedef NasPlayer Player;
- #endif
- int main() {
- AuRead auRead(cin); // створюємо об’єкт AuRead Player player(&auRead); // з’єднуємо вихід об’єкта АuRead player.Play(); // запускаємо програмупрогравач return 0; }
Процес узгодження діапазону значень кодування звуку
- void AudioAbstract::MinMaxSamplingRate(long *min, long *max, long *preferred){ if (Previous())
- Previous()>MinMaxSamplingRate(min,max,preferred); if (_samplingRate) *preferred = _samplingRate; if (*preferred < *min) *preferred = *min; if (*preferred > *max)
- *preferred = *max;
- }
- void AudioAbstract::SetSamplingRateRecursive(long s) { if (Previous()) // спочатку встановлюємо для того, що справа
- Previous()>SetSamplingRateRecursive(s);
- SamplingRate(s); // встановлюємо
- _samplingRateFrozen = true; // частота узгоджена
- }
По довжинах генерація коду Хаффмана
- typedef unsigned int uint; typedef unsigned long ulong; template <class T> struct Node{ T key; uint code_len; ulong code;
- Node() : key(T()), code_len(0), code(0) {};
- Node(T k, int cl=0, int cd=0) : key(k), code_len(cl), code(cd) {};
- Node& operator=(const Node& _n) { key=_n.key; code_len=_n.code_len;
- code=_n.code; }
- };
- typedef Node<char> CharNode;
- typedef Node<wchar_t> WCharNode;
Рекурсивна функція кодування дерева
- void makeCodes(sym *root) // рекурсивна функція кодування дерева
- {
- if ( root>left ) {
- strcpy(root>left>code,root>code);
- strcat(root>left>code,"0");
- makeCodes(root>left);
- }
- if ( root>right ) {
- strcpy(root>right>code,root>code);
- strcat(root>right>code,"1");
- makeCodes(root>right);
- }
- }
Функція підрахунку кількості кожного символу і його ймовірності void Statistics(char *String){
- int i, j;
- // побайтово зчитуємо рядок і складаємо таблицю зустріч
- for ( i = 0; i < strlen(String); i++) {
- chh = String[i];
- for ( j = 0; j < 256; j++) {
- if (chh==simbols[j].ch) {
- kolvo[j]++;
- kk++;
- break;
- }
- if (simbols[j].ch==0) {
- simbols[j].ch=(unsigned char)chh;
- kolvo[j]=1;
- k++;
- break;
- }
- }
- }
- for ( i = 0; i < k; i++) { // розрахунок частоти зустрічі
- simbols[i].freq = (float)kolvo[i] / kk;
- }
- for ( i = 0; i < k; i++) { // в масив покажчиків заносимо адреси записів psym[i] = &simbols[i];
- }
- // сортування за збиттям
- sym tempp;
- for ( i = 1; i < k; i++){
- for ( j = 0; j < k 1; j++){
- if ( simbols[j].freq < simbols[j+1].freq ) {
- tempp = simbols[j];
- simbols[j] = simbols[j+1];
- simbols[j+1] = tempp;
- }
- for( i=0;i<k;i++) {
- summir+=simbols[i].freq;
- printf("Ch= %d\tFreq= %f\tPPP= %c\t\n",simbols[i].ch,
- simbols[i].freq,psym[i]>ch,i);
- }
- printf("\n Slova = %d\tSummir=%f\n",kk,summir);
- }
Компресія білочорних рядків
- for(по всіх рядках зображення){
- //перетворимо рядок в набір довжин серій;
- for(по всіх серіях) { if(серія біла) { L= довжина серії;
- while(L > 2623) {
- L=L2560;
- ЗаписатиБілийКодДля (2560);
- }
- if(L > 63) {
- L2=МаксимальнийСостКодМеньшеL(L);
- L=LL2;
- ЗаписатиБілийКодДля(L2);
- }
- ЗаписатиБілийКодДля(L); // Це завжди код завершення
- } else {
- //Код аналогічний білої серії, з тією різницею, що записуються парні коди
- }
- }
- // Закінчення рядка зображення
- }
Mалювання ліній
- case WM_PAINT:
- hdc = BeginPaint(hWnd, &ps) ; // TODO: Add any drawing code here... // Відновлюємо поверхні, якщо це необхідно if (primsurf>IsLost()) RestoreSurfaces();
- // очищення поверхні
- ClearSurfасе(backsurf, 0);
- DrawLine(backsurf, 10, 10, 220, 20, 255, 0, 0);
- DrawLine(backsurf, 10, 10, 50, 100, 0, 0, 255);
- DrawLine(backsurf, 20, 200, 300, 100, 0, 255,255);
- DrawLine(backsurf, 500, 500, 100, 300, 255, 0, 255);
- // перемикання поверхні
- primsurf>Flip(NULL, DDFLIP_WAIT);
- EndPaint(hWnd, &ps); break;
Фейєрверк
- void DrawScene() {
- // Підготовка до блокування поверхні ClearSurface(backsurf, 0);
- DDSURFACEDESC2 desc;
- ZeroMemory(&desc, sizeof(desc)) ;
- desc.dwSize = sizeof(desc); // блокування поверхні if (backsurf>Lock(0, &desc, DDLOCK_WAIT, 0)==DD_OK) { BYTE* dst = (BYTE *)desc.IpSurface; for (int i=0; i<iParticleNumber; i++) // Цикл малювання іскор
- {
- // Розраховуємо нове положення іскри
- ParticleList[i].angle+=ParticleList[i].adjust;
- ParticleList[i].x += (WORD)(cos(ParticleList[i].angle/360) *ParticleList[i].speed);
- ParticleList[i].у += (WORD)(sin(ParticleList[i].angle/360) *ParticleList[i].speed); // Зменшуємо час життя іскри
- ParticleList[i].life;
- //Якщо іскра "померла" або вийшла за межі екрану, то ініціюємо її заново
- if((ParticleList[i].life<0)||(ParticleList[i].x<0)|| (ParticleList[i].x>=iWidth) ||(ParticleList[i].y<0) || (ParticleList[i].y>=iHeight)) {
- ParticleList[i].life=rand()%200;
- ParticleList[i].x=iWidth/2;
- ParticleList[i].y=iHeight/2;
- }
- // Коректуємо колір іскри
- ParticleList[i].g+=ParticleList[i].adjust;
- ParticleList[i].b=ParticleList[i].adjust; // Формуємо колір і відображаємо
- WORD с = (WORD)(ParticleList[i].b/8 | (ParticleList[i].g/4 « 5)|(ParticleList[i].r/8 « 11));
- *(WORD *)(dst+ParticleList[i].y*desc.lPitch+ParticleList[i].x*2)=c; backsurf>Unlock(0); primsurf>Flip(NULL, DDFLIPJWAIT);
Вогняна лава
- float4 Pixel_Sh(float2 tex_coord: TEXCOORDO) : COLOR { float3 coord; coord.xy = tex_coord; coord.z = 1;
- // Визначаємо координати текстури шуму float noiseX = tex3D(Noise, coord); float noiseY = tex3D(Noise, coord); // Координати текстури вогню coord.z = ViewAngle / 2;
- coord.x = tex_coord.x + noiseX * 0.1+coord.z; coord.у = tex_coord.y + noiseY * 0.1+coord.z;
- // Визначаємо колір шуму float n = tex3D(Noise, coord);
- // Об'єднуємо колір шуму та колір точки на текстурі вогню
- float4 flame = texlD(Flame, n0.15); // Повертаємо колір точки
- return flame;
- }