Полезное для программистов:

Фриланс
Новости
Статьи
   
Рубрики:


Эфект скручивания

Поиск:
Эта реализация не слишком отличается от эффекта линза, единственное отличие - по другой формуле расчитывается таблица.
Код

#include <math.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>

#define PI      3.1415926
#define FILTERW 120
#define FILTERH 120
#define FILTERW_2 (FILTERW/2)
#define FILTERH_2 (FILTERH/2)

int FILTER_W=FILTERW;
int FILTER_H=FILTERH;
double sp_Amp=2*PI;
double sp_Pow=6;

char bmp[64000];
char p[1024];
int filter[FILTERW*FILTERH];

extern void setvmode(int);
#pragma aux setvmode =
  " int 10h " 
  parm [eax] 
  modify exact [eax];

void wait_retrace() {
  while ((inp(0x3DA) & 0x08) == 0);
  while ((inp(0x3DA) & 0x08) != 0);
}

void fload() {
  FILE *f;

  if ((f=fopen("1.bmp", "rb")) == NULL)
   {
    printf("error: file %s not found.n 1.bmp");
    exit(1);
   }
  fseek(f,1024+54,0);
  if (fread(&bmp, 1, 64000, f)!=64000)
   {
    printf("error: can't read data from %s.n 1.bmp");
    exit(1);
   }
  fclose(f);
  if ((f=fopen("1.bmp", "rb")) == NULL)
   {
    printf("error: file %s not found.n 1.bmp");
    exit(1);
   }
  fseek(f,54,0);
  if (fread(&p, 1, 1024, f)!=1024)
   {
    printf("error: can't read data from %s.n 1.bmp");
    exit(1);
   }
  fclose(f);
}

void apply_filter(char *dst, char *src, int *filter, int x, int y) {
  int i, j, o = x + 320 * y, *f = filter;
  char *d = dst + o, *s = src + o;

  for (i = 0; i < FILTERW; i++) {
    for (j = 0; j < FILTERH; j++) *d++ = *(s++ + *f++);
    d += (320 - FILTERW);
    s += (320 - FILTERW);
  }
}

void make_filter() {
  int i, j, i1, j1, v;
  double r, a, t0, t1;

  for (i = 0; i < FILTERW; i++)
    for (j = 0; j < FILTERH; j++) {
      r = sqrt(((double)i / FILTERW - 0.5) 
        * ((double)i / FILTERW - 0.5) +
        ((double)j / FILTERH - 0.5) * ((double)j / FILTERH - 0.5));
      if (r < 0.5) {
a = sp_Amp * pow(1 - 2 * r, sp_Pow);
i1 = (i - FILTERW_2) * cos(a) - (j - FILTERH_2) * sin(a) +
   FILTERW_2 - i;
j1 = (i - FILTERW_2) * sin(a) + (j - FILTERH_2) * cos(a) +
   FILTERH_2 - j;
v = i1 + j1 * 320;
      } else v = 0;
      filter[i + FILTERW * j] = v;
    }
}

void main () {
  int i = 0, x, y, f = 0, t;
  char c;

  make_filter();
  fload();
  setvmode(0x13);
  for(i=0;i<256;i++)
   {
    outp(0x3C8,i);
    outp(0x3C9,p[(i*4)+2] >> 2);
    outp(0x3C9,p[(i*4)+1] >> 2);
    outp(0x3C9,p[(i*4)+0] >> 2);
   }

  do {
    x = (1 + cos ((double)f / 13)) * (160 - FILTERW_2);
    y = (1 + sin ((double)f / 23)) * (100 - FILTERH_2);
    wait_retrace();
    wait_retrace();
    memcpy((char*)0xA0000L, (char*)&bmp, 64000);
    apply_filter((char*)0xA0000L, (char*)&bmp, (int*)&filter, x, y);
    f++;
    c = kbhit() ? getch() : 0;
  } while (c != 0x1B);
  setvmode(0x03);
  printf(" Coded by Misha Krivij");}
Сайт: www.rudocs.com






Просмотров: 1768

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную