Крутилки-вращалки
Тут приведены исходники всяких крутилок-вращалок. Написано очень давно, с целью разобраться с языком СИ. Достаточно красивый эффект получается если экспериментировать с вращаемым изображением.
В архиве находятся файлы 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, 0x3C8
out dx, al
inc 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, 320
imul dx
add ax, [X]
mov di, ax
push es
mov ax, 0xA000
mov es, ax
mov al,[Color]
stosb
pop 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,0x0013
asm int 0x10
for (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,0x0003
asm int 0x10
free(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, 0x3C8
out dx, al
inc 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,0x0013
asm int 0x10
for (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, ax
jl NoPlot;
cmp ax, 200
jg NoPlot;
mov dx, 320
imul dx
mov dx, [X]
add dx, [deltaY]
or dx, dx
jl NoPlot;
cmp dx, 319
jg NoPlot;
add ax, dx
mov di, ax
push es
mov ax, 0xA000
mov es, ax
mov al,[Color]
mov [es:di],al
pop 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,0x0003
asm int 0x10
free(str);
}
Download this code: rotate5.cpp
Комментарии