Крутилки-вращалки
Комментариев:
Тут приведены исходники всяких крутилок-вращалок. Написано очень давно, с целью разобраться с языком СИ. Достаточно красивый эффект получается если экспериментировать с вращаемым изображением.
В архиве находятся файлы rotate1.cpp-rotate6.cpp. Здесь приведены лишь два последних. Rotate5.cpp написан на СИ, а в rotate6.cpp внутренний цикл на ассемблере — разница в скорости очевидна.

Скриншот
rotate4.cpp
#include <stdio.h>#include <conio.h>#include <alloc.h>#include <process.h>#include <math.h>//################### Изменить один цвет палитры ############################void palette(unsigned char N,unsigned int R,unsigned int G,unsigned int B){asm {mov al, [N]mov dx, 0x3C8out dx, alinc dx //DX = 3C9h (Pal DATA REG)mov ax, [R]out dx, al //красная составляющаяmov ax, [G]out dx, al //зеленая составляющаяmov ax, [B]out dx, al //синяя составляющая}}void PutPixel(unsigned int X,unsigned int Y,unsigned char Color){asm {mov ax, [Y]mov dx, 320imul dxadd ax, [X]mov di, axpush esmov ax, 0xA000mov es, axmov al,[Color]stosbpop es}}void main(void){FILE *file1;char *str;char *filename;int I,J,I1,J1;int X,Y,Z,size;float A,sina,cosa;filename="A.BMP";if ((str = (char *) malloc(10000)) == NULL) printf("Память у вас скончалась :(((\n");if ((file1 = fopen(filename,"rb")) == NULL) fprintf(stderr,"Файл не найден :((((");size=fread(str,54,1,file1);size=fread(str,1024,1,file1);asm mov ax,0x0013asm int 0x10for (I=0;I<256;I++) palette(I,str[I*4+2]>>2,str[I*4+1]>>2,str[I*4+0]>>2);size=(fread(str,1,10000,file1));fclose(file1);A=0;do{for (I=0;I<100;I++){for (J=0;J<100;J++){I1=I-50;J1=J-50;sina=sin(A);cosa=1-tan(A)-sina;X=100+I1*sina-J1*cosa;Y=100+I1*cosa+J1*sina;Z=0;if ((X<320) && (Y<200) && (X>1) && (Y>1)) PutPixel(X+Z,Y+Z,str[J*100+I]);}}A=A+0.017;}while (!kbhit());asm mov ax,0x0003asm int 0x10free(str);}
Download this code: rotate4.cpp
rotate5.cpp
#include <stdio.h>#include <conio.h>#include <alloc.h>#include <process.h>#include <math.h>#include <dos.h>//################### Изменить один цвет палитры ############################void palette(unsigned char N,unsigned int R,unsigned int G,unsigned int B){asm {mov al, [N]mov dx, 0x3C8out dx, alinc dx //DX = 3C9h (Pal DATA REG)mov ax, [R]out dx, al //красная составляющаяmov ax, [G]out dx, al //зеленая составляющаяmov ax, [B]out dx, al //синяя составляющая}}void main(void){FILE *file1;char Color;char *str;char *filename;int I,J,I1,J1,DDX,DDY;int X,Y,Z,size,deltaX,deltaY;float A,sina,cosa;filename="A.BMP";if ((str = (char *) malloc(10000)) == NULL) printf("Память у вас скончалась :(((\n");if ((file1 = fopen(filename,"rb")) == NULL) fprintf(stderr,"Файл не найден :((((");fread(str,54,1,file1);fread(str,1024,1,file1);asm mov ax,0x0013asm int 0x10for (I=0;I<256;I++) palette(I,str[I*4+2]>>2,str[I*4+1]>>2,str[I*4+0]>>2);fread(str,1,10000,file1);fclose(file1);deltaY=100;deltaX=100;DDX=1;DDY=1;A=0;do{sina=sin(A);cosa=1-tan(A)-sin(A);for (I=0;I<100;I++){for (J=0;J<100;J++){I1=I-50;J1=J-50;X=I1*sina-J1*cosa;Y=I1*cosa+J1*sina;Color=str[J*100+I];asm {mov ax, [Y]add ax, [deltaX]or ax, axjl NoPlot;cmp ax, 200jg NoPlot;mov dx, 320imul dxmov dx, [X]add dx, [deltaY]or dx, dxjl NoPlot;cmp dx, 319jg NoPlot;add ax, dxmov di, axpush esmov ax, 0xA000mov es, axmov al,[Color]mov [es:di],alpop es}NoPlot:}}A=A+0.02;deltaX=deltaX+DDX;deltaY=deltaY+DDY;if (deltaX>150) DDX=-1;if (deltaY>270) DDY=-1;if (deltaX<50) DDX=1;if (deltaY<50) DDY=1;}while (!kbhit());asm mov ax,0x0003asm int 0x10free(str);}
Download this code: rotate5.cpp